您的位置:首页 > 理论基础 > 计算机网络

判断GPS坐标是否在中国

2012-08-09 13:40 1471 查看
    由于某些原因,国内地图总会有些偏移。虽说这是个相对偏移,但总会对需要坐标定位的应用造成几百米的漂移。若定位坐标在国外,则不会存在此问题。因此我们需要判别当前坐标是否在国内,然后决定是否进行坐标修正。
      判定坐标是否在国内,有下列几种方法可选:

通过网络地图接口查询
根据国家行政边界判定
根据国家行政边界近似判定
 

方法1,通过网络地图接口查询

      网络接口:http://maps.google.com/maps/api/geocode/xml?latlng=xxx,xxx&sensor=false,其中latlng参数填写的是坐标的经纬度参数。

      例如进行如下调用:http://maps.google.com/maps/api/geocode/xml?latlng=39.829632,117.059326&sensor=false

      返回结果如下:

?
      查询结果各字段的含义可以参考Google Map API的Reverse Geocoding (Address Lookup)章节。简化后可以直接判断返回的字符串中是否存在“<short_name>CN</short_name>”作为判定所查询坐标是否在中国的依据。

 

方法2,根据国家行政边界判定

      由于国家行政边界是由多个简单多边形组成的。对多个多边形进行命中测试 (Hit Testing),只要其中一个多边形测试成功,则表示整个命中测试成功。但多边形的命中测试有些麻烦,更简单的方法是判别点是否在多边形内(Point
in polygon(PIP))。这些算法中简单高效的莫过于是光线投射算法 (Ray casting algorithm)

      光线投射算法的要义是:在二维空间的任意一点射出一条射线,射线穿过多边形边界奇数次则这个点在多边形内,否则在多边形外。此方法适用于复杂多边形。实现此算法往往会限制射线的方向是向右的,这样的好处是简化了许多计算。此算法的一个实现参考1987年Paul
Bourke教授所写“Determining if a point lies on the interior of a polygon”的Solution 1。

      在 Windows Phone 7 中的实现,首先需要获取到国家行政边界的WGS84坐标数据。Alexey Strakh(链接有恶意软件警告)所开发的gMaps应用中包含了此边界数据。因此,自己可以把数据抠出来。抠出的数据由四部分组成我国的行政边界:大陆、台湾省、海南省、崇明岛。此数据相对来说比较准确,但是边界附近误差较大。每次判别坐标是否在此区域内的计算次数较多,大约需要几百次的几何计算。







      此方法的实现代码如下:

View Code

方法3,根据国家行政边界近似判定

      有时候需要一种快速的方法判定,这种快速判定的方法是从Nokia Maps中挖掘出来的。基本思路是:把整个行政区域划分为几个小的矩形,然后再排除掉一些矩形区域。只要一个点在限定的区域内,并且不在排除的区域内,则判定成功,否则失败。下图中蓝色区域为限定区域,红色区域为排除区域。





此方法的实现代码如下:

View Code

 

      这几种方法的比较

 备注
方法1

通过网络地图接口查询
简单、准确

信息量大
速度慢

依赖网络
可用Google、Baidu地图接口
方法2

根据国家行政边界判定
准确代码相对较多

判别计算次数较多

陆地边界数据误差较大
方法和数据从gMaps中挖掘
方法3

根据国家行政边界近似判定
快速

相对准确
边界误差较大方法和数据从Nokia Maps中挖掘
 

PS:你可能会问,在方法3中为什么把台湾给排除掉了,这是因为所谓的坐标偏移对台湾地区不适用。对于香港澳门地区,视情况需要单独判定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息