轉載自: http://bbs.esrichina-bj.cn/ESRI/thread-48168-1-1.html
空間分析功能是GIS的主要功能之一,本章將為讀者介紹一些GIS開發常用的功能涉及到的空間拓撲運算,空間關系運算,空間臨近運算所使用到的接口。例如開發一個緩沖區分析功能,獲取兩個幾何要素的最短距離,判斷兩個幾何要素的拓撲關系等都需要使用到這些接口,使用這些接口可以極大提高開發者的開發效率。
1.1目標
1.熟悉ITopologicalOperator接口(用於空間拓撲運算)的使用
2.熟悉IRelationalOperator接口(用於空間關聯運算)的使用
3.熟悉IProximityOperator接口(用於空間距離運算)的使用
1.2准備工作
1.IDE:Visual Studio 2005/2008
2.ArcGIS Engine Developer kit 9.3
1.1 ITopologicalOperator接口1.1.1 ITopologicalOperator接口簡介ITopologicalOperator接口用來通過對已存在的幾何對象做空間拓撲運算以產生新的結合對象。實現該接口的類有Point,Multipoint,Polyline,Polygon,MultiPatch這些都是高級幾何對象,另外 GeometryBag也實現了該接口,低級的構建幾何對象如Segments(Line,Circular Arc,Elliptic Arc,Bezier Curve),Paths或者Rings如果想使用該接口需包裝成高級幾何對象。
ITopologicalOperator接口在GIS開發中使用非常廣泛,通常GIS系統中緩沖區分析,裁剪幾何圖形,幾何圖形差分操作,幾何圖形合並操作等都需要使用此接口。下表是ITopologicalOperator接口主要的方法說明:
方法名稱 | 說明 |
Boundary | 幾何圖形對象的邊界 |
Buffer | 對幾何圖形對象進行緩沖區空間拓撲操作 |
Clip | 對幾何圖形對象進行裁剪空間拓撲操作 |
ConstructUnion | 高效的合並多個枚舉幾何對象與單個幾何對象合並為單個幾何對象,這對於大量幾何對象的合並非常高效 |
ConvexHull | 構建幾何對象的凸邊形 |
Cut | 切割幾何對象 |
Difference | 一個幾何圖形減去它與另一個幾何圖形相交的部分 |
Intersect | 兩個同維度幾何對象的交集部分 |
Simplify | 使幾何對象拓撲一致 |
SymmetricDifference | 對稱差分將兩個幾何圖形的並集部分減去兩個幾何圖形交集的部分 |
Union | 合並兩個同維度的幾何對象為單個幾何對象 |
1. Boundary屬性
如圖所示Polygon幾何對象的Boundary是組成它的Polyline幾何對象
Polyline幾何對象的[Boundary是組成它的頂點Point幾何對象
而Point幾何對象的Boundary是空對象,示意圖如下圖所示:
下載 (20.15 KB)
2009-6-15 09:12
2.Buffer方法:
Buffer方法可以給一個高級幾何對象產生一個緩沖區,無論是Polygon,Polyline,Point它們的緩沖區都是具有面積的幾何對象,如下圖所示:
下載 (11.73 KB)
2009-6-15 09:12
3.Clip方法
Clip方法可以將用一個Envelope對象對一個幾何對象進行裁剪,參見結果是幾何對象被Envelope 對象所包圍的部分如圖所示:
下載 (16.11 KB)
2009-6-15 09:12
4.ConvexHull方法
ConvexHull方法可以產生一個幾何圖形的最小的邊框凸多邊形(沒有凹面包含幾何圖形的最小多邊形)
下載 (11.54 KB)
2009-6-15 09:12
5.Cut方法
Cut方法不支持GeometryBags幾何對象,它可以指定一條切割曲線和一個幾何圖形,經過切割運算后把幾何圖形分為左右兩部分,做,右兩部分是相對曲線的方向而言。點與多點不能被切割,Polyline和Polygon只有與切割曲線相交時才能執行Cut方法,如下圖:
下載 (10.03 KB)
2009-6-15 09:12
6.Difference方法
Difference方法用於產生兩個幾何對象的差集。如圖所示:
下載 (10.61 KB)
2009-6-15 09:12
7.Union方法和ConstructUnion都用於合並幾何對象,所不同的是前者合並兩個同維度的幾何對象為單個幾何對象,而后者是高效的合並多個枚舉幾何對象與單個幾何對象合並為單個幾何對象,這對於大量幾何對象的合並非常高效的。
下載 (5.69 KB)
2009-6-15 09:12
8.Intersect方法
Intersect方法用於返回兩個同維度幾何對象的交集,即兩個幾何對象的重合部分。如下圖所示:
下載 (8.04 KB)
2009-6-15 09:12
9.SymetricDifference方法
SymetricDifference方法用於產生兩個幾何圖形的對稱差分,即兩個幾何的並集部分減去兩個幾何的交集部分,如下圖所示:
下載 (12.38 KB)
2009-6-15 09:12
10.IsSimple屬性和Simplify方法
IsSimple屬性用於檢測幾何對象是否是拓撲正確即為簡化幾何對象,而Simplify方法用於簡化幾何對象使幾何對象的拓撲正確。如下圖所示:
下載 (50.01 KB)
2009-6-15 09:12
-
image001.png (20.15 KB)
下載次數:4
2009-6-15 09:12
-
image003.png (11.73 KB)
下載次數:3
2009-6-15 09:12
-
image005.png (16.11 KB)
下載次數:3
2009-6-15 09:12
-
image007.png (11.54 KB)
下載次數:1
2009-6-15 09:12
-
image009.png (10.03 KB)
下載次數:3
2009-6-15 09:12
-
image011.png (10.61 KB)
下載次數:3
2009-6-15 09:12
-
image013.png (5.69 KB)
下載次數:6
2009-6-15 09:12
-
image015.png (8.04 KB)
下載次數:4
2009-6-15 09:12
6.3.2簡化幾何對象功能開發
在開發對幾何對象空間分析時,所操作的幾何對象必須是簡化的幾何對象,以下代碼片段演示了如何使一個幾何對象在拓撲上一致,例如在一個 PointCollection對象中移除所有的重合點;對於segmentCollection移除所有重合線段,而相交的線段會變成非相交線段(即在相交處產生一個頂點);對於Polygon所有相交的環將被移除,未封閉的環將被封閉。
- /// <summary>
- /// 簡化幾何對象
- /// </summary>
- /// <param name="pGeometry">幾何對象</param>
- private void SimplifyGeometry(IGeometry pGeometry)
- {
- try
- {
- ITopologicalOperator pTopOperator = pGeometry as ITopologicalOperator;
- if (pTopOperator != null)
- {
- if (!(pTopOperator.IsKnownSimple))
- {
- if (!(pTopOperator.IsSimple))
- {
- pTopOperator.Simplify();
- }
- }
- }
- }
- catch (Exception Err)
- {
- MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
- }
- }
復制代碼
6.4 IRelationalOperator接口
6.4.1 IRelationalOperator接口簡介幾何對象之間都存在某種關聯關系,如包含,相等,在內部,相交,疊加等。這些關聯關系的獲得都可以通過 IRelationalOperator接口來獲得,關系運算是在兩個幾何對象間進行的,通過IRelationalOperator的某一個方法返回一個布爾值來說明這兩個幾何對象是否有這種關系。所有支持ITopologicaloperator的幾何對象的類也實現了 IRelationalOperator接口,其中包括Envelope對象,這意味着還可以對兩個幾何對象的Envelope進行關聯關系檢查。
方法名稱 | 描述 |
Contains | 檢查兩個幾何圖形幾何圖形1是否包含幾何圖形2 |
Crosses | 用於檢測兩個幾何圖形是否相交 |
Equal | 用於檢測兩個幾何圖形是否相等 |
Touches | 用於檢測兩個幾何圖形是否相連 |
Disjoint | 用於檢測兩個幾何圖形是否不相交 |
Overlaps | 用於檢測兩個幾何圖形是否有重疊 |
Relation | 用於檢測是否存在定義relationship |
Within | 檢查兩個幾何圖形幾何圖形1是否被包含於幾何圖形2 |
6.4.2判斷幾何對象包含關系功能開發 以下代碼片段演示如何判斷幾何圖形A是否包含幾何圖形B:
- /// <summary>
- /// 檢測幾何圖形A是否包含幾何圖形B
- /// </summary>
- /// <param name="pGeometryA">幾何圖形A</param>
- /// <param name="pGeometryB">幾何圖形B</param>
- /// <returns>True為包含,False為不包含</returns>
- private bool CheckGeometryContain(IGeometry pGeometryA, IGeometry pGeometryB)
- {
- IRelationalOperator pRelOperator = pGeometryA as IRelationalOperator;
- if (pRelOperator.Contains(pGeometryB))
- {
- return true;
- }
- else
- {
- return false;
- }
- }
復制代碼
6.5 IProximityOperator接口
6.5.1 IProximityOperator接口簡介
IProximityOperator接口用於獲取兩個幾何圖形的距離,以及給定一個 Point,求另一個幾何圖形上離離給定點最近的點。IProximityOperator接口的主要方法有:QueryNearesPoint,ReturnDistance, ReturnNearestPoint
ReturnDistance方法用於返回兩個幾何對象間的最短距離,QueryNearesPoint方法用於查詢獲取幾何對象上離給定輸入點的最近距離的點的引用,ReturnNearestPoint方法用於創建並返回幾何對象上離給定輸入點的最近距離的點。
6.5.2 最近點查詢功能開發
以下代碼片段演示如何使用IProximityOperator接口獲取給定點與要查詢的幾何圖形的最近點:
- /// 在pGeometry上返回一個離pInputPoint最近的point
- /// </summary>
- /// <param name="pInputPoint">給定的點對象</param>
- /// <param name="pGeometry">要查詢的幾何圖形</param>
- /// <returns>the nearest Point</returns>
- private IPoint NearestPoint(IPoint pInputPoint, IGeometry pGeometry)
- {
- try
- {
- IProximityOperator pProximity = (IProximityOperator)pGeometry;
- IPoint pNearestPoint = pProximity.ReturnNearestPoint(pInputPoint, esriSegmentExtension.esriNoExtension);
- return pNearestPoint;
- }
- catch(Exception Err)
- {
- MessageBox.Show(Err.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
- return null;
- }
- }
復制代碼
以下代碼片段演示如何使用IProximityOperator接口查詢給定的兩個幾何對象的距離:
- /// <summary>
- /// 獲取兩個幾何圖形的距離
- /// </summary>
- /// <param name="pGeometryA">幾何圖形A</param>
- /// <param name="pGeometryB">幾何圖形B</param>
- /// <returns>兩個幾何圖形的距離</returns>
- private double GetTwoGeometryDistance(IGeometry pGeometryA, IGeometry pGeometryB)
- {
- IProximityOperator pProOperator = pGeometryA as IProximityOperator;
- if (pGeometryA!=null|| pGeometryB !=null)
- {
- double distance= pProOperator.ReturnDistance(pGeometryB);
- return distance;
- }
- else
- {
- return 0;
- }
- }
復制代碼