使用ArcGIS Java SDK的圆形/矩形形状图

问题描述 投票:-1回答:2

所以我一直在使用ArcGIS Java SDK 100.6.0开发与地图相关的桌面应用程序(在JavaFX中)。我想在地图上绘制某些形状并保存。我看过文档,据我所知他们提供了SketchEditor类用于在地图上绘制。类对象允许我在地图上绘制徒手画,折线和多边形。我的应用程序需要完整的绘图功能才能绘制各种形状。这堂课不允许我画正方形,长方形,圆形。我的问题是如何在地图视图上绘制这些形状。除了SketchEditor可用的图形外,没有其他人想出任何方法来绘制图形。

编辑:我想我的问题还不够清楚。我只分享我的应用程序需要什么以及我可以实际实现的内容:

These are are the shapes that i want my application to support

These are the shapes that ArcGIS Java SDK currently supports

现在,我已经从此链接中找到了解决圆圈的方法:

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

现在剩下的形状是矩形/正方形。我希望有人可以分享他们如何用Java解决此问题。

javafx drawing desktop-application arcgis-runtime
2个回答
1
投票

听起来您想创建图形叠加层。正方形,矩形,圆形=多边形。但是,您可以创建选项以将正方形或圆形标记符号添加为点,然后允许用户缩放符号以使其更大或更小。

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


1
投票

我试图找到解决这些不受支持的形状的方法。结果发现,通过使用多边形几何图形并给出正确的点,我可以创建这些形状(圆形,正方形,矩形)。这是显示我如何绘制这些形状的代码片段(返回形状的图形对象的方法):

圆圈

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;
}

我能够使用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);
}

这可能包含未优化的代码逻辑,但是,这就是我们现在使用ArcGIS Java SDK 100.6.0所拥有的全部。任何编辑和建议,将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.