刚才花了点时间,解决了一个ArcEngine的小问题,现把它做个记录。
功能描述:点击axMapControl选取指定点层中的元素
实现方法:
将鼠标的单击点(屏幕坐标)转换为地理坐标,然后获取以这个点为中心点的矩形框作为空间查询的过滤器,以此对目标图层进行查询,具体代码如下:
……
IPoint pt=this.axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x,e.y);
IEnvelope pEnv = new EnvelopeClass();
pEnv.XMax = pt.X + 0.1;
pEnv.XMin = pt.X - 0.1;
pEnv.YMin = pt.Y - 0.1;
pEnv.YMax = pt.Y + 0.1;
IGeometry pGeo = pEnv as IGeometry;
ISpatialFilter spatialFilter = new SpatialFilter();
spatialFilter.Geometry = pGeo;
……
然而,这样有一个问题。当地图缩放之后,地理坐标是不随之变化的,因此当单击离目标很远的时候,依然选中了该目标,这是不应该。
怎么办呢?解决办法还是有的,见下:
IEnvelope pEnv = new EnvelopeClass();
tagRECT r;
r.bottom = e.y + 5;
r.top = e.y - 5;
r.left = e.x - 5;
r.right = e.x + 5;
this.axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnv, ref r, 4);
IGeometry pGeo = pEnv as IGeometry;
ISpatialFilter spatialFilter = new SpatialFilter();
spatialFilter.Geometry = pGeo;
这段代码与上面大同小异,只是将获取单击点的包络线放在了转换(屏幕坐标向地理坐标)之前。
浙公网安备 33010602011771号