GIS@天涯海角

完整的人生应该有三感:使命感、失落感、危机感。

导航

屏幕坐标与地理坐标

Posted on 2009-06-26 21:54  X sky  阅读(724)  评论(0)    收藏  举报

刚才花了点时间,解决了一个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;

这段代码与上面大同小异,只是将获取单击点的包络线放在了转换(屏幕坐标向地理坐标)之前。