找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9808|回复: 10

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

[复制链接]
发表于 2011-4-14 08:42 | 显示全部楼层 |阅读模式
转自:Mark Chen 研究院
5 g" H3 z- [& y! w  `5 b* w* }原文链接
1 s4 M. u7 Y  a( c; ~+ e3 CGoogle 全国 地图 纠偏数据 偏移数据 火星坐标修正 方案9 O) q( T* l: R9 h( i

8 v0 Q9 {8 H; g4 @( A7 l( AGPS相关 2010-04-09 10:40:05 阅读1737 评论6   字号:大中小 订阅0 |3 e4 S" s+ C: C0 b; L5 J, E
1 ^6 C8 H: \- ?/ M2 {0 v! f5 b
中国地图和卫星图都存则偏移量,这个是由中国规划局,确定的,一个偏移算法,实际上是没有什么特殊规律的,他的生成算法是有规律,不过这个规律你我都很难拿到,那我们怎么解决这个偏差呢,毕竟做地图开发的都存在卫星图和地图的切换,谁不想让切换以后的地图对上呢! 后来我发现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就够了 然后就是 分析每次返回内容的规律,黄天不负有心人啊,我总算是搞定了,下面是我整理的接口
7 B4 B/ }; o$ s
& ]0 I. Y: j8 F- M5 z Google 中国地图偏移接口( |/ i* U3 e% i7 z3 V
3 B& `" M) C( o
' y# p* `" d$ X2 M/ x+ `
5 g; Z3 e2 H' r6 ]
1.      接口地址:http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067
2 I  C4 C5 ~! ], p& L. y
* ]* l. \9 J5 b8 r
! f5 ?1 |7 W2 I( Q) @! \" R8 I# ~2 p! A. a0 r% y- ], H
(注:.cn和.com都可以,我用国内服务器就会选择.cn用美国服务器就会选择.com)
/ |' r# ]; I: V7 I6 R. t9 [( S0 c
2.      返回内容中的有效部分:
2 q0 r0 g; w8 \6 v: T, c9 a, S, L& H
3.      (39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270])  S/ r$ c& N3 `8 i8 [/ I  Y
4.      Spn参数暂时未知实际意义,但是需要上发spn参数,任意两个小数用逗号分开/ \( l: j( t6 m  w

( ^# X7 \5 v9 W( M! OVp参数纬经度值,用逗号分隔,z参数为地图缩放级别,无实际意义
* q! S  [3 H6 N8 J
! V5 H4 t, ~1 \% m) m; b1 C# Z5.      取回的部分中有效数字为[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方向上维度偏移像素
0 A2 z7 ]  x/ u* s$ c4 p7 l1 E
1 z2 i# s# g7 E6.      经纬度的偏移转换我们需要江经纬度39.111195,117.148067转化为18级像素值25620917 和 55392414,然后分别加上偏移量-270,1193,然后再转化为经纬度39.11231854918217 和117.15446412563324,即位偏移后的经纬度
+ g7 g# @3 G4 _$ y7 S! m  n" [/ i" K2 @# |- ^

# @: @& U) p# P( p( p) u; H+ {0 }5 Y  g' J1 P2 U7 x

/ L6 [' f  u7 `9 J; A- f, {6 Q8 q5 N$ F  e1 ?

+ m' [9 `+ w+ G, y数据经度  每0.01个经纬度一个偏移量
/ l" J; C7 W& `" e
' Z4 O- `; L7 z% Q" {9 h总共数据量(9557005)条) p2 [0 h; B% L' p% S2 u
/ O% L' T3 [' R
数据格式CSV文件  每一个经度一个文件& [) |; P6 K' D; j

1 t7 ]  o+ b- q! |0 Y9 p从73-134总共62个文件  总大小480MB
0 y( x8 S. U0 o% J& o. g
+ y& T6 _$ e( C) d& y数据介绍  依次为  经度  纬度  此位置偏移像素X,Y放心(google地图的第18级偏移量,没向上一级除2). s% O& W0 ?  X( R6 e& ?! ~

2 _: _5 M2 N" a  F此位置经纬度偏移  保留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电子地图偏移问题! Y4 y/ H$ j: O7 j1 `
2010年1月13日ant发表评论阅读评论 8,509 views( C' d5 ~; B' }* W8 F
受中国的一些政策法规的限制,Google电子地图必需加上偏移。其实,不光是google地图,国内所有做地图的公司的产品都是要加上偏移的。各公司在自己的客户端上再加上修正算法,从而保证使用他们的产品不会产生偏移。; j$ h! q: [$ M" U
9 U8 z6 G. }5 Q8 A5 a8 ~
注意:2010/03/31 因Google更换了API,本文所提的方法已经失效。
. [; V% g% N/ ?4 T# L5 ?请使用本站的偏移修正接口: http://www.anttna.com/goffset/goffset1.php?lat=纠偏前的纬度值&lon=纠偏前的经度值
: E, j( o/ {- x/ o9 \
5 s5 ]$ _" P. \2 `- Q4 aGoogle电子地图偏移的原理
. p  q/ L( p0 v! y$ a' [& z! f0 L+ U- A
google 地图在显示指定经纬度(lat,lon)的坐标点(x,y)点时,根据偏移函数算出该点的偏移值(a,b),把该点的坐标减去偏移值后的结果(x-a,y-b)显示在电子地图上。
$ a9 g  p9 t/ L( z
4 C% G* K  b& t! @7 N# Q  p* S& C9 ~Google电子地图偏移的修正方法( o2 ~) k0 {/ G. ]+ y
7 g. u9 i( `, a9 k( P( E
知道了原理后,修正的方法就很简单了:用同样的方法获取该点的偏移值(a,b),预先给定位点加上这个偏移值,把结果(x+a,y+b)提交给google map,google map再经过上面的算法处理后(x+a-a,y+b-b),显示在地图上的就是(x,y)了。) A2 M# {3 H0 H: l
& S/ a" i, e3 q( o: B! W& s. z
如何得到该点的偏移值(a,b)?
) b! o3 v6 q4 C6 K2 c' O1 b
- F3 Y8 h; R) s, S: x网上已经有人研究出了google获取偏移值的方法,接口地址为 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=xxxx,xxxx ,只要提交同样的经纬度到该接口,返回的结果里就包含了该经纬度的偏移值。
8 {) s( \6 S. D2 n0 S) ~
5 `2 j# J# _" Q2 v) L, r% Z8 {为了简化操作,ant封装了该接口,可以提交经纬度到接口 http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx 直接获得偏移值。返回格式为: zoom,offset_x,offset_y, b8 r" H5 n+ u3 }4 D
2 C/ |$ O# w& Z4 f
zoom: 这个值在做坐标运算时需要用到。
: Z+ K* Y! y0 M
- ?$ e$ ]. V1 h; l$ j2 Voffset_x: 指定经纬度X方向的偏移值. m; c* T+ |4 M! S; X/ j( O5 Y
4 m( T* m* D& }( U! l
offset_y:指定经纬度Y方向的偏移值! U: k$ Q5 u1 X: k8 n
+ W) x& P4 a* u
有了这三个值就可以在google map里修正坐标了- o- S- `, \* k- E$ S

# k, k* X3 W# X; m7 ?3 s01
) X  B0 _  i/ c$ F" r</p># f5 Z  y+ _5 I5 F$ \$ Q) e- f
02
6 H' M; k% [& t: m' g<p>function convertCoord(vertex,zoom,offsetX,offsetY)<br />
  {  `7 a5 }; u5 V- Z4 [03" A' J8 i7 F$ R) {5 M8 n
{<br />8 \/ a4 w+ ?+ f- |# j: W
04- n% k, n+ ^6 f6 F
var projection = gMap.getCurrentMapType().getProjection();<br />
% e- E/ U4 }7 L05
5 C' W( {5 x, e4 J* e2 Nvar point = projection.fromLatLngToPixel(vertex, zoom);<br />3 [* }1 L- |! L
06
) t0 g4 e/ A4 {0 m point = new GPoint(point.x + offsetX, point.y + offsetY);<br />$ C' k5 |) A3 l) o# ^, v1 W
07
8 ~0 \' w. _- E% Y3 \4 G vertex = projection.fromPixelToLatLng(point, zoom);<br />
( D# F$ o) s; K4 Z- [) O! l087 J: _; W* d/ B: g
return vertex;<br />; X4 w$ @5 V3 v0 F6 R
09# H6 H! k8 p* \4 _+ Q4 u5 m- s
}</p>5 q# W' N) a( w9 q/ ~
10* D4 k; v6 P  f, ^5 v. `4 z
<p>var point = new GLatLng(lat,lng);//原经纬度点</p>, S# V3 m; W: t  p# ]
11
( g% M' w' M7 ?$ U; Q" {" s- d* ~2 x<p>//通过接口http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx获得的数据<br />) v: L8 C' X: p: _$ o
120 b! ]5 a1 q! F6 b, H# ]6 ^- |3 F
var zoom=18;<br />6 B1 I: J" G+ x
13
  M+ |* l1 r2 _- M$ {4 Mvar offset_x=100;<br />) y# p# L. v" S. z. |3 H
14
1 U1 o+ Y, O7 ]8 s7 z0 U" Fvar offset_y=200;<br />
- c/ D, Z: W" \, |% U/ n15
% P' K: X! ]# {' v) Y//修正经纬度<br />$ n! Y. A: \( y2 Z* I
16% B  U! Q: ]9 r; m
point=convertCoord(point,zoom,offset_x,offset_y);<br />' u- r% o) @; S! g* r1 D0 Z( D4 t
17
: H* f: ?2 w; y2 N8 Y//</p>
8 B8 g. L5 U* y  t# N18
- J& l2 z# [9 w; J. U<p>
! q( g& L7 |- z9 E) o效果测试
# W; w2 O- O3 Z* t( x/ \, i  }) _! v0 i
之前和zhjtan讨论过关于google map的偏移问题,这里仍然用该经纬度(22.535076,114.021229)做测试。' p2 b# I) p2 v+ C/ K$ E
. ?: ~2 ]* N1 x  C
未修正的地图(电子地图和卫星地图不一致)
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2011-6-15 14:21 | 显示全部楼层
没 看懂, {# [/ P% R# F% v1 Z+ _4 u1 y* c
    纯顶把``8 z+ c8 V8 t, L0 ^6 W3 X+ I
回复 支持 反对

使用道具 举报

发表于 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 11:31 , Processed in 0.261896 second(s), 17 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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