关于修正从 Core Location 获得的坐标的偏移量

2011-04-17 22:27:22 +08:00
 Livid
因为众所周知的原因,从 Core Location 获得的当前位置的坐标实际上偏移的,在把这样的坐标保存到数据库之前,必须进行偏移修正。

貌似偏移量是一个常量,这里有人试着测量过么?
25217 次点击
所在节点    iDev
65 条回复
aligo
2011-04-18 17:47:13 +08:00
@Livid 你可以先试试39.907001,116.391001这个坐标在MKMapView中是否正常,是否所有的语言、固件、位置设置的设备都是如此
9hills
2011-04-18 19:06:14 +08:00
@aligo AGPS和民用GPS芯片 使用火星坐标的可能性都不大
icyleaf
2011-04-25 00:00:12 +08:00
@Livid Google 有提供一个 API 接口,看看这个: http://blog.sina.com.cn/s/blog_65bd7eef0100hu5o.html
ccp0101
2011-05-11 14:16:46 +08:00
找到Apple内部对MKUserLocation去除偏移的方法。

[MKLocationManager _applyChinaLocationShift:(CLLocation*)arg]

这个方法返回去除偏移后的CLLocation*。


Code:


@interface MKLocationManager
- (CLLocation*)_applyChinaLocationShift:(CLLocation*)arg;
- (BOOL)chinaShiftEnabled;
+ (id)sharedLocationManager;
@end

CLLocationManager's Delegate:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
if ([[MKLocationManager sharedLocationManager] chinaShiftEnabled]) {
newLocation = [[MKLocationManager sharedLocationManager] _applyChinaLocationShift:newLocation];
if (newLocation == nil) return;
}
}
Livid
2011-05-11 14:22:41 +08:00
@ccp0101 非常感谢你的分享。
Kai
2011-05-11 14:38:56 +08:00
chinaShiftEnabled...

这个,太威武了
ccp0101
2011-05-12 17:50:09 +08:00
应该研究下_applyChinaShift:这个method是不是用得google的偏移服务。我看了dump的header看到有GMMRequest但是不确定是否调用了那个google的web接口。但是这个method返回的时候不block的所以不排除内部实现了反偏移算法。我抓包也没有看到http明文(非https)调用那个接口。
levey
2011-11-27 10:36:21 +08:00
@ccp0101 谢谢分享。
freewizard
2011-11-27 13:47:11 +08:00
iOS5开始不再使用[MKLocationManager _applyChinaLocationShift:],改用GEOLocationShiftProvider类了
keakon
2011-11-27 16:30:53 +08:00
@freewizard GEOLocationShiftProvider是什么?Google找不到任何资料…
tokki
2011-11-28 10:42:43 +08:00
好吧 过几天也要高这些东西 原来这里面这么多文章啊
kangxy
2011-11-28 17:02:20 +08:00
@Kenyth 收钱,有服务器license和客户端license,不交钱就是泄露国家机密.
kakashilw
2011-12-20 18:11:09 +08:00
最近要做个AR的应用,这个偏移量特别头疼。。。在距离比较近的时候,会造成很大误差~~
allanpk716
2012-02-23 21:52:25 +08:00
表示dump了有关location的东西,搜索了下也没看到GEOLocationShiftProvider这个东西啊,而且google都是果然在谈论,有点邪乎了把。
dump出来的确有GEOLocationShift关键字倒是,不过反正是弄越狱开发,去t的apple认证。^-^
allanpk716
2012-02-23 21:53:26 +08:00
打字快了···国人···不是果然
allanpk716
2012-02-25 12:53:19 +08:00
IOS 5的解决方案有了,个人测试OK,而且估计通用,请跳转下。
http://blog.sina.com.cn/s/blog_5d34020101013525.html
dazuiba
2012-03-17 12:08:58 +08:00
调用applyChinaLocationShift 会影响审核么?

@allanpk716 MKMapview自己的userLocation是没有偏移的.

这就解释了一个现象:MKMapview的showsUserLocation打开后, 地图上会多出一个蓝点,代表当前位置----这个蓝点是没有偏移的.

用这个userLocation绝对是ok的, 但是就依赖了MKMapView, 我的App给用户展示的是列表模式, 一开始不打开MKMapview的..
allanpk716
2012-04-10 19:06:48 +08:00
@dazuiba 印象public是没得的,我都是dump private的用的,也有可能我记错了。

applyChinaLocationShift 这个在IOS 4.33上测试是可以用的,IOS 5不行,其实变向使用mapkit来解决通用性强。

MKMapview 这个其实你创建一个实例就好了,也就是不要拖控件,直接代码做,我做的娱乐插件都是后台的,不需要用户看到的。
Smartype
2012-04-25 16:34:33 +08:00
Google Mobile Maps 使用的是 ProtocolBuffers.
GMM 提供一个 China Location Shift 的服务。提交一个 MapPoint 到 GMM 可以返回一个5个系数。两个区域大小值。通过比较想要修正点和这两个区域值。确定该修正系数是否适用。否则就得请求新的系数。
具体的偏移获取协议以及修正算法可以逆向 GMM.framework。怕被喝茶,所以不提供太多细节。
所以适用数据库做法是很傻的。如果把这个系数库爬出来。似乎也不错。呵呵。不想再折腾了。
Smartype
2012-04-25 16:35:25 +08:00
不好意思,是6个系数。修正经度,纬度各用三个。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/11666

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX