线要素是是一个1维的空间数据,每个线要素一组单线(paths),每条单线包含着一组点(n≥2)。
这里与OGC、JTS不同的是,Esri更喜欢用一个Polyline表示多线元素,单线 = 只有一个元素的多线,而不喜欢把Line和MultiLine单独分开。
线要素由一组点要素组成,这些点要素被分为三类:
Boundary: 边界点
Interior: 内部点
Exterior: 外部点
如图:
边界点就是 线要素的开始点和结束点;
内部点就是 线要素上非开始点和结束点的其他点;
外部点就是 非内部点且非边界点的点集.
那么比较复杂的线要素是怎么判断这三种点呢?
例如:
这里绿色点连接着4条线段,是偶数,所以它不是边界点
这里绿色点连接着5条线段,是奇数,所以它是边界点。
此外还有一个特殊概念Valid polyline(OGC\JTS里面叫LinearRing)
Valid polyline:
1. Valid polyline是一条线段(n≥2)
2. Valid polyline是简单曲线(线段不会自相交)
Polyline 的初始定义:(这个跟之前Point大同小异我把它放在最后了,有需要请拉到下面)
Polyline 的常用方法:
新增:
p1.startPath(6.15, 8.0); //开始勾勒单线
p1.lineTo(7.15, 9.0); //勾勒下一个点
p1.add(p2, true); //在P1后面新增另一个Polyline(P2)的全部单线
p1.addPath(p2,0,true); //在P1后面新增另一个Polyline(P2)第“0”个单线
p1.addEnvelope(e,true); //在P1后面新增另一个Envelope
p1.addSegmentsFromPath(p2,0,1,2,true); //在p1最后一个单线后面加入p2第0个单线的,从第1个点开始延伸2个点的这个线段
以上true/false表示顺时针/逆时针输入
对 Polyline 整体的处理:
p1.equals(p2) //判断是否拓扑相等
p1.getDimension(); //判断维度
p1.calculateLength2D(); //计算长度(°)(仅限WGS84坐标系下)
p1.copyTo(p2); //复制到p2
p1.isEmpty(); //判断是否为空
Transformation2D transformation = new Transformation2D();
p1.applyTransformation( transformation ); //做二维仿射变换
p1.estimateMemorySize(); //判断内存
对 Polyline 中 Envelope 的处理:
p1.queryEnvelope(e); //查询p1中所有的Envelope
对 Polyline 中内部单线(path)的处理:
p1.getPathCount(); //单线数量
p1.getPathStart(0); //获得所有单线开始点
p1.getPathEnd(0); //获得所有单线结束点(流向图经常用他们)
p1.getBoundary(); //得到Boundary(这里是开始点+结束点),对点要素来说是自身,对面要素来说是轮廓线
p1.getPathIndexFromPointIndex(0); //读取第0条单线
p1.getPathSize(0); //读取第0条单线的节点数
p1.calculatePathLength2D(0); //读取第0条单线的二维长度(°)(WGS84)
p1.isClosedPath(0); //将第“0”条单线闭合(多用于成面)
p1.closeAllPaths(); //将所有单线闭合
p1.closePathWithLine(); //...
p1.removePath(0); //删除第0条单线
对 Polyline 中内部单线(path)内线段(Segment)的处理:
SegmentIterator b = p1.querySegmentIterator(); //线段遍历器
对 Polyline 中点的处理:
p1.getPointCount(); //点个数
p1.vertex_count(p1); //顶点个数
Point[] pz = new Point[p1.getPointCount()];
p1.queryCoordinates(pz); //读取所有点到点数组pz中
p1.getPoint(0); //读取某个点
p1.removePoint(0,0); //删除点(0,0)
附:
Polyline 的初始定义:
1 static Polyline createPolyline1() { 2 3 Polyline line = new Polyline(); 4 5 // Path 1 6 line.startPath(6.9, 9.1); 7 line.lineTo(7, 8.8); 8 9 // Path 2 10 line.startPath(6.8, 8.8); 11 line.lineTo(7, 9); 12 line.lineTo(7.2, 8.9); 13 line.lineTo(7.4, 9); 14 15 // Path 3 16 line.startPath(7.4, 8.9); 17 line.lineTo(7.25, 8.6); 18 line.lineTo(7.15, 8.8); 19 20 return line; 21 }
2.读取JSON数据
OperatorImportFromJson.local().executeexecute(Geometry.Type type, String string);
Type :Geometry.Type寻找,这里是polyline
string :JSON字符串
1 static Polyline createPolygonFromJson() throws JsonParseException, IOException { 2 3 String jsonString = "{\"paths\":[[[6.8,8.8],[7,9],[7.2,8.9],[7.4,9]]," 4 + "[[7.4,8.9],[7.25,8.6],[7.15,8.8]],[[6.9, 9.1],[7, 8.8]]]," 5 + "\"spatialReference\":{\"wkid\":4326}}"; 6 7 MapGeometry mapGeom = OperatorImportFromJson.local().execute(Geometry.Type.Polyline, jsonString); 8 9 return (Polyline)mapGeom.getGeometry(); 10 }
3.读取GeoJSON数据
OperatorImportFromGeoJson.local().execute(int importFlags, Geometry.Type type, String geoJsonString, ProgressTracker progressTracker);
importFlags :
geoJsonImportDefaults = 0; 默认WGS84坐标系
geoJsonImportNonTrusted = 2; 不可信点
geoJsonImportSkipCRS = 8; 跳过CRS
geoJsonImportNoWGS84Default = 16; 非WGS84坐标系
type :Geometry.Type寻找,这里是polyline
geoJsonString :GeoJSON字符串
progressTracker :null
1 static Polyline createPolylineFromGeoJson() throws JsonParseException, IOException { 2 3 String geoJsonString = "{\"type\":\"MultiLineString\"," 4 + "\"coordinates\":[[[6.8,8.8],[7,9],[7.2,8.9],[7.4,9]]," 5 + "[[7.4,8.9],[7.25,8.6],[7.15,8.8]],[[6.9, 9.1],[7, 8.8]]]," 6 + "\"crs\":\"EPSG:4326\"}"; 7 8 MapGeometry mapGeom = OperatorImportFromGeoJson.local().execute(GeoJsonImportFlags.geoJsonImportDefaults, Geometry.Type.Polyline, geoJsonString, null); 9 10 return (Polyline)mapGeom.getGeometry(); 11 }
4.读取WKT数据
OperatorImportFromWkt.local().execute(int import_flags, Geometry.Type type,String wkt_string, ProgressTracker progress_tracker);
import_flags :同上
Type :同上
wkt_string :WKT字符串
progressTracker :null
1 static Polyline createPolylineFromWKT() throws JsonParseException, IOException { 2 3 String wktString = "MULTILINESTRING ((6.9 9.1,7 8.8),(6.8 8.8,7 9,7.2 8.9,7.4 9),(7.4 8.9,7.25 8.6,7.15 8.8))"; 4 Geometry geom = OperatorImportFromWkt.local().execute(WktImportFlags.wktImportDefaults, Geometry.Type.Polyline, wktString, null); 5 6 return (Polyline)geom; 7 } 8 }
参考:
http://esri.github.io/geometry-api-java/doc/Polyline.html
http://esri.github.io/geometry-api-java/javadoc/com/esri/core/geometry/Polyline.html
Esri geometry api java 学习文档 (3) 线、多线 (Polyline)
原文:https://www.cnblogs.com/17th-trackwalker/p/10301613.html