找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9785|回复: 10

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

[复制链接]
发表于 2011-4-14 08:42 | 显示全部楼层 |阅读模式
转自:Mark Chen 研究院
1 a. U! y0 ^$ ?( j5 P原文链接
$ p2 Z5 s  `* k/ o* u8 H4 f0 Y! e' BGoogle 全国 地图 纠偏数据 偏移数据 火星坐标修正 方案1 d8 P! N0 ?; q, x( Z: R
- @! M, b* u1 _2 y; z( E
GPS相关 2010-04-09 10:40:05 阅读1737 评论6   字号:大中小 订阅6 `, @+ F: K- B+ `) G8 v6 Y) W
' u8 ~$ h4 h* \3 H) P
中国地图和卫星图都存则偏移量,这个是由中国规划局,确定的,一个偏移算法,实际上是没有什么特殊规律的,他的生成算法是有规律,不过这个规律你我都很难拿到,那我们怎么解决这个偏差呢,毕竟做地图开发的都存在卫星图和地图的切换,谁不想让切换以后的地图对上呢! 后来我发现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就够了 然后就是 分析每次返回内容的规律,黄天不负有心人啊,我总算是搞定了,下面是我整理的接口
% m' j( P5 f3 T
- ?" c4 b; h" v Google 中国地图偏移接口& S4 c' z# ?4 G" @

" Z) h  L4 V( o; i3 j! x   P9 B/ ]- D7 t# o4 C/ V5 S$ V

( O( h/ U; R0 m! ]1 ]1.      接口地址:http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067
' o) G7 h# }3 I8 m# ^5 a
2 i0 H7 r( J& R" ]2 G
9 z' z3 G, H+ \- y: [
0 c( I8 K) }. v  \/ c0 h(注:.cn和.com都可以,我用国内服务器就会选择.cn用美国服务器就会选择.com)
; W+ W* F* c$ m& m  s2 G# b# k% a( L0 P3 ~" d
2.      返回内容中的有效部分:
) L% n% r) b6 Z* F
% C0 q( G# I. l. `  m3.      (39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270])
9 Z8 v7 R/ D# t4.      Spn参数暂时未知实际意义,但是需要上发spn参数,任意两个小数用逗号分开
. \% z# Q9 d8 H
% l* W: Z; ^7 q2 b; X3 c0 d3 UVp参数纬经度值,用逗号分隔,z参数为地图缩放级别,无实际意义
& l$ J6 b$ {, \# ]- c, h
# g* R6 A( l& I  r! e9 R$ B5.      取回的部分中有效数字为[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方向上维度偏移像素
2 \) [9 a( U3 ?3 T& v' [3 i- U1 F3 w5 X1 L' h& G8 |
6.      经纬度的偏移转换我们需要江经纬度39.111195,117.148067转化为18级像素值25620917 和 55392414,然后分别加上偏移量-270,1193,然后再转化为经纬度39.11231854918217 和117.15446412563324,即位偏移后的经纬度
4 T1 {$ j9 Z2 ~( b( x9 p& a2 w
( E/ P3 n3 X  v8 e; O# ~8 h. \5 x4 ~

0 K; Z2 ]3 e% M, R, P
& N, E  o' D# ~9 c: ~- c! m0 v) w# c4 z+ p0 V0 c
. U9 o0 ?, B2 \7 I% B! N
数据经度  每0.01个经纬度一个偏移量
" g) P( R) W4 y# p7 g, t
1 P3 j! r4 K5 d+ A总共数据量(9557005)条$ M; m" n# r, v, |1 \
2 X7 n0 g2 j  h4 C) u& M/ c, @
数据格式CSV文件  每一个经度一个文件
  [) t4 o+ \0 \+ R" A, W
4 ?% R# E) D7 x3 H/ e! l4 P9 W从73-134总共62个文件  总大小480MB
7 A0 w9 j5 X1 d+ e& k1 |
6 Y5 |) a; P, [5 x9 w# ^  q数据介绍  依次为  经度  纬度  此位置偏移像素X,Y放心(google地图的第18级偏移量,没向上一级除2)
) |6 ^. B; k$ u6 t! r# j! X* \" m! X
+ r  g9 o9 T! [/ L此位置经纬度偏移  保留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电子地图偏移问题
# u& C' Z) l, o+ U# y2010年1月13日ant发表评论阅读评论 8,509 views
% h' |, t$ a5 g受中国的一些政策法规的限制,Google电子地图必需加上偏移。其实,不光是google地图,国内所有做地图的公司的产品都是要加上偏移的。各公司在自己的客户端上再加上修正算法,从而保证使用他们的产品不会产生偏移。
- N) G/ `, t2 k- G& @) S
4 H9 p  x# L% H2 i8 T注意:2010/03/31 因Google更换了API,本文所提的方法已经失效。, _' r. j$ f9 ?" ~* a
请使用本站的偏移修正接口: http://www.anttna.com/goffset/goffset1.php?lat=纠偏前的纬度值&lon=纠偏前的经度值! ?9 H& ^+ Q/ c3 ^+ b7 i# w6 A- I7 d

: [. c, C8 F2 B- L, u; S4 WGoogle电子地图偏移的原理" I2 e, L9 q9 V
5 h# d4 |8 ?1 b; A: q$ i
google 地图在显示指定经纬度(lat,lon)的坐标点(x,y)点时,根据偏移函数算出该点的偏移值(a,b),把该点的坐标减去偏移值后的结果(x-a,y-b)显示在电子地图上。" h5 @" E8 c  m% b+ s
: c( j* |! A! V- Y$ g* r6 c
Google电子地图偏移的修正方法
2 H4 w) _% U; S5 L0 r0 {$ _! _( A, e) H' V; l& e/ Q& k. q. o
知道了原理后,修正的方法就很简单了:用同样的方法获取该点的偏移值(a,b),预先给定位点加上这个偏移值,把结果(x+a,y+b)提交给google map,google map再经过上面的算法处理后(x+a-a,y+b-b),显示在地图上的就是(x,y)了。0 M6 N8 [; {/ i" i5 x9 B
! C; X4 i% Q) v. C4 @  Z
如何得到该点的偏移值(a,b)?
% K  ~' V% [4 E2 Z1 {; Y! G+ x  [+ K) b0 H4 i9 C+ @( T: y
网上已经有人研究出了google获取偏移值的方法,接口地址为 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=xxxx,xxxx ,只要提交同样的经纬度到该接口,返回的结果里就包含了该经纬度的偏移值。1 g7 v$ T  W5 U' k; N
, `, E: }" r0 X1 \  ^6 [- Q% ~
为了简化操作,ant封装了该接口,可以提交经纬度到接口 http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx 直接获得偏移值。返回格式为: zoom,offset_x,offset_y
  j7 x, L! P, k+ o2 O! @: c0 o; T3 X6 P5 N+ M
zoom: 这个值在做坐标运算时需要用到。! i2 r( g' n# r; ~( n
, x# \- V3 `& U: [) N7 Q6 R
offset_x: 指定经纬度X方向的偏移值
, a# \2 O2 P, `" x' p+ C& q
% L) T' J; o4 {4 N% Q$ Xoffset_y:指定经纬度Y方向的偏移值
0 G& U, N8 `' [3 l/ p5 t3 U2 i7 M# V/ Z5 C0 K6 @
有了这三个值就可以在google map里修正坐标了' V! n' j  w# ]+ v$ T

; _$ n1 G$ @/ X9 X013 X5 p3 x* U' I2 A$ M
</p>
# U, Q: H3 v0 f- {+ E( J026 P7 t* ^! ?1 V4 f% K
<p>function convertCoord(vertex,zoom,offsetX,offsetY)<br />/ j- _$ V& v7 t; e7 v8 `% ?
03/ T) E) Z% Z6 X$ [0 I4 D9 P5 i
{<br />
. ?/ z/ B( a7 r# E# h+ [04
$ |5 U8 i! e. x# \% c5 s var projection = gMap.getCurrentMapType().getProjection();<br />, [% k, ^* t3 ?" G
05
$ F  K7 f8 m1 N7 E) K$ @var point = projection.fromLatLngToPixel(vertex, zoom);<br />
9 y! `/ s. `; _' G. w06
7 l3 s6 O  Y' S* p point = new GPoint(point.x + offsetX, point.y + offsetY);<br />
# u( C% J  [5 f3 I5 k' @# c) o( |8 }07
5 g& s$ N  i; R3 y7 K  Q; x6 J vertex = projection.fromPixelToLatLng(point, zoom);<br />
* I7 E/ |; I7 e* `# ~08
- ~# L$ {( \. i, A return vertex;<br />
* ^$ W4 N- {8 q% E4 h, l09' @% g" a8 T+ S8 H7 C: \
}</p>
' n% r. ]* l, k8 l# q) o10) T9 s9 h1 G6 ]9 D) B! D3 F
<p>var point = new GLatLng(lat,lng);//原经纬度点</p>
! {! B: s# g& P8 Q) e11
; Y/ o9 g0 p1 `, t6 }' H- Y<p>//通过接口http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx获得的数据<br />
$ Z- [8 E# z# y: K( X1 L4 I* X12& W) k% }3 p' I' |& `& N
var zoom=18;<br />
) C" Q% a& k2 N13
! w( u+ ]. @% i# bvar offset_x=100;<br />
. }) [/ o7 C+ g9 V14
- y6 O* e/ f' N+ |- k- Nvar offset_y=200;<br />2 u& g7 ~) ~. h  c" r
154 z. K% r) h  f' l
//修正经纬度<br />4 v3 A. D( f3 d, {' Y
16& ?8 G. f3 F4 m  g5 q
point=convertCoord(point,zoom,offset_x,offset_y);<br /># v! r& ?8 y! ^+ [9 K' W
17
5 X  |. I7 C1 W* C" p( q2 A//</p>
8 u  Y& t3 u- A, t8 w18! N7 y3 e1 M* t. _
<p>- ?3 j/ n5 E$ k0 T) [% |
效果测试
; M$ E& ^) Z" v  B4 J! x6 _. g( E9 b$ |
之前和zhjtan讨论过关于google map的偏移问题,这里仍然用该经纬度(22.535076,114.021229)做测试。
+ t6 W4 i1 j6 Y! _7 f3 u7 u' b8 D. `
  m6 \/ K8 g/ h! a% M. Z7 a未修正的地图(电子地图和卫星地图不一致)
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2011-6-15 14:21 | 显示全部楼层
没 看懂- j  q  l: r! i: G! u
    纯顶把``
! ]" O8 P$ P# J/ X4 L8 J
回复 支持 反对

使用道具 举报

发表于 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-3-1 02:41 , Processed in 0.306022 second(s), 17 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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