找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9807|回复: 10

【转发】一篇google地图纠偏的文章

[复制链接]
发表于 2011-4-14 08:42 | 显示全部楼层 |阅读模式
转自:Mark Chen 研究院
8 @( H" x8 T! X& R8 c7 M; X原文链接, K- P3 A9 @% L* \
Google 全国 地图 纠偏数据 偏移数据 火星坐标修正 方案
; ~! ^: m+ m- [  H) {! s6 N5 v2 Z3 T
GPS相关 2010-04-09 10:40:05 阅读1737 评论6   字号:大中小 订阅$ Q  }) j. |# z- Y5 o% k

  H2 `/ {  a: ^# ~中国地图和卫星图都存则偏移量,这个是由中国规划局,确定的,一个偏移算法,实际上是没有什么特殊规律的,他的生成算法是有规律,不过这个规律你我都很难拿到,那我们怎么解决这个偏差呢,毕竟做地图开发的都存在卫星图和地图的切换,谁不想让切换以后的地图对上呢! 后来我发现google的地图服务,ditu.gogle开始的都没有偏差,maps.google开头的服务就有偏差,我就开始查找google的取偏移量算法,事前我还是图破解google手机版本的数据,没有成功,估计是使用了自己的压缩或加密算法,最后也没有找到规律,后来才尝试破解web版本的 不过web版本的接口我对于js不是特别熟悉,所以本次破解放弃了分析源代码的步骤,而是直接采用排除法 那就是把地图部分访问的全部地址,一个接一个封杀掉,查找那个气偏移做用的网址 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067 最后找到了就是这个,记住每次测试用清理浏览器缓存哦,使用fixfox的fildder和adblock就够了 然后就是 分析每次返回内容的规律,黄天不负有心人啊,我总算是搞定了,下面是我整理的接口0 x' ^- J; K8 l
  f' Z" a% l- U0 r
Google 中国地图偏移接口" c8 N* b, y% `) j' r1 @

: S1 c9 f5 ]' Y5 t0 R1 P8 C7 p
$ i0 R7 f4 l$ a1 e  t2 Q; B- p
! G. S/ k! [# n( P/ D2 A# X# g1.      接口地址:http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067' W( s# P- i& l. ~! n
1 b" A$ }# f% h/ w6 i
/ D9 @2 ]" ]; S, ^8 t) g; G
, y: N$ R8 e# C
(注:.cn和.com都可以,我用国内服务器就会选择.cn用美国服务器就会选择.com)
9 K7 ^' l5 i" E* B4 {$ L+ n- Q3 l, M6 k2 d; R& d
2.      返回内容中的有效部分:' o" k+ E3 z9 S$ Y) O

" D( T+ x; u: c! k1 S3.      (39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270])+ D" {- E% Q3 z& A8 K# n
4.      Spn参数暂时未知实际意义,但是需要上发spn参数,任意两个小数用逗号分开( N  J6 X: q7 L2 w2 t; B" O; h; x

, q' P" d. D! h. r0 QVp参数纬经度值,用逗号分隔,z参数为地图缩放级别,无实际意义
4 C8 {+ I" u  {# n, C, z; V. U  J7 ~8 s. \: V. k
5.      取回的部分中有效数字为[9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -134, 1192, -268]这个数组总共有8组数字,每两个为一组,分为别从11级到18级的地图和卫星图的偏移像素数量,我们前一组数字精确的等于后一组数字除二,我们为了得到最精确的偏移,故选择第18级的偏移量1193,-270,1193为x方向上精度的偏移像素,-270为y方向上维度偏移像素
9 D* J9 P4 j$ Y* C7 ]3 _& B0 P3 X: o
6.      经纬度的偏移转换我们需要江经纬度39.111195,117.148067转化为18级像素值25620917 和 55392414,然后分别加上偏移量-270,1193,然后再转化为经纬度39.11231854918217 和117.15446412563324,即位偏移后的经纬度; P+ U$ q: A2 F

6 Q$ |) ?: [, y
& j5 j& u; y3 m. U8 m3 l" o2 b' i8 U5 n1 y, W- c# i0 y

. V8 G% ]4 J- l
. j# ?% a, Q) \2 }/ O! x$ x' u' x% W
数据经度  每0.01个经纬度一个偏移量2 W/ x7 I" Y& Z; ~" y0 B) n+ o

+ u3 m# {6 z( u- E9 f, T. V总共数据量(9557005)条6 C) w' m% i( A

5 {3 }, {+ b6 {* N* C- T/ d$ A数据格式CSV文件  每一个经度一个文件; L& q, W# u- z$ u& K/ M" Q
' ~* ^+ W5 n. s
从73-134总共62个文件  总大小480MB
! `( I6 Q, l. N- D( i$ ], c8 G! m) k2 j) L
数据介绍  依次为  经度  纬度  此位置偏移像素X,Y放心(google地图的第18级偏移量,没向上一级除2)
! B  N+ l0 Z, Q: r  I4 f# {' z6 R8 f9 M- L. x/ x
此位置经纬度偏移  保留6位小数  定位用足够了
回复

使用道具 举报

发表于 2011-4-14 09:35 | 显示全部楼层
顶上去。。好东东
回复 支持 反对

使用道具 举报

发表于 2011-4-14 09:54 | 显示全部楼层
没听明白。
回复 支持 反对

使用道具 举报

发表于 2011-4-14 10:22 | 显示全部楼层
顶,期待高手能搞定
回复 支持 反对

使用道具 举报

发表于 2011-4-14 10:28 | 显示全部楼层
不过现在ditu.google的也不准了吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-4-14 13:13 | 显示全部楼层
完美解决Google电子地图偏移问题' m: ~$ p  o7 t8 T5 q
2010年1月13日ant发表评论阅读评论 8,509 views
" H8 y# A+ z3 Q9 M+ t' Y, }受中国的一些政策法规的限制,Google电子地图必需加上偏移。其实,不光是google地图,国内所有做地图的公司的产品都是要加上偏移的。各公司在自己的客户端上再加上修正算法,从而保证使用他们的产品不会产生偏移。
5 d( v) p" m, F8 H% H. `: C. L0 i/ x" G# D, X
注意:2010/03/31 因Google更换了API,本文所提的方法已经失效。
+ M0 Q% j2 ^( M; r- z. B2 h请使用本站的偏移修正接口: http://www.anttna.com/goffset/goffset1.php?lat=纠偏前的纬度值&lon=纠偏前的经度值
* r& ^" C; N1 O( Q9 X; w2 d5 P. B* j! `- \: a9 D
Google电子地图偏移的原理& m4 F8 {3 m/ N+ O
9 H( t/ p7 K+ z
google 地图在显示指定经纬度(lat,lon)的坐标点(x,y)点时,根据偏移函数算出该点的偏移值(a,b),把该点的坐标减去偏移值后的结果(x-a,y-b)显示在电子地图上。! ]7 |* ?; }, N' X3 e% Z' [

9 S$ o8 t- n  ?! p$ ^9 XGoogle电子地图偏移的修正方法
( W) s  K/ E6 p: D6 J, k: L7 ?, m. m6 f0 \4 {( t
知道了原理后,修正的方法就很简单了:用同样的方法获取该点的偏移值(a,b),预先给定位点加上这个偏移值,把结果(x+a,y+b)提交给google map,google map再经过上面的算法处理后(x+a-a,y+b-b),显示在地图上的就是(x,y)了。
  s' U% W7 D, D4 N& T2 H6 D( r  z) b# b. x# q( l- q: p2 q
如何得到该点的偏移值(a,b)?/ ~/ }3 ~1 t7 E5 Q9 F
2 x2 _( e' k/ j* t* e; d- ~6 G# [2 _
网上已经有人研究出了google获取偏移值的方法,接口地址为 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=xxxx,xxxx ,只要提交同样的经纬度到该接口,返回的结果里就包含了该经纬度的偏移值。  ~; R: o- m& K# X6 S7 E
# }, h7 o% P9 V+ V5 h# @# m" p
为了简化操作,ant封装了该接口,可以提交经纬度到接口 http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx 直接获得偏移值。返回格式为: zoom,offset_x,offset_y3 ]# y8 @5 U9 |0 Y. M0 v

* W+ B# M" I5 m- [zoom: 这个值在做坐标运算时需要用到。! D2 T' L% b4 D% b, O
2 b3 g( S- p# e' O* z
offset_x: 指定经纬度X方向的偏移值" `1 C; l% |# f- Z0 Y, ~
5 `0 _  A7 j& _1 c: S" b2 x
offset_y:指定经纬度Y方向的偏移值
- U3 t( f% M& P* U6 Z( k+ T1 d2 l0 V/ z0 o2 e" v; x
有了这三个值就可以在google map里修正坐标了3 g& \+ c' V$ @5 l+ M6 u
: t8 B( f. t7 E' k
013 P3 [  w9 A+ U
</p>
+ U; z# U9 g1 Z# @! |028 e- L+ }! ?2 k+ i5 _; j/ U) u
<p>function convertCoord(vertex,zoom,offsetX,offsetY)<br />; m- t1 V$ {" B, M
03
9 q- m  f2 n9 G' h2 [ {<br />3 M1 f& H+ B+ m4 P! U
047 [. @# e3 a2 W, P$ G. C
var projection = gMap.getCurrentMapType().getProjection();<br />
7 r- p9 v% `1 N4 G05% \6 _: i) I( r- L
var point = projection.fromLatLngToPixel(vertex, zoom);<br />! |1 u$ [2 B5 i9 s3 g6 a  R1 M5 H
06
9 l& y4 C. I! m7 H/ s$ T/ n point = new GPoint(point.x + offsetX, point.y + offsetY);<br />+ k4 l. _/ h/ t" p% j
07
  A9 j" \- N  t$ U vertex = projection.fromPixelToLatLng(point, zoom);<br />
" R' R4 |- P9 s; t9 V08
% J- F' v8 |1 I# p' N return vertex;<br />$ p' N: ?! G: V" ^, B# D2 O: t/ x# U
09
  h5 ?' @0 Y) P1 f* O9 d: \ }</p>, T" a" _8 Z# M- W$ l7 A
10. Z: j: B; V0 L( ~# W5 f& S  X. j
<p>var point = new GLatLng(lat,lng);//原经纬度点</p>( Y, l% Y7 }$ V1 N
11
3 n2 C5 k4 B7 M+ Z+ B) ~<p>//通过接口http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx获得的数据<br />5 `) o# l: T$ B  n+ \( P7 `
12
8 G! W  M0 |+ e4 Z0 i% cvar zoom=18;<br />! b2 i" J3 ^7 w8 z
13
% L$ n9 s9 C% k* \! D% P, l( Tvar offset_x=100;<br />
0 @+ O+ [/ {% j6 q+ {: f( T14
5 T  ~' S8 |& ]# K& A) w8 ^% u7 q* evar offset_y=200;<br />  ~8 M6 w& O. ]! f% p$ m" d! ?
15
- j$ W6 E5 B7 P5 |+ h//修正经纬度<br />- W) P! S$ C* D6 ?' z$ S: [9 {
161 o" s& T7 u( |* @# }/ e% M  e
point=convertCoord(point,zoom,offset_x,offset_y);<br />
9 Z9 D8 s4 c# D17
$ N/ h% W& J& x: @; Z//</p>
1 J; J3 t9 Z  a  C9 H% A, ?* W- c! U18: E5 o8 Q0 e8 u
<p>& f, |" ~2 R- p5 f" h7 d4 Y
效果测试
& a( W% z. x# U" q; d+ t/ H# ^
0 F4 Z5 N6 g: p* h之前和zhjtan讨论过关于google map的偏移问题,这里仍然用该经纬度(22.535076,114.021229)做测试。+ x7 e1 K& r( t' R, J0 ?8 c

7 O7 u6 E4 ^- h! w9 k未修正的地图(电子地图和卫星地图不一致)
回复 支持 反对

使用道具 举报

发表于 2011-5-29 09:04 | 显示全部楼层
支持你,能实现成webos能用的ipk补丁吗?
回复 支持 反对

使用道具 举报

发表于 2011-6-15 14:21 | 显示全部楼层
没 看懂, N- t2 E- N# s: _* ^
    纯顶把``
$ {+ r0 }% ?; q5 _6 w
回复 支持 反对

使用道具 举报

发表于 2011-8-2 13:01 | 显示全部楼层
顶一下慢慢研究
回复 支持 反对

使用道具 举报

发表于 2011-10-16 21:10 | 显示全部楼层
学习!!
回复 支持 反对

使用道具 举报

发表于 2011-10-22 19:05 | 显示全部楼层
可以在app-assistant.js调用么?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

QQ|Archiver|手机版|小黑屋|吹友吧 ( 京ICP备05078561号 )

GMT+8, 2025-4-3 10:32 , Processed in 0.417139 second(s), 16 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表