Рисование круговых / прямоугольных фигур с использованием ArcGIS Java SDK - PullRequest
0 голосов
/ 13 января 2020

, поэтому я работал над приложением, связанным с картой (в JavaFX), используя ArcGIS Java SDK 100.6.0. Я хочу нарисовать определенные фигуры на карте и сохранить их. Я видел документацию и насколько я знаю, они предоставляют класс SketchEditor для рисования на карте. Объект класса позволяет рисовать от руки, полилинии и многоугольники на карте. Мое приложение требует полной функции рисования для рисования различных форм. Этот класс не позволяет мне рисовать квадраты, прямоугольники, круги. Мой вопрос заключается в том, как я могу нарисовать эти фигуры на моем виде на карте. Кто-нибудь когда-нибудь приходил с идеей рисовать фигуры отдельно от доступных SketchEditor.

Редактировать: я думаю, что мой вопрос недостаточно ясен. Я просто поделюсь тем, что требует мое приложение и что я могу реально реализовать:

Это формы, которые я хочу, чтобы мое приложение поддерживало

Эти те формы, которые ArcGIS Java SDK в настоящее время поддерживает

Теперь я нашел обходной путь для круга по этой ссылке:

https://gis.stackexchange.com/questions/26636/draw-a-circle-in-arcgis-map

Теперь оставшиеся фигуры имеют форму прямоугольника / квадрата. Я надеюсь, что кто-то может поделиться, как они решили эту проблему в Java.

Ответы [ 2 ]

1 голос
/ 21 января 2020

Я пытался найти обходные пути для рисования этих неподдерживаемых фигур. Было обнаружено, что используя геометрию многоугольника и задавая правильные точки, я могу создавать эти фигуры (Круг, Квадрат, Прямоугольник). Вот фрагмент кода, который показывает, как мне удалось нарисовать эти фигуры (методы, которые возвращают объект 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. Будем благодарны за любые изменения и предложения.

1 голос
/ 14 января 2020

Звучит так, как будто вы хотите создать графические c оверлеи. Квадраты, прямоугольники, круги = многоугольники. Тем не менее, вы можете создать опцию, чтобы добавить квадратные или круглые символы маркера в виде точек, а затем позволить пользователю масштабировать символы, чтобы сделать их больше или меньше.

https://developers.arcgis.com/labs/net/display-point-line-and-polygon-graphics/ https://developers.arcgis.com/java/10-2/guide/add-graphics-and-text-to-graphic-overlays.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...