0 Replies Latest reply on May 3, 2012 6:45 AM by gbushek

    Get segment of polyline between 2 points

    gbushek
      Hi. I have 2 points that were obtained from intersecting street 2 with street 1 and then street 3 with street 1.  Now I want to get the segment of street 1 that falls between those 2 points.  Is there an easy way to do this in the silverlight API?  I'm looking for some good ideas on which direction to go; whether there are geometry service utilities in the API to handle this or if there are toolbox tools I should be utilizing within a custom geoprocessing service. Any guidance is greatly appreciated.  The old code for this process was written in 9.1 ADF/ArcObjects using IPath.QueryPointAndDistance() and IPath.GetSubCurve() and somehow I need to accomplish the same thing in the Silverlight API.  I included the old code below simply to show the complexity that was being handled in the old code written several years ago.

      Thanks, Gary



      The old code looks like this:

                  ...Pts is an array that typically will hold 2 points found by interesting street 2 with street 1 and street 3 with street 1.
                  ...pTopo is the street 1 geometry
                  ...pT is the final polyline segment returned

                  Dim pLine As IGeometryCollection = CType(glb.SC.CreateObject("esriGeometry.Polyline"), IGeometryCollection)
                  'Now we have all the points. Find the points of the segment lines.
                  Dim PathNum(Pts.Count) As Integer
                  Dim Dist(Pts.Count) As Double
                  For I = 0 To Pts.Count - 1
                      PathNum(I) = -1
                  Next

                  Dim pPoint As IPoint = CType(glb.SC.CreateObject("esriGeometry.Point"), IPoint)
                  WebObj.ManageLifetime(pPoint)
                  Dim GeoCol As IGeometryCollection = CType(pTopo, IGeometryCollection)
                  Dim path As IPath
                  Dim DistAlongCurve As Double
                  Dim DistanceFromCurve As Double
                  Dim RightSide As Boolean

                  For I = 0 To GeoCol.GeometryCount - 1
                      path = CType(GeoCol.Geometry(I), IPath)

                      For J = 0 To Pts.Count - 1
                          If PathNum(J) = -1 Then
                              path.QueryPointAndDistance(esriSegmentExtension.esriNoExtension, CType(Pts(J), IPoint), False, pPoint, DistAlongCurve, DistanceFromCurve, RightSide)
                              If Math.Abs(DistanceFromCurve) < 10 Then
                                  PathNum(J) = I
                                  Dist(J) = DistAlongCurve
                              End If
                          End If
                      Next

                      'Find start and end point on this segment
                      Dim StartPt As IPoint = Nothing
                      Dim EndPt As IPoint = Nothing
                      Dim MinDist As Double = 99999999
                      Dim MaxDist As Double = -1
                      For J = 0 To Pts.Count - 1
                          If PathNum(J) = I Then
                              If Dist(J) < MinDist Then
                                  StartPt = CType(Pts(J), IPoint)
                                  MinDist = Dist(J)
                              End If
                              If Dist(J) > MaxDist Then
                                  EndPt = CType(Pts(J), IPoint)
                                  MaxDist = Dist(J)
                              End If
                          End If
                      Next

                      If MinDist < MaxDist Then
                          'A peice of segment found
                          Dim pL3 As ICurve = CType(glb.SC.CreateObject("esriGeometry.Polyline"), ICurve)
                          WebObj.ManageLifetime(pL3)

                          path.GetSubcurve(MinDist, MaxDist, False, pL3)
                          pLine.AddGeometry(pL3)
                      End If
                  Next


                  'When we exit this method, we do not need the complete shape, so dispose it
                  WebObj.ManageLifetime(pTopo)

                  'If pLine has something return it, otherwise return nothing
                  Dim pT As ITopologicalOperator = CType(pLine, ITopologicalOperator)
                  pT.Simplify()
                  Dim pL4 As IPolyline = CType(pLine, IPolyline)
                  If pL4.IsEmpty Then
                      WebObj.ManageLifetime(pLine)
                      Return Nothing
                  End If
                  pL4.SpatialReference = glb.MapInfo.SpatialReference

                  Return pT