找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9783|回复: 10

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

[复制链接]
发表于 2011-4-14 08:42 | 显示全部楼层 |阅读模式
转自:Mark Chen 研究院. H8 _- _" ^& ^+ e- K" w
原文链接7 m7 [  s+ ?% O$ {5 ~# X( x& }$ {
Google 全国 地图 纠偏数据 偏移数据 火星坐标修正 方案
) F  X6 T; y* u) B4 m
3 M2 E* J- n) L5 c! h: H" S) jGPS相关 2010-04-09 10:40:05 阅读1737 评论6   字号:大中小 订阅
' A4 e& p' _, {- b* d% g& X1 g! q- |& |8 j
中国地图和卫星图都存则偏移量,这个是由中国规划局,确定的,一个偏移算法,实际上是没有什么特殊规律的,他的生成算法是有规律,不过这个规律你我都很难拿到,那我们怎么解决这个偏差呢,毕竟做地图开发的都存在卫星图和地图的切换,谁不想让切换以后的地图对上呢! 后来我发现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就够了 然后就是 分析每次返回内容的规律,黄天不负有心人啊,我总算是搞定了,下面是我整理的接口
- L3 r$ }# F  U  I1 I
6 f2 S+ R& P9 u) q0 S5 a- } Google 中国地图偏移接口
, W4 _& W) [( O
1 o( o6 K; X  X . j0 \& G. U. `8 K' }1 `
  O/ A  T+ O8 J* b
1.      接口地址:http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067
6 I  w1 e5 v! @$ B- C7 V' U" b3 j* d% M; o+ m$ a

+ F( Q# w# `: U' ], `$ I% v9 H! ^, B$ i
(注:.cn和.com都可以,我用国内服务器就会选择.cn用美国服务器就会选择.com)
9 \/ r2 t& W! }! d0 u* L3 e/ T
. |  p- m+ D( R2.      返回内容中的有效部分:
$ x% _) s  ~, ?  }% r
% j! v, r" g! K5 ]9 x) b1 K  J; s3.      (39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270])
9 R( G7 l! p) L5 ]/ S: c3 E. ~. T4.      Spn参数暂时未知实际意义,但是需要上发spn参数,任意两个小数用逗号分开0 S9 L7 v4 L# g7 A5 i4 l) ?# J

; U" D& K6 ^: @Vp参数纬经度值,用逗号分隔,z参数为地图缩放级别,无实际意义8 k$ R6 @# C2 e0 _3 |8 b9 s) T

& }6 W7 M0 z# }; y3 Q2 E6 p" `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方向上维度偏移像素
8 u& Q# r% V. H
0 X" R0 }0 g$ P) h6 V# R6.      经纬度的偏移转换我们需要江经纬度39.111195,117.148067转化为18级像素值25620917 和 55392414,然后分别加上偏移量-270,1193,然后再转化为经纬度39.11231854918217 和117.15446412563324,即位偏移后的经纬度" `( |9 s7 a6 \; T1 ~

/ F5 d5 W  s) ]1 ~0 `' Q9 I- n, \; t4 i- M7 B  ~9 ~
; S  J- k) m- j1 u

  g: \5 _, J1 T8 {3 A1 w6 w2 P& K7 i0 ]) U% Q: x( c
! a  R* E$ p' y1 I
数据经度  每0.01个经纬度一个偏移量0 Q# Y% ]+ Q5 a6 ]" h

- L8 H" ^& N+ f" W* a总共数据量(9557005)条
) f& ]6 c/ B8 |, s9 X
. T, d& A, |: P# o$ v! \数据格式CSV文件  每一个经度一个文件, @- B- n% t$ d- m
7 S3 ?$ o! I+ [. x. M) ^/ C
从73-134总共62个文件  总大小480MB
) f0 c3 o& I& y/ k) r
% o. I' K. G1 `/ h数据介绍  依次为  经度  纬度  此位置偏移像素X,Y放心(google地图的第18级偏移量,没向上一级除2)
2 F, [( a6 ~7 q% N% o* }/ s) M2 s5 V
此位置经纬度偏移  保留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电子地图偏移问题  Q  B2 }" b* R+ T2 x! e
2010年1月13日ant发表评论阅读评论 8,509 views
; f! n% \% Z/ q2 o: D6 h  e受中国的一些政策法规的限制,Google电子地图必需加上偏移。其实,不光是google地图,国内所有做地图的公司的产品都是要加上偏移的。各公司在自己的客户端上再加上修正算法,从而保证使用他们的产品不会产生偏移。
" M2 _, d7 [8 G0 \. J2 j; ^3 d6 k1 |" P' n
注意:2010/03/31 因Google更换了API,本文所提的方法已经失效。
6 a4 Y, `' {" i0 q% @. J请使用本站的偏移修正接口: http://www.anttna.com/goffset/goffset1.php?lat=纠偏前的纬度值&lon=纠偏前的经度值
. |/ M+ |; {, u9 F' R: G" H! V- Q
* y7 w# P$ A/ u- s4 i$ FGoogle电子地图偏移的原理
" q0 V7 x' h: s/ D4 P( |, I; x) H
google 地图在显示指定经纬度(lat,lon)的坐标点(x,y)点时,根据偏移函数算出该点的偏移值(a,b),把该点的坐标减去偏移值后的结果(x-a,y-b)显示在电子地图上。* j! K; f) r/ I) m" \* x4 O

# @- ^, q% `% [0 R! r; Z+ [" i9 _7 YGoogle电子地图偏移的修正方法/ f  L5 t8 Y4 F7 V2 ~5 K

; L+ E# a  d* O7 R  `/ u知道了原理后,修正的方法就很简单了:用同样的方法获取该点的偏移值(a,b),预先给定位点加上这个偏移值,把结果(x+a,y+b)提交给google map,google map再经过上面的算法处理后(x+a-a,y+b-b),显示在地图上的就是(x,y)了。8 f9 ~; T* Z! G& a6 e) u
7 k, o+ \8 g( J# l0 b9 F& P
如何得到该点的偏移值(a,b)?
! ~9 E. J3 o0 o7 p, W, Q+ S2 h; f6 G  r& p4 U
网上已经有人研究出了google获取偏移值的方法,接口地址为 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=xxxx,xxxx ,只要提交同样的经纬度到该接口,返回的结果里就包含了该经纬度的偏移值。/ T* y' H1 u* I2 U- `4 Q- S; c
/ r& v. q+ n! I
为了简化操作,ant封装了该接口,可以提交经纬度到接口 http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx 直接获得偏移值。返回格式为: zoom,offset_x,offset_y0 e# h' e8 w" N" ], I+ ]

! [7 N5 W* u0 e% Z( S. \$ z/ M# ^zoom: 这个值在做坐标运算时需要用到。% \: _- p  y. `0 K; r
3 f8 C9 x# s& j" p/ L
offset_x: 指定经纬度X方向的偏移值+ B& p$ c/ r9 J7 W) q

9 @2 x2 G; f( r2 ooffset_y:指定经纬度Y方向的偏移值8 W% B* T: }: R5 o

* R: [  i; ~! ~7 M有了这三个值就可以在google map里修正坐标了
0 u, f1 h3 S: G* l; G/ C; b$ m4 x  P! I5 K: y+ I3 j+ x. E; ]
019 Q' {! s( j( r; l4 A
</p>
: R9 v/ p4 q. F1 a7 |  j1 J- e02
" W0 h/ @" F# L. e: X<p>function convertCoord(vertex,zoom,offsetX,offsetY)<br />% P/ P- _2 z: C# Q0 E
03
- k4 ^# O! r* v  h- Q) n {<br />. ^& E" e4 f% @; D& u
042 h0 ?$ B) H* u1 v) e
var projection = gMap.getCurrentMapType().getProjection();<br />% |; r$ R: X; ~/ q1 `5 b
05
) {' e+ O# F" r1 u2 z% B. K. [var point = projection.fromLatLngToPixel(vertex, zoom);<br />  d/ T5 _2 N4 d) ^
068 I: s, K& ^% J0 w. j
point = new GPoint(point.x + offsetX, point.y + offsetY);<br />
2 I+ T) p; d1 ]3 D1 k2 g$ A07" L) D/ a1 k# w) B2 ~! S, ]
vertex = projection.fromPixelToLatLng(point, zoom);<br />
: I! w% i" f! k6 X8 s08% f6 L; i# ?( A( Y& C  {
return vertex;<br />
/ o, D) O: ^8 L3 E% z. A7 ^09, M- f" K: D  X4 v% ~
}</p>! w+ j' d0 E: `+ L- w( Q
10) p/ B3 K  Y& k- |
<p>var point = new GLatLng(lat,lng);//原经纬度点</p>
# |( w4 g; N4 H, C113 e, w. X: I: E
<p>//通过接口http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx获得的数据<br />
2 `* v8 Z. u0 A: _8 B/ e& `12! k9 n# ?; X  U
var zoom=18;<br />
, q/ Y4 \8 P- p- A; ]$ }5 V138 r8 y# y/ T  G
var offset_x=100;<br />
$ k; R/ U3 ^, S: n) k# X* ~) W14/ U8 N6 m) w6 J4 R, Y/ S
var offset_y=200;<br />
$ H' D$ Z$ d8 m; c5 L$ J  d15& h2 B, m! R# H* {0 R; H1 x
//修正经纬度<br />3 r6 V, F2 r& o; A; o
16
- h; j0 d$ E. q6 I5 G+ W$ Fpoint=convertCoord(point,zoom,offset_x,offset_y);<br />
0 s1 t+ V" q8 O- H' i9 M: v1 _17
" U$ x, ~+ N' q' ~0 _//</p>
1 v* d0 }/ T) L8 B9 o5 v( ~18  O* j9 U4 Y) G' l! N
<p>
& L. A& T. i0 ?% g. D+ e7 d效果测试
6 ]5 Y8 n# k$ p0 {! [% K
& m- c& L+ O/ [8 X- C- K之前和zhjtan讨论过关于google map的偏移问题,这里仍然用该经纬度(22.535076,114.021229)做测试。& I+ [2 j; m! o( O! b; E/ s! @

: m; L! y4 g$ K# o未修正的地图(电子地图和卫星地图不一致)
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2011-6-15 14:21 | 显示全部楼层
没 看懂$ W$ v3 G0 J$ T, E
    纯顶把``
7 w6 y" {. \# r; H8 C" u9 l3 ?. |
回复 支持 反对

使用道具 举报

发表于 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-2-23 15:19 , Processed in 0.276298 second(s), 16 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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