面要素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.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
p1.setFillRule(int rule); //设置填充规则
p1.getFillRule(); //读取填充规则
0:奇偶规则判断填充
1:非零环绕数规则判断填充
判断规则可见https://blog.csdn.net/jianloubang5433/article/details/52094437
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 = OperatorImportFromGeoJson.local().execute(GeoJsonImportFlags.geoJsonImportDefaults, Geometry.Type.Polygon, geoJsonString, null);
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