【问题标题】:Circle/Rectangle Shapes Drawing using ArcGIS Java SDK使用 ArcGIS Java SDK 绘制圆形/矩形形状
【发布时间】:2020-04-29 21:38:21
【问题描述】:

所以我一直在使用 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


    【解决方案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

    【讨论】:

    • 这是我可以采取的一种方法。但是,我不确定是否可以将 MarkerSymbols 用作形状,以及是否可以为内部形状着色并且轮廓不同。不过感谢您的回答。
    【解决方案2】:

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

    圈子

    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 所拥有的全部内容。任何编辑和建议将不胜感激。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2022-08-06
      • 1970-01-01
      相关资源
      最近更新 更多