Circle/Rectangle 使用 ArcGIS 绘制形状 Java SDK
Circle/Rectangle Shapes Drawing using ArcGIS Java SDK
所以我一直在使用 ArcGIS Java SDK 100.6.0 开发与地图相关的桌面应用程序(在 JavaFX 中)。我想在地图上绘制某些形状并保存它们。我看过文档,据我所知,它们提供了 SketchEditor
class 用于在地图上绘图。 class 对象允许我在地图上徒手绘制、折线和多边形。我的应用程序需要一个完整的绘图功能来绘制各种形状。 class 不允许我画正方形、长方形、圆形。我的问题是如何在我的地图视图上绘制这些形状。有没有人想出任何想法来绘制不同于 SketchEditor
可用形状的形状。
编辑:我觉得我的问题不够清楚。我将分享我的应用程序需要什么以及我可以实际实现什么:
These are are the shapes that i want my application to support
These are the shapes that ArcGIS Java SDK currently supports
现在我从这个 link:
找到了 circle 的解决方法
https://gis.stackexchange.com/questions/26636/draw-a-circle-in-arcgis-map
现在剩下的形状是rectangle/square。我希望有人可以在 Java.
中分享他们如何解决这个问题
听起来您想创建图形叠加层。正方形、长方形、圆形 = 多边形。但是,您可以创建选项以将方形或圆形标记符号添加为点,然后允许用户缩放符号以使其变大或变小。
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
我试图找到绘制那些不受支持的形状的解决方法。人们发现,通过使用多边形几何体,并通过给出正确的点,我可以创建那些形状(圆形、方形、矩形)。这是显示我如何绘制这些形状的代码片段(return 图形对象的方法):
圆形
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 的全部内容。如有任何修改和建议,我们将不胜感激。
所以我一直在使用 ArcGIS Java SDK 100.6.0 开发与地图相关的桌面应用程序(在 JavaFX 中)。我想在地图上绘制某些形状并保存它们。我看过文档,据我所知,它们提供了 SketchEditor
class 用于在地图上绘图。 class 对象允许我在地图上徒手绘制、折线和多边形。我的应用程序需要一个完整的绘图功能来绘制各种形状。 class 不允许我画正方形、长方形、圆形。我的问题是如何在我的地图视图上绘制这些形状。有没有人想出任何想法来绘制不同于 SketchEditor
可用形状的形状。
编辑:我觉得我的问题不够清楚。我将分享我的应用程序需要什么以及我可以实际实现什么:
These are are the shapes that i want my application to support
These are the shapes that ArcGIS Java SDK currently supports
现在我从这个 link:
找到了 circle 的解决方法https://gis.stackexchange.com/questions/26636/draw-a-circle-in-arcgis-map
现在剩下的形状是rectangle/square。我希望有人可以在 Java.
中分享他们如何解决这个问题听起来您想创建图形叠加层。正方形、长方形、圆形 = 多边形。但是,您可以创建选项以将方形或圆形标记符号添加为点,然后允许用户缩放符号以使其变大或变小。
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
我试图找到绘制那些不受支持的形状的解决方法。人们发现,通过使用多边形几何体,并通过给出正确的点,我可以创建那些形状(圆形、方形、矩形)。这是显示我如何绘制这些形状的代码片段(return 图形对象的方法):
圆形
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 的全部内容。如有任何修改和建议,我们将不胜感激。