浏览 3934 次
锁定老帖子 主题:Mapx坐标转化的一个小细节
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-11
写一个Delphi+Mapx的GIS小程序,根据鼠标按下事件(OnMouseDown)使用MapX的OCX可以获取相应的经纬度坐标,代码如下: procedure TFMap.Map1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var lon, lat: Double; singleX, singleY: Single; fs: CMapXFeatures; pnt: CMapXPoint; name: string; begin if Map1.CurrentTool = miArrowTool then begin pnt := CoPoint.Create; singleX := X; singleY := Y; Map1.ConvertCoord(singleX, singleY, lon, lat, miScreenToMap); pnt.Set_(lon, lat); end; end; 这样可以根据鼠标所在的位置也就是屏幕坐标获取在MapInfo地图中的经纬度坐标,这里的参数X,Y应该就是屏幕坐标系的2个值,于是使用一个Timer控件来及时获取经纬度,代码如下: procedure TFMap.Timer1Timer(Sender: TObject); var point:TPoint; lon, lat: Double; singleX, singleY: Single; fs: CMapXFeatures; pnt: CMapXPoint; name: string; begin GetCursorPos(point); if Map1.CurrentTool = miArrowTool then begin pnt := CoPoint.Create; singleX :=point.X; singleY :=point.Y; Map1.ConvertCoord(singleX, singleY, lon, lat, miScreenToMap); pnt.Set_(lon, lat); end; end 发现一个问题,Timer及时获取的经纬度和鼠标按下时的不一样,有点奇怪,同样是屏幕坐标怎么转换结果不一样呢,设几个断点看了一下,原来在Map OCX OnMouseDown事件获取的不是纯屏幕坐标,而是Map的客户端坐标,在Timer控件中GetCursorPos这样获取的是当前坐标在屏幕的位置,这样当然就不一样了,解决办法很简单,将GetCursorPos获取的坐标再次转化为Map的客户端坐标就可以了:
windows.ScreenToClient(Map1.Handle,point); 再次设断点测试一下,一模一样了,Map OCX确实设计的非常好!赞一个! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |