[Visual Basic 6.0]This sample uses ITopologicalOperator::Intersect to do the equivalent of a select by location with the share a line segment operator.
Public Sub ShareLineSegment()
Dim pMxDoc As IMxDocument
Set pMxDoc = ThisDocument
Dim pMap As IMap
Set pMap = pMxDoc.FocusMap
Dim pFL1 As IFeatureLayer, pFL2 As IFeatureLayer
Set pFL1 = pMap.Layer(0) ' first layer of map
Set pFL2 = pMap.Layer(1) ' second layer
Dim pF1 As IFeature, pF2 As IFeature
Set pF1 = pFL1.FeatureClass.GetFeature(1) ' get feature with ID=1 in first layer's feature class
Dim pfs As IFeatureSelection
Set pfs = pFL2
Dim id As Long
id = pfs.SelectionSet.IDs.Next ' get first id in selection set an actual function would probably loop over the selection
Set pF2 = pFL2.FeatureClass.GetFeature(id) ' this is line 2
'is there an intersection bw the two features
Dim pTopo As ITopologicalOperator
Set pTopo = pF1.Shape ' store the line 1 shape in the topo op
If Not pTopo.IsSimple Then pTopo.Simplify
Dim pGeom As IGeometry
Set pGeom = pTopo.Intersect(pF2.Shape, esriGeometry1Dimension) ' get intersection with line 2
If pGeom.IsEmpty Then
MsgBox "The intersection of the 2 geometries is empty or consists of points"
Exit Sub
End If
' pGeom now contains the intersection of pf1 and pf2
' because dimension = esriGeometry1Dimension
' it is a geometry of type polyline
' if the intersection of the two features consisted of a point or points pgeom would be empty
' we could use ITopologicalOperator::Intersect with 0 dimension to find about those points'if pGeom contains only two vertices then the intersection is a simple line segment
'3 vertices means it's a polyline with two successive segments
'>3 means we have several segments or a polyline or a combination of these
Dim ppc1 As IPointCollection
Set ppc1 = pGeom
Dim l As Long, g As Long
l = ppc1.PointCount
If l = 2 Then
MsgBox "The two features share a single line segment"
ElseIf l = 3 Then
MsgBox "The intersection of the two features is a polyline consisting of 2 segments"
ElseIf l > 3 Then
Dim pGeomColl As IGeometryCollection
Set pGeomColl = pGeom
g = pGeomColl.GeometryCount
MsgBox "The intersection of the two features is made of " & g & " polyline(s)and/or segment(s)"
End IfEnd Sub
[C#]//This sample uses ITopologicalOperator::Intersect //to do the equivalent of a select by location with the share a line segment operator. public void ShareLineSegment() { IMxDocument mxDocument = m_application.Document as IMxDocument; IMap map = mxDocument.FocusMap; //first layer of map IFeatureLayer firstLayer = map.get_Layer(0) as IFeatureLayer; if (firstLayer == null) { return; } // second layer IFeatureLayer secondLayer = map.get_Layer(1) as IFeatureLayer; if (secondLayer == null) { return; } //get feature with ID=1 in first layer's feature class IFeature feature1 = firstLayer.FeatureClass.GetFeature(1); if (feature1 == null) { return; } IFeatureSelection featureSelection = secondLayer as IFeatureSelection; //get first id in selection set an actual function would probably loop over the selection int id = featureSelection.SelectionSet.IDs.Next(); if (id == -1) { return; } //this is line 2 IFeature feature2 = secondLayer.FeatureClass.GetFeature(id); if (feature2 == null) { return; } //is there an intersection between the two features //store the line 1 shape in the topo op ITopologicalOperator topologicalOperator = feature1.Shape as ITopologicalOperator; if (!topologicalOperator.IsSimple) { topologicalOperator.Simplify(); } //get intersection with line 2 IGeometry geometry = topologicalOperator.Intersect(feature2.Shape, esriGeometryDimension.esriGeometry1Dimension); if (geometry.IsEmpty) { System.Windows.Forms.MessageBox.Show("The intersection of the 2 geometries is empty or consists of points"); return; } //geometry now contains the intersection of feature1 and feature2 //because dimension = esriGeometry1Dimension //it is a geometry of type polyline //if the intersection of the two features consisted of a point or points pgeom would be empty //we could use ITopologicalOperator::Intersect with 0 dimension to find about those points //if geometry contains only two vertices then the intersection is a simple line segment //3 vertices means it's a polyline with two successive segments //>3 means we have several segments or a polyline or a combination of these IPointCollection pointCollection = geometry as IPointCollection; int pointCount = pointCollection.PointCount; if (pointCount == 2) { System.Windows.Forms.MessageBox.Show("The two features share a single line segment"); } else { if (pointCount == 3) { System.Windows.Forms.MessageBox.Show("The intersection of the two features is a polyline consisting of 2 segments"); } else { if (pointCount > 3) { IGeometryCollection geometryCollection = geometry as IGeometryCollection; int geometryCount = geometryCollection.GeometryCount; System.Windows.Forms.MessageBox.Show("The intersection of the two features is made of " + geometryCount + " polyline(s)and/or segment(s)"); } } } }
[Visual Basic .NET, C++]
No example is available for Visual Basic .NET or C++. To view a Visual Basic 6.0 or C# example, click the Language Filter button
in the upper-left corner of the page.