一共分兩部分:
1.方法概述
2.C#實現點到線段起點距離
第一部分
http://www.gispower.org/article/arcgis/ao/2008/122/081222025470KDK5965183CCA19ABJ5.html
我們常常需要計算某個線狀幾何要素(可以是直線Iline,IpolyLine,也可以是曲線Icurve,Iring)上任意兩點間的距離。對於直線而言我們只需要用兩點間直線距離公式就可以得到,但是對於曲線來說在Ae中沒有提供直接擷取的方法和屬性。本人在實驗後找到了可以求得曲線上任意一兩點距離的方法,和大家分享,希望共同提高。
方法一:
在AE中有個方法QueryPointAndDistance(Icurve為例),通過這個方法我們可以擷取空間上一點到曲線上最近的點的位置和據起點的距離。這樣我們就可以利用這個方法將空間上的點轉移到我們要求得的兩點間距離的兩個點上,也就是將曲線上求距離的兩個點看作是空間上任意兩個點。通過QueryPointAndDistance方法求得在曲線上與這兩個點最近的兩個點與兩個據起點的距離。
*注意*:實際上我們擷取的最近的兩個點實際上就是要求得距離的兩個點本身。
假設曲線上兩點位PtA,PtB 那麼通過計算得到的兩個距離就是DisPtA和DisPtB。
用DisPtA - DisPtB 就是我們要擷取的曲線上兩點間距離。
Dim outpt1 As IPoint
Set outpt1 = New Point
Dim disalong1 As Double
Dim dis1 As Double
pcurve.QueryPointAndDistance esriExtendTangentAtFrom, pt1, False, outpt1, disalong1, dis1, False
Dim outpt2 As IPoint
Set outpt2 = New Point
Dim disalong2 As Double
Dim dis2 As Double
pcurve.QueryPointAndDistance esriExtendTangentAtFrom, pt2, False, outpt2, disalong2, dis2, False
''曲線兩點間距離
resultDis=disalong2-disalong2
方法二:
還有一種方法是利用 GetSubcurve方法來將曲線上兩點間的曲線裁剪出一個SubCurve,然後利用ICurve介面的Length方法就可以直接擷取。但本方法實施起來有一定難度。
方法三:
如果我們要查詢距離的兩點 是曲線上的 節點,那麼我們就可以通過IEnumPointAndDistance介面下的 DistanceAlongCurve方法直接擷取一個點到參照點的曲線距離(參照點一般為曲線的起點 frompoint),然後將擷取到的兩個距離相減也同樣可以擷取到兩點間的曲線距離。
注意:本方法一定是節點 才可以使用。
第二部分
http://hi.baidu.com/llinkin_park/blog/item/1200cb3cc5a15f3070cf6cb4.html
在做垃圾桶服務能力檢測功能時,需要求兩個垃圾桶之間在道路上的實際距離,由於道路使用的是線要素,而考慮到採集資料的精度問題,我假設在地圖上道路兩邊都有可能出現垃圾桶。所以求這個距離的確是個難題。後來想了很多種方法,都一一否定了。 後來在論壇上看見一個文章,他是使用的vb寫的,被我改成c#了,其實也挺簡單的,主要使用了IPolyline內建的QueryPointAndDistance方法,它能返回一個點至線的起始點的距離,然後通過這兩個距離相減,就得到兩點之間的距離了。
ICurve.QueryPointAndDistance Method :Finds the point on the curve closest to inPoint, then copies that point to outPoint; optionally calculates related items。
/// <summary>
/// 得到兩個垃圾桶在道路上的距離
/// </summary>
/// <param name="pnt1">垃圾桶1</param>
/// <param name="pnt2">垃圾桶2</param>
/// <param name="roadFeature">所在道路</param>
/// <returns></returns>
public double getDistanceOfTwoPoint(IPoint pnt1, IPoint pnt2, IFeature roadFeature)
{
double distanceOfpnt1 = distanceFromStartPoint(pnt1, roadFeature);
double distanceOfpnt2 = distanceFromStartPoint(pnt2, roadFeature);
return distanceOfpnt2 - distanceOfpnt1;
}
/// <summary>
/// 垃圾桶到道路起點的距離
/// </summary>
/// <param name="pPoint"></param>
/// <param name="pFeature"></param>
/// <returns></returns>
public double distanceFromStartPoint(IPoint pPoint, IFeature pFeature)
{
IPolyline pPolyline = pFeature.Shape as IPolyline;
IPoint outPoint = new PointClass();
double distanceAlongCurve = 0;//該點在曲線上最近的點距曲線起點的距離
double distanceFromCurve = 0;//該點到曲線的直線距離
bool bRightSide = false;
bool asRatio = false; //asRatio:byval方式,bool類型,表示上面兩個參數給定的長度是以絕對距離的方式給出還是以占曲線總長度的比例的方式給出
pPolyline.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, pPoint, asRatio, outPoint, ref distanceAlongCurve, ref distanceFromCurve,ref bRightSide);
return distanceAlongCurve;
}