找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9781|回复: 10

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

[复制链接]
发表于 2011-4-14 08:42 | 显示全部楼层 |阅读模式
转自:Mark Chen 研究院: }1 I/ p% e- [8 o
原文链接  |+ W* S6 n6 f
Google 全国 地图 纠偏数据 偏移数据 火星坐标修正 方案) A* C  ~: Q+ j" x5 @" ^* {

0 {( p  H# l( H3 j6 \& Z: ZGPS相关 2010-04-09 10:40:05 阅读1737 评论6   字号:大中小 订阅
( Q& x8 U1 F1 V3 m6 F4 I$ X; z9 l) p3 J2 N) C$ I  i
中国地图和卫星图都存则偏移量,这个是由中国规划局,确定的,一个偏移算法,实际上是没有什么特殊规律的,他的生成算法是有规律,不过这个规律你我都很难拿到,那我们怎么解决这个偏差呢,毕竟做地图开发的都存在卫星图和地图的切换,谁不想让切换以后的地图对上呢! 后来我发现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就够了 然后就是 分析每次返回内容的规律,黄天不负有心人啊,我总算是搞定了,下面是我整理的接口
; f- @8 t+ t. p: O( z  t2 Y6 Q' d- C/ |
Google 中国地图偏移接口
7 A5 t0 U5 z+ I2 M% O7 P+ s" N, ^3 S& R
9 A7 p. A# J( ?) G

; X1 U- r2 W0 G, U1.      接口地址:http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.1480679 J8 y8 x% @9 r6 p' |
- h% {+ |# s& g9 w% k

5 R. n$ B8 _2 W& P+ z% F/ ^+ |5 P4 J
(注:.cn和.com都可以,我用国内服务器就会选择.cn用美国服务器就会选择.com)7 M5 [. I; Q9 ^, u! Y# m$ j$ Z* h

  l( y3 o$ u; _' \! n1 k+ Y$ }2.      返回内容中的有效部分:
3 N1 S% o9 I. v. f; r* F' H8 F$ F+ _0 Y( R# |
3.      (39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270])& V0 v8 |  g# s2 b! y/ t3 i7 C
4.      Spn参数暂时未知实际意义,但是需要上发spn参数,任意两个小数用逗号分开
( E$ {/ K. o4 l3 P, i. w3 P1 M7 R  P" Y: D
Vp参数纬经度值,用逗号分隔,z参数为地图缩放级别,无实际意义  I; h# t8 f( n- t' ]6 U

" @2 k' X$ f9 N/ T+ X5.      取回的部分中有效数字为[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方向上维度偏移像素
4 v: c9 K5 |% W. R4 z
  w6 P) \% X$ v/ [& c6.      经纬度的偏移转换我们需要江经纬度39.111195,117.148067转化为18级像素值25620917 和 55392414,然后分别加上偏移量-270,1193,然后再转化为经纬度39.11231854918217 和117.15446412563324,即位偏移后的经纬度! F7 y, v/ \. U

2 H( n& z% `) s  W3 C4 [: E6 E
+ [' W( \+ W: t0 k0 c1 O) j# V! L$ k+ C. c1 l. N/ H8 t/ x
3 {! H$ m% H1 E8 t! E
+ b5 ]5 ~. X6 V1 A

& ~% E! h; C" |! k数据经度  每0.01个经纬度一个偏移量
2 z& M5 U2 I( r$ k  Q
; c! ~- k. G: C, Z总共数据量(9557005)条
/ c# s: ^1 Y; u8 A& n+ [; a6 J' n+ H+ n2 X" \$ W
数据格式CSV文件  每一个经度一个文件
3 ~6 W6 r" O9 y# m6 ]$ d
* R# Y0 A% V( }* u8 B: }1 ~从73-134总共62个文件  总大小480MB2 ^) t! q" t/ i( f+ A! d7 W

4 [0 c3 l2 W. K& G' l数据介绍  依次为  经度  纬度  此位置偏移像素X,Y放心(google地图的第18级偏移量,没向上一级除2)
% |, n, Q0 `4 s9 c
4 A( S* w, k( ?此位置经纬度偏移  保留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电子地图偏移问题
) J. Z; K, r0 I3 m8 @) r- @2010年1月13日ant发表评论阅读评论 8,509 views0 \( i9 k0 l$ d1 e2 z6 c
受中国的一些政策法规的限制,Google电子地图必需加上偏移。其实,不光是google地图,国内所有做地图的公司的产品都是要加上偏移的。各公司在自己的客户端上再加上修正算法,从而保证使用他们的产品不会产生偏移。: }# E/ ]+ z& k; i4 j

5 B7 a+ U! B( [' {+ v5 M, |注意:2010/03/31 因Google更换了API,本文所提的方法已经失效。8 e" o& O/ H8 d6 }* Z3 Z( K+ q
请使用本站的偏移修正接口: http://www.anttna.com/goffset/goffset1.php?lat=纠偏前的纬度值&lon=纠偏前的经度值# g+ k  t; u% Q& _/ X$ t% B+ L
; n( Y6 n9 J9 ^3 u9 |. [
Google电子地图偏移的原理
! y- _. y. |0 ]% F% m. j% V- E/ M( o# e# C
google 地图在显示指定经纬度(lat,lon)的坐标点(x,y)点时,根据偏移函数算出该点的偏移值(a,b),把该点的坐标减去偏移值后的结果(x-a,y-b)显示在电子地图上。
/ O* Z" y6 B1 u$ o7 y( I4 T
$ n% P4 ~5 T5 f& P. ^7 KGoogle电子地图偏移的修正方法9 V4 t4 m' D- _
; V, S$ ~* {/ x# u
知道了原理后,修正的方法就很简单了:用同样的方法获取该点的偏移值(a,b),预先给定位点加上这个偏移值,把结果(x+a,y+b)提交给google map,google map再经过上面的算法处理后(x+a-a,y+b-b),显示在地图上的就是(x,y)了。
- f/ ~. E5 X2 M; t! i! x$ D1 t9 z- F
, _0 l) K, [" |" F/ ~0 v如何得到该点的偏移值(a,b)?
) v4 d8 }/ w" o8 B6 ^7 D" K2 o* I( ^. ]8 O( F& k% d
网上已经有人研究出了google获取偏移值的方法,接口地址为 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=xxxx,xxxx ,只要提交同样的经纬度到该接口,返回的结果里就包含了该经纬度的偏移值。
3 J" |4 u7 U4 ^' r, L2 G& G2 j- o( F( g$ i
为了简化操作,ant封装了该接口,可以提交经纬度到接口 http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx 直接获得偏移值。返回格式为: zoom,offset_x,offset_y
2 I0 {( P/ M; m  b; E0 \
7 M3 d! B; s9 Jzoom: 这个值在做坐标运算时需要用到。  B0 H( @' l# {7 D/ o! O- E! T% k
3 ^: z" S% S4 p3 n" Y3 o
offset_x: 指定经纬度X方向的偏移值5 f. E6 R3 O( s: p2 ~
4 d5 x, Z* w/ K
offset_y:指定经纬度Y方向的偏移值: E( L( l# o% s0 K1 l8 Q5 q
0 x' p9 s9 M+ a& h4 p
有了这三个值就可以在google map里修正坐标了; T# M5 L4 ?+ h( v: ^
4 l, w8 W3 I8 G3 J+ _
01
& x9 S2 J: r! Z) f, i3 o" A</p>
  f9 G2 [( s; y) J  q7 h! V02
0 E" r4 ~. `6 c<p>function convertCoord(vertex,zoom,offsetX,offsetY)<br />* m$ P4 S! ^0 ~+ ]) \9 C9 ?
03
5 W, O" M& \, O8 {1 \7 ]9 k- k {<br />4 @( d5 M+ f1 L: v
04
9 ]* ~3 e! c  I/ ]& Z/ g var projection = gMap.getCurrentMapType().getProjection();<br />. Z9 Q" D1 p* ^/ K! N0 o& ?
05/ t; }, A8 s* S; X; x' Z
var point = projection.fromLatLngToPixel(vertex, zoom);<br />+ N. T7 _' Q" l8 K, @+ W
06
. R- A; a+ c  y! o# T- u: n9 P point = new GPoint(point.x + offsetX, point.y + offsetY);<br />8 ^+ t' J6 e- J! ?$ G
07
* j4 V2 e9 m7 M/ H( A vertex = projection.fromPixelToLatLng(point, zoom);<br />
& X( x* o' E! l! d) B& K087 ]' x3 x- `4 S! U6 {
return vertex;<br />7 K0 Y$ ]* _; K) [% W2 o# t
09  H  t( U% ~! D# K  y
}</p>
. A4 J2 H0 u' \10; x$ C/ G; o# R8 x8 O" a
<p>var point = new GLatLng(lat,lng);//原经纬度点</p>
* R  Q9 {# J0 N! ~( S( q+ J11
: `) W8 U  f' ]2 |1 X' q<p>//通过接口http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx获得的数据<br />, x; B9 d; q" Q: |/ |
12
  A) S  r' N% c1 K' c( J+ _var zoom=18;<br />5 c9 m/ F3 B6 b6 i
13
8 Q2 V& W1 J- V& E  F8 f1 Z5 P& vvar offset_x=100;<br />
  l/ H, }" ?  n, x( k" Q, x14: W3 Q/ r* q! E1 l1 D, P6 f. W
var offset_y=200;<br />
. S; G: V1 r$ z  o- Q" ~( u1 x158 K* y2 v/ Z6 c4 z2 A
//修正经纬度<br />- k% ?' |% u$ J; h/ L7 D
16, v5 v$ Z8 Y+ n
point=convertCoord(point,zoom,offset_x,offset_y);<br />$ E. C0 q. V$ b1 r3 c. j
17
% x( C9 L9 A0 _; v  p3 y2 S5 A( b//</p>+ Z8 R$ ?0 d1 ~5 j' j: s& G- q
18
4 N2 P3 Q; p4 b% P# |<p>1 X& K! u' B- }# t$ W4 g
效果测试
' z. r* X4 F, L. |
: e$ e" {/ f- {" h7 H2 j之前和zhjtan讨论过关于google map的偏移问题,这里仍然用该经纬度(22.535076,114.021229)做测试。4 l2 }& S6 R) x5 c+ x; V

0 h! y3 x/ c  T4 j/ o  x6 \未修正的地图(电子地图和卫星地图不一致)
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2011-6-15 14:21 | 显示全部楼层
没 看懂  @6 h( z5 w5 w$ Z4 _0 @1 U
    纯顶把``
. g. V) b0 Y/ a
回复 支持 反对

使用道具 举报

发表于 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-1-22 12:33 , Processed in 0.373957 second(s), 16 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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