ArcEngine擷取兩點間沿曲線的距離-已經解決

來源:互聯網
上載者:User

 

一共分兩部分:

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;
        }

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.