面要素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