Esri geometry api java 学习文档 (4) 面、多面 (Polygon)
面要素Polygon是是一个2维的空间数据,每个面要素一组环(Ring),每条环包含着一组点(n≥2)。
与Polyline相同, 面要素Polygon同样属于Geometry类中的MultiVertexGeometry(多顶点形状)中的MultiPath(多线),与Polyline不同的是Polygon的基础单位是Ring
Ring指构成Polygon的环(首尾相连),也同样是Polygon的边界(Boundary),当Polygon参与比较时实际上是它的边界参与了比较。
Ring的分为:
outer ring (外边界) ,外边界顺时针标绘,分割外部和内部
inner rings(内边界),内边界逆时针标绘,分割内部和孔洞
严格按照顺逆时针的意义在于:保证前进方向的右边是内部,前进方向的左边是外界。
构建多边形的时候需要注意自相交和悬空线,他们都让图形出现共有线(面),会对奇偶判断造成错误。
共有点不会对奇偶判断造成影响。
注意,精度小到一定程度的时候也会被认为是共线。
Polygon 的特殊方法:
p1.getExteriorRingCount(); //读取外边界数量
p1.isExteriorRing(0); //判断第0条是否为外边界
p1.setFillRule(int rule); //设置填充规则
p1.getFillRule(); //读取填充规则
0:奇偶规则判断填充
1:非零环绕数规则判断填充
判断规则可见https://blog.csdn.net/jianloubang5433/article/details/52094437
Polygon 的常用方法:Polygon也属于Geometry下的MultiVertexGeometry
想看Geometry几何通用方法去扒:https://blog.csdn.net/wtr1717/article/details/87871204
想看MultiVertexGeometry多顶点形通用方法去扒:https://blog.csdn.net/wtr1717/article/details/87871206
下面也写几个常用的吧:
新增:
p1.startPath(6.15, 8.0); //开始勾勒单线
p1.lineTo(7.15, 9.0); //勾勒下一个点
p1.add //在P1后面新增另一个Polygon(P2)的全部单线
p1.addEnvelope; //在P1后面新增另一个Envelope
p1.addPath; //在P1后面新增另一个Polyline(P2)第“0”个单线
setXY(int i, double x, double y); //为polygon在i处新增一个顶点
对 Polygon 整体的处理:
p1.getType(); //返回类型
p1.equals(p2) //判断是否拓扑相等
p1.getDimension(); //判断维度
p1.copyTo(p2); //整体复制p1到p2
Transformation2D transformation = new Transformation2D();
p1.applyTransformation( transformation ); //做二维仿射变换
p1.isEmpty(); //判断是否为空
p1.setEmpty(); //p1置空
p1.estimateMemorySize(); //判断内存
对 Polygon 内部 Ring 的处理:
p1.calculateRingArea2D(0); //计算第0条环的面积(°²)(WGS84)
p1.getExteriorRingCount(); //读取外边界数量
p1.isExteriorRing(0); //判断第0条是否为外边界
p1.getBoundary(); //读取所有边界环
p1.getPathCount(); //读取所有边界数量
p1.calculatePathLength2D(0); //读取第0条环的二维长度(°)(WGS84)
p1.getPathIndexFromPointIndex(0);//读取第0个点在哪个环上
p1.getPathSize(0); //读取环长度
p1.reversePath(0); //逆序第0条环
p1.removePath(0); //删除第0条环
对 Ring 内部 Point 的处理:
Point[] pz = new Point[p1.getPointCount()];
p1.queryCoordinates(pz); //读取所有点到点数组pz中
p1.getPointCount(); //读取总点数
p1.getPoint(0); //取出某个点位
p1.removePoint(0,0); //删除点(0,0)
线段处理:
p1.getSegmentCount(); //得到线段数
Envelope 处理:
p1.queryEnvelope(); //读取所有Envelope
附:
Polygon 的初始定义:
1 public static Polygon createPolygon1()
2 {
3 Polygon poly = new Polygon();
4
5 // clockwise => outer ring
6 poly.startPath(0, 0);
7 poly.lineTo(-0.5, 0.5);
8 poly.lineTo(0.5, 1);
9 poly.lineTo(1, 0.5);
10 poly.lineTo(0.5, 0);
11
12 // hole
13 poly.startPath(0.5, 0.2);
14 poly.lineTo(0.6, 0.5);
15 poly.lineTo(0.2, 0.9);
16 poly.lineTo(-0.2, 0.5);
17 poly.lineTo(0.1, 0.2);
18 poly.lineTo(0.2, 0.3);
19
20 // island
21 poly.startPath(0.1, 0.7);
22 poly.lineTo(0.3, 0.7);
23 poly.lineTo(0.3, 0.4);
24 poly.lineTo(0.1, 0.4);
25
26 return poly;
27 }
2.读取JSON数据:
MapGeometry mapGeom = OperatorImportFromJson.local().execute(Geometry.Type.Polygon, jsonString);
3.读取GeoJSON数据:
MapGeometry mapGeom = OperatorImportFromJson.local().execute(Geometry.Type.Polygon, jsonString);
3.读取GeoJSON数据:
MapGeometry mapGeom = OperatorImportFromGeoJson.local().execute(GeoJsonImportFlags.geoJsonImportDefaults, Geometry.Type.Polygon, geoJsonString, null);
4.读取WKT数据
4.读取WKT数据
Geometry geom = OperatorImportFromWkt.local().execute(WktImportFlags.wktImportDefaults, Geometry.Type.Polygon, wktString, null);
参考:
http://esri.github.io/geometry-api-java/doc/Polygon.html
http://esri.github.io/geometry-api-java/javadoc/com/esri/core/geometry/Polygon.html