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