下面是用点选法选择地图中的要素,首先在鼠标点击点周围建立较小范围的缓冲区,然后用这个缓冲区与地图中的要素类进行空间过滤计算,得到选择的要素。下面的例子仅在一个图层中选择,并且局限于选择点要素,其他要素类似。 Private Sub AxMapControl1_OnMouseDown(ByVal sender As System.Object, ByVal e As AxesriMapControl.IMapControlEvents2_OnMouseDownEvent) Handles AxMapControl1.OnMouseDown
Dim pMap As IMap
pMap = AxMapControl1.Map
获取点图层
Dim pFeatLyr As IFeatureLayer
pFeatLyr = pMap.Layer(0)
获取鼠标点击点
Dim pPoint As IPoint
pPoint = New Point
pPoint.PutCoords(e.mapX, e.mapY)
Dim pGeometry As IGeometry
pGeometry = pPoint
Dim pFeatClass As IFeatureClass
pFeatClass = pfeatlyr.FeatureClass
进行缓冲区运算:
Dim pTopo As ITopologicalOperator
pTopo = pGeometry
设定缓冲区距离:
Dim length As Double
length = ConvertPixelToMapUnits(pMap, 5)
得到缓冲区多边形pBuffer:
Dim pBuffer As IGeometry
pBuffer = pTopo.Buffer(length)
得到缓冲区的包络线:
pGeometry = pBuffer.Envelope
下面进行空间过滤运算:
Dim pSpatialFilter As ISpatialFilter
pSpatialFilter = New SpatialFilter
pSpatialFilter.Geometry = pGeometry
下面设置为三种不同要素类型的图层的空间过滤运算:
Select Case pFeatClass.ShapeType
Case esriGeometryType.esriGeometryPoint
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains
Case esriGeometryType.esriGeometryPolyline
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses
Case esriGeometryType.esriGeometryPolygon
pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects
End Select
pSpatialFilter.GeometryField = pFeatClass.ShapeFieldName
下面得到空间过滤运算的结果指针:
Dim pCursor As IFeatureCursor
pCursor = pFeatClass.Search(pSpatialFilter, False)
得到空间过滤运算的结果要素
Dim pfeat As IFeature
pfeat = pCursor.NextFeature
下面把选择到的要素显示出来
Dim pColor As IRgbColor
pColor = New RgbColor
pColor.Red = 110
pColor.Green = 120
pColor.Blue = 210
Dim pMarkSym As ISimpleMarkerSymbol
pMarkSym = New SimpleMarkerSymbol
pMarkSym.Style = esriSimpleMarkerStyle.esriSMSCircle
pMarkSym.Size = 10
pMarkSym.Color = pColor
Do While Not pfeat Is Nothing
pMap.SelectFeature(pfeatlyr, pfeat)
AxMapControl1.DrawShape(pfeat.Shape, pMarkSym)
'pfeat.Delete()加上这一句可以删除选中的要素
pfeat = pCursor.NextFeature
Loop
End Sub
这个函数是用来得到一个最佳缓冲距离:
Private Function ConvertPixelToMapUnits(ByVal pActiveView As IActiveView, ByVal pixelUnits As Double) As Double
Dim realWorldDisplayExtent As Double
Dim pixelExtent As Integer
Dim sizeOfOnePixel As Double
pixelExtent = pActiveView.ScreenDisplay.DisplayTransformation.DeviceFrame.right - pActiveView.ScreenDisplay.DisplayTransformation.DeviceFrame.left
realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width
sizeOfOnePixel = realWorldDisplayExtent / pixelExtent
Return pixelUnits * sizeOfOnePixel
End Function
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步