HowTo Perform the spatial selection 'Share a line segment with' using ArcObjects
HowTo Perform the spatial selection 'Share a line segment with' using ArcObjects
|
Article ID: |
26528 |
|
Software: |
ArcGIS - ArcEditor 8.1, 8.1.2, 8.2, 8.3 ArcGIS - ArcInfo 8.1, 8.1.2, 8.2, 8.3 ArcGIS - ArcView 8.1, 8.1.2, 8.2, 8.3 |
|
Platforms: |
Windows NT 4.0, 2000, XP |
Summary
Instructions provided illustrate how to duplicate the functionality of ArcMap's spatial selection 'share a line segment with' through ArcObjects code.
Procedure
- Start ArcMap.
- Open the Visual Basic Editor. -show me-
- In the Project Explorer window, expand Project.mxt and select ArcMap Objects > ThisDocument. Right-click and select .-show me-
Code in the Project's ThisDocument code module will only run in the current map document. If you want to store the code in all map documents open the Normal.mxt ThisDocument code module. - Copy/Paste the following code into the code module.
- Option Explicit
- Public Sub SelectPolyAsSharesSegementWith()
- Dim pMxDoc As IMxDocument
- Set pMxDoc = ThisDocument
- Dim pMap As IMap
- Set pMap = pMxDoc.FocusMap
- ' Union all of the search features into one geometry and strip off
- ' it's boundary for use in the search. Since we are only interested
- ' in shared segments, not areas, the boundary is all that is needed.
- ' Get search layer
- Dim pPolygonLyr As IFeatureLayer
- Set pPolygonLyr = pMap.Layer(1)
- Dim pLFeatClass As IFeatureClass
- Set pLFeatClass = pPolygonLyr.FeatureClass
- ' Loop through the polygons, simplify them and then
- ' add them to a Geometry Bag.
- Dim pFeatureCursor As IFeatureCursor
- Set pFeatureCursor = pLFeatClass.Search(Nothing, True)
- Dim pFeature As IFeature
- Set pFeature = pFeatureCursor.NextFeature
- Dim pGeometryCollection As IGeometryCollection
- Set pGeometryCollection = New GeometryBag
- Dim pTopologicalOperator2 As ITopologicalOperator2
- Do While Not pFeature Is Nothing
- Set pTopologicalOperator2 = pFeature.ShapeCopy
- pTopologicalOperator2.IsKnownSimple = False
- pTopologicalOperator2.Simplify
- pGeometryCollection.AddGeometry pTopologicalOperator2
- Set pFeature = pFeatureCursor.NextFeature
- Loop
- ' Union all the polygons
- Dim pTopologicalOperator1 As ITopologicalOperator2
- Set pTopologicalOperator1 = New Polygon
- pTopologicalOperator1.ConstructUnion pGeometryCollection
- ' Construct the boundary of the unioned polygons
- Dim pTopologicalOperator3 As ITopologicalOperator2
- Set pTopologicalOperator3 = New Polyline
- Set pTopologicalOperator3 = pTopologicalOperator1.Boundary
- ' Use the boundary to find the candidate features
- ' Get the target FeatureClass
- Dim pFeatureLayer As IFeatureLayer
- Set pFeatureLayer = pMap.Layer(0)
- Dim pFeatureClass As IFeatureClass
- Set pFeatureClass = pFeatureLayer.FeatureClass
- ' Set up a scratch workspace to use for the selection
- Dim pScratchWorkspace As IWorkspace
- Dim pScratchWorkspaceFactory As IScratchWorkspaceFactory
- Set pScratchWorkspaceFactory = New ScratchWorkspaceFactory
- Set pScratchWorkspace = pScratchWorkspaceFactory.DefaultScratchWorkspace
- ' Setup the spatial filter
- Dim pSpatialFilter As ISpatialFilter
- Set pSpatialFilter = New SpatialFilter
- With pSpatialFilter
- Set .Geometry = pTopologicalOperator3
- .GeometryField = "SHAPE"
- .SpatialRel = esriSpatialRelIntersects
- End With
- ' Perform the search and create a selection set
- Dim pTempSelection As ISelectionSet
- Set pTempSelection = pFeatureClass.Select(pSpatialFilter, esriSelectionTypeIDSet, esriSelectionOptionNormal, pScratchWorkspace)
- ' Loop through the features and check to see if they share a segment
- ' with the search geometry. If they don't, remove them from the selection
- ' set.
- ' Create a feature cursor to allow us the examine the candidate features
- Dim pTempFeatCur As IFeatureCursor
- pTempSelection.Search Nothing, True, pTempFeatCur
- Dim iOIDList(1) As Long
- Dim iOIDListCount As Long
- iOIDListCount = 1
- Dim pGeometry As IPolyline
- Dim pTempFeat As IFeature
- ' Fetch the first feature
- Set pTempFeat = pTempFeatCur.NextFeature
- Dim pTempPolyline As IPolyline
- ' Check for the one dimentional intersection of the geometries.
- ' If there is no intersection the returned geometry will be empty. If
- ' it is, remove it from the selection set.
- Dim pTopologicalOperator4 As ITopologicalOperator2
- Set pTopologicalOperator4 = New Polygon
- Do
- iOIDList(0) = pTempFeat.OID
- Set pTopologicalOperator4 = pTempFeat.ShapeCopy
- pTopologicalOperator4.IsKnownSimple = False
- pTopologicalOperator4.Simplify
- Set pTempPolyline = pTopologicalOperator4.Boundary
- Set pGeometry = pTopologicalOperator3.Intersect(pTempPolyline, esriGeometry1Dimension)
- If pGeometry.IsEmpty Then
- pTempSelection.RemoveList iOIDListCount, iOIDList(0)
- End If
- Set pTempFeat = pTempFeatCur.NextFeature
- Loop Until pTempFeat Is Nothing
- ' Set the feature selection
- Dim pFeatureSelection As IFeatureSelection
- Set pFeatureSelection = pFeatureLayer
- Set pFeatureSelection.SelectionSet = pTempSelection
- ' Display the selected features.
- Dim pdoc As IMxDocument
- Set pdoc = ThisDocument
- pdoc.ActiveView.Refresh
End Sub
- Close the Visual Basic Editor.
Created: 4/1/2004
Last Modified: 7/1/2008
Article Rating:
(1)
If you would like to post a comment, please login
Comments
By Anonymous - 07/20/2005 7:47 AM
Hello, The sample code to select polygons that share a segment with the selected polygon did not work for me. Although I tested it in 9.1, no library is explicitly defined so I don't think this is the problem. http://support.esri.com/index.cfm?fa=knowledgebase.techarticles.articleShow&d=26528 Sincerely, Valentina
HowTo Perform the spatial selection 'Share a line segment with' using ArcObjects的更多相关文章
- Division of Line Segment
Division of Line Segment /** */ void Line::EqualDivision(int nCount, QLineF fline, QList<QPointF& ...
- 目标检测之线段检测---lsd line segment detector
(1)线段检测应用背景 (2)线段检测原理简介 (3)线段检测实例 a line segment detector (4)hough 变换和 lsd 的区别 --------------------- ...
- HDU 1542/POJ 1151 Atlantis (scaning line + segment tree)
A template of discretization + scaning line + segment tree. It's easy to understand, but a little di ...
- Line segment matching
FMII2方法:FMII方法的轻微的修改.有限线段和无限线段(直线)的匹配. 求解方法: SVD分解 Unit Quaternion 协方差矩阵: 通过对C进行SVD分解得到R,根据R求得T. 算法流 ...
- Android OpenGL ES(九)绘制线段Line Segment .
创建一个DrawLine Activity,定义四个顶点: float vertexArray[] = { -0.8f, -0.4f * 1.732f, 0.0f, -0.4f, 0.4f * 1.7 ...
- 用ArcGIS?37个Arcmap常用操作技巧可能帮到您
1. 要素的剪切与延伸 实用工具 TASK 任务栏 Extend/Trim feature 剪切所得内容与你画线的方向有关. 2. 自动捕捉跟踪工具 点击Editor工具栏中Snapping来打开Sn ...
- ArcGIS中的查询
最近身体不适,静下心来看了一下以前收集的电子书.下面是<ArcGIS地理信息系统教程_第5版>(李玉龙)第5章“查询”的读书笔记. 1.查询的常见应用: 选择感兴趣的要素:查找哪些要素满足 ...
- 2016-2017 National Taiwan University World Final Team Selection Contest C - Crazy Dreamoon
题目:Statements Dreamoon likes algorithm competitions very much. But when he feels crazy because he ca ...
- 2016-2017 National Taiwan University World Final Team Selection Contest A - Hacker Cups and Balls
题目: Dreamoon likes algorithm competitions very much. But when he feels crazy because he cannot figur ...
随机推荐
- [原创] 聊聊X-Forwared-For和关于他的几种非主流安全问题
关于这个X-FORWARED-FOR 有很多非主流漏洞都和他有关 之前我和我的基友misty以为关于这个标头的漏洞会有很多会被很多开发者忽视 会出现很多关于他的安全漏洞 可是由于我精力不足 就没继续 ...
- tomcat切割日志的shell脚本
#!/bin/bash cd /usr/tomcats/ d=`date +%F` m1=`date -d'1 month ago' +%F` ` do cd tomcat808"$i&qu ...
- boost -- scoped_lock V.S. mutex lock/unlock —— why scoped_lock is recommanded?
why scoped_lock is recommanded? 其实,这和RAII idiom变流行是一样的原因:因为你可以确保任何情况下离开执行范围都会解锁mutex. 注意,这不仅仅是说你可能忘记 ...
- 【转】C++怎么读写windows剪贴板的内容?比如说自动把一个字符串复制.
// 复制数据至剪切板BOOL CopyToClipboard(const char* pszData, const int nDataLen){ if(::OpenClipboard(NULL)) ...
- LINQ查询操作符之Select、Where、OrderBy、OrderByDescending、GroupBy、Join、GroupJoin及其对应的查询语法
介绍 ·Select - Select选择:延迟 ·Where - Where查询:延迟 ·OrderBy - 按指定表达式对集合正序排序:延迟 ·OrderByDescend ...
- NUnit笔记
注意:单元测试中,Case 与 Case 之间不能有任何关系 测试方法不能有返回值,不能有参数,测试方法必须声明为 public [TestFixture] //声明测试类 [SetUp] //建立, ...
- JQuery Placeholder - Input提示信息
JQuery Placeholder Placeholder属性是HTML5为Input添加的,在Input上提供一个占位符,文字形式展示输入文字预期值的提示信息. 如: 需要使用:placehold ...
- CSS3图片缩放
鼠标指上去,图片放大,鼠标离开图片恢复原样,并且有放大.缩小效果 Css代码实现:
- MySQL绿色版5.7以上安装教程
写在前面:5.7增加了安全性,默认root密码不在为空,而是初始化时随机生成一个root密码,改root密码的方式也不一样了 下载地址 http://dev.mysql.com/downloads/m ...
- yum install mysql
rpm -qa|grep -i mysqlmysql-libs-5.1.52-1.1.alios6.1.x86_64mysql-5.1.52-1.1.alios6.1.x86_64mysql-deve ...