判断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
这几种方法的比较
PS:你可能会问,在方法3中为什么把台湾给排除掉了,这是因为所谓的坐标偏移对台湾地区不适用。对于香港澳门地区,视情况需要单独判定。
判定坐标是否在国内,有下列几种方法可选:
通过网络地图接口查询
根据国家行政边界判定
根据国家行政边界近似判定
方法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
返回结果如下:
?
方法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中为什么把台湾给排除掉了,这是因为所谓的坐标偏移对台湾地区不适用。对于香港澳门地区,视情况需要单独判定。
相关文章推荐
- 【WP7】判断GPS坐标是否在中国
- 判断GPS坐标是否在中国
- 定位判断是否在中国
- java如何判断char类型是否为空-CSDN论坛-CSDN.NET-中国最大的IT技术社区
- ios 判断GPS是否是在中国境内
- 判断ip是否在中国内地
- (iOS)判断GPS坐标是否在中国
- (iOS)判断GPS坐标是否在中国
- 判断时区是否在中国
- 判断SMS中文是否要截断发送(防止半个汉字)
- python判断一个字符串是否为另一字符串的子串的几种方法
- [各种面试题] 判断是否平衡二叉树
- 判断AL是否为十六进制并将其十进制存入AL
- 判断是否为素数
- 判断各种xxx是否为空
- 编程之美——判断一个数是否为2的幂
- 每天一道LeetCode-----判断给定字符串是否符合某个模式
- java 判断一个字符串是否为数字
- C#三种判断字符是否为汉字的方法
- 64.判断当前线程是否是主线程