流,管线等等.该对象在ArcGIS Engine中的模型图如下:
这并不意味着用户必须按照这种层次去构造polyline,实际上Point集合直接构成Polyline,组成Polyline的这些路径既可以是连续的,也可以是不连续的。
Polyline是有序path组成的集合,可以拥有M、Z和ID属性值,Polyline对象的IPointCollection接口包含了所有的节点信息,IGeometryCollection接口可以获取polyline的paths,ISegmentCollection接口可以获取 polyline的segments。
一个Polyline对象必须满足以下准则:
1.组成Polyline对象的所有Path对象必须是有效的。
2.组成Polyline对象的所有Path对象不能重合,相交或自相交。 3.组成Polyline对象的多个Path对象可以连接与某一点,也可以分离。 4.Path对象的长度不能为0.
IPolyline是Polyline类的主要接口,IPolyline的Reshape方法可以使用一个Path对象为一个Polyline对象整形,IPolyline的SimplifyNetwork方法用于简化网络。
Polyline对象可以使用IGeometryCollection接口添加Path对象的方法来创建,使用该接口需注意以下情况: 1.每一个Path对象必须是有效的,或使用IPath::Simplify方法后有效。
2.由于Polyline是Path对象的有序集合,所以添加Path对象时必须注意顺序和方向。
3.为了保证Polyline是有效的,可以创建完Polyline对象后使用ITopologicalOperator接口的Simplify方法。
下面代码片段演示了一个Polyline的构成:
private object pMissing = Type.Missing; public IGeometry GetPolylineGeometry() {
const double PathCount = 3; const double PathVertexCount = 3;
IGeometryCollection pGeometryCollection = new PolylineClass(); for (int i = 0; i < PathCount; i++) {
IPointCollection pPointCollection = new PathClass();
for (int j = 0; j < PathVertexCount; j++) {
pPointCollection.AddPoint(GetPoint(), ref pMissing, ref pMissing); }
pGeometryCollection.AddGeometry(pPointCollection as IGeometry, ref pMissing, ref pMissing); }
return pGeometryCollection as IGeometry; }
private IPoint GetPoint() {
const double Min = -10; const double Max = 10;
Random random = new Random();
double x = Min + (Max - Min) * random.NextDouble(); double y = Min + (Max - Min) * random.NextDouble(); return ConstructPoint(x, y); }
Segment,Path,Ring和Polyline的区别
在这四者当中Segment是最小的单位具体的构成路线可以分为两个条: Segment-Path-Ring(封闭的Path) Segment-Path-Polyline
我们可以这样说Segment是Path,只不过是这个Path由一个Segment组成,Ring也是一种Path,只不过是一个起点和终点重合的Path,至于Polyline那就很明显了,他们的区别可以从下图看出:
Polygon对象
Polylgon对象是由一个或多个Ring对象的有序集合,它可以是由单个Ring 对象构成,也可以使用多个Ring组成。Polygon通常用来代表有面积的多边形矢量对象,如行政区,建筑物等。Polygon的组成结构可以看下图:
从这个图上可以看出 Polygon是由Rings构成,而Ring又是又Segment构成,但是这并不意味着用户必须按照这种层次去构造Polygon,实际上用Point的集合可以构成Polygon.
///
///
public IPolygon CreatePolygonByPoints(IPointCollection pPointCollection) {
IGeometryBridge2 pGeometryBridge2 = new GeometryEnvironmentClass(); IPointCollection4 pPolygon = new PolygonClass();
WKSPoint[] pWKSPoint = new WKSPoint[pPointCollection.PointCount]; for (int i = 0; i < pPointCollection.PointCount; i++) {
pWKSPoint[i].X = pPointCollection.get_Point(i).X; pWKSPoint[i].Y = pPointCollection.get_Point(i).Y; }
pGeometryBridge2.SetWKSPoints(pPolygon, ref pWKSPoint); IPolygon pPoly= pPolygon as IPolygon; pPoly.close(); return pPoly; }
组成Polygon的是Ring,其中Ring可以分为Outer Ring(外环)和Inner Ring(内环)之分。外环和内环都是有方向的,它们的区别是外环的方向是顺时针的,内环的方向是逆时针。
Polygon对象实现了一个接口IArea,而该接口用来对Poylgon的中心,重心,以及面积进行访问,下面片段用来获取Polygoe的面积: IArea pArea = pPolygon as IArea; Double S= pArea. Area
IGeometryCollection接口
通过IGeometryCollection创建一个Polygon对象的代码片段如下:
private IPolygon ConstructorPolygon(List
IGeometryCollection pGCollection = new PolygonClass(); object o = Type.Missing;
for (int i = 0; i < pRingList.Count; i++) {
//通过IGeometryCollection接口的AddGeometry方法向Polygon对象中添加Ring子对象 pGCollection.AddGeometry(pRingList[i], ref o, ref o); }
//QI至ITopologicalOperator
ITopologicalOperator pTopological = pGCollection as ITopologicalOperator; //执行Simplify操作 pTopological.Simplify();
IPolygon pPolygon = pGCollection as IPolygon; //返回Polygon对象 return pPolygon; }