Я пытался найти обходные пути для рисования этих неподдерживаемых фигур. Было обнаружено, что используя геометрию многоугольника и задавая правильные точки, я могу создавать эти фигуры (Круг, Квадрат, Прямоугольник). Вот фрагмент кода, который показывает, как мне удалось нарисовать эти фигуры (методы, которые возвращают объект Graphi c для фигур):
Круг
public static Graphic drawFullCircle(Point centerPoint, double radius, int borderColor) {
int ptCount = 240;
double slice = 2 * Math.PI / ptCount;
PointCollection pc = new PointCollection(SpatialReferences.getWgs84());
for (int i = 0; i <= ptCount; i++) {
double rad = slice * i;
double px = centerPoint.getX() + radius * Math.cos(rad);
double py = centerPoint.getY() + radius * Math.sin(rad);
pc.add(new Point(px, py));
}
Polygon poly = new Polygon(new PartCollection(pc));
SimpleFillSymbol sfs = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, 0x00FFFFFF, new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, borderColor, 1.5f));
Graphic g = new Graphic(poly, sfs);
return g;
}
Я смог нарисовать прямоугольные angular фигуры, используя геометрию Envelop
.
Прямоугольник
public static Graphic drawRectangle(Point p1, Point p2, int borderColor) {
Envelope envelope = new Envelope(p1, p2); // start (p1) and end (p2) points of a diagonal
PointCollection pc = new PointCollection(SpatialReferences.getWgs84());
pc.add(new Point(envelope.getXMin(), envelope.getYMin()));
pc.add(new Point(envelope.getXMax(), envelope.getYMin()));
pc.add(new Point(envelope.getXMax(), envelope.getYMax()));
pc.add(new Point(envelope.getXMin(), envelope.getYMax()));
Polygon poly = new Polygon(new PartCollection(pc));
SimpleFillSymbol sfs = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, 0x00FFFFFF, new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, borderColor, 1.5f));
return new Graphic(poly, sfs);
}
Квадрат
public static Graphic drawSquare(Point p1, Point p2, int borderColor) {
Envelope rectEnvelope = new Envelope(p1, p2); start (p1) and end (p2) points of a diagonal
PointCollection pc = new PointCollection(SpatialReferences.getWgs84());
// these conditions make sure that the square is created from the start point and not from any other point.
if(rectEnvelope.getWidth() > rectEnvelope.getHeight())
{
if(p2.getX() > p1.getX())
{
pc.add(new Point(rectEnvelope.getXMin(), rectEnvelope.getYMin()));
pc.add(new Point(rectEnvelope.getXMin()+rectEnvelope.getHeight(), rectEnvelope.getYMin()));
pc.add(new Point(rectEnvelope.getXMin()+rectEnvelope.getHeight(), rectEnvelope.getYMax()));
pc.add(new Point(rectEnvelope.getXMin(), rectEnvelope.getYMax()));
}
else
{
pc.add(new Point(rectEnvelope.getXMax()-rectEnvelope.getHeight(), rectEnvelope.getYMax()-rectEnvelope.getHeight()));
pc.add(new Point(rectEnvelope.getXMax(), rectEnvelope.getYMin()));
pc.add(new Point(rectEnvelope.getXMax(), rectEnvelope.getYMax()));
pc.add(new Point(rectEnvelope.getXMax()-rectEnvelope.getHeight(), rectEnvelope.getYMax()));
}
}
else
{
if(p2.getY() > p1.getY())
{
pc.add(new Point(rectEnvelope.getXMin(), rectEnvelope.getYMin()));
pc.add(new Point(rectEnvelope.getXMax(), rectEnvelope.getYMin()));
pc.add(new Point(rectEnvelope.getXMax(), rectEnvelope.getYMin()+rectEnvelope.getWidth()));
pc.add(new Point(rectEnvelope.getXMin(), rectEnvelope.getYMin()+rectEnvelope.getWidth()));
}
else
{
pc.add(new Point(rectEnvelope.getXMin(), rectEnvelope.getYMax()-rectEnvelope.getWidth()));
pc.add(new Point(rectEnvelope.getXMax(), rectEnvelope.getYMax()-rectEnvelope.getWidth()));
pc.add(new Point(rectEnvelope.getXMax(), rectEnvelope.getYMax()));
pc.add(new Point(rectEnvelope.getXMin(), rectEnvelope.getYMax()));
}
}
Polygon poly = new Polygon(new PartCollection(pc));
SimpleFillSymbol sfs = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, 0x00FFFFFF, new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, borderColor, 1.5f));
return new Graphic(poly, sfs);
}
Это может содержать неоптимизированную логику кода c, но это все, что мы имеем сейчас с ArcGIS Java SDK 100.6.0. Будем благодарны за любые изменения и предложения.