mapx点击鼠标获取经纬度

写一个Delphi+Mapx的GIS小程序,根据鼠标按下事件(OnMouseDown)使用MapX的OCX可以获取相应的经纬度坐标,代码如下:

Delphi代码   收藏代码
  1. procedure TFMap.Map1MouseDown(Sender: TObject; Button: TMouseButton;  
  2.   Shift: TShiftState; X, Y: Integer);  
  3. var  
  4.   lon, lat: Double;  
  5.   singleX, singleY: Single;  
  6.   fs: CMapXFeatures;  
  7.   pnt: CMapXPoint;  
  8.   name: string;  
  9. begin  
  10.   if Map1.CurrentTool = miArrowTool then  
  11.   begin  
  12.     pnt := CoPoint.Create;  
  13.     singleX := X;  
  14.     singleY := Y;  
  15.     Map1.ConvertCoord(singleX, singleY, lon, lat, miScreenToMap);  
  16.     pnt.Set_(lon, lat);  
  17.    end;  
  18. end;  

 这样可以根据鼠标所在的位置也就是屏幕坐标获取在MapInfo地图中的经纬度坐标,这里的参数X,Y应该就是屏幕坐标系的2个值,于是使用一个Timer控件来及时获取经纬度,代码如下:

Delphi代码   收藏代码
  1. procedure TFMap.Timer1Timer(Sender: TObject);  
  2. var  point:TPoint;  
  3.   lon, lat: Double;  
  4.   singleX, singleY: Single;  
  5.   fs: CMapXFeatures;  
  6.   pnt: CMapXPoint;  
  7.   name: string;  
  8. begin  
  9.  GetCursorPos(point);  
  10.   if Map1.CurrentTool = miArrowTool then  
  11.   begin  
  12.     pnt := CoPoint.Create;  
  13.     singleX :=point.X;  
  14.     singleY :=point.Y;  
  15.     Map1.ConvertCoord(singleX, singleY, lon, lat, miScreenToMap);  
  16.     pnt.Set_(lon, lat);  
  17.   end;  
  18. end  

 发现一个问题,Timer及时获取的经纬度和鼠标按下时的不一样,有点奇怪,同样是屏幕坐标怎么转换结果不一样呢,设几个断点看了一下,原来在Map OCX OnMouseDown事件获取的不是纯屏幕坐标,而是Map的客户端坐标,在Timer控件中GetCursorPos这样获取的是当前坐标在屏幕的位置,这样当然就不一样了,解决办法很简单,将GetCursorPos获取的坐标再次转化为Map的客户端坐标就可以了:

 

Delphi代码   收藏代码
  1. windows.ScreenToClient(Map1.Handle,point);  

 再次设断点测试一下,一模一样了,Map OCX确实设计的非常好!赞一个!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值