找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9811|回复: 10

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

[复制链接]
发表于 2011-4-14 08:42 | 显示全部楼层 |阅读模式
转自:Mark Chen 研究院* W4 [7 Y, Y4 _2 j% Z* j9 a* [- F
原文链接
, |% H4 f) l7 ^) t+ t# B8 ^Google 全国 地图 纠偏数据 偏移数据 火星坐标修正 方案
& @4 w9 h& K) u% H/ \) V1 k- \
; s$ z" w. p- [' k) a4 rGPS相关 2010-04-09 10:40:05 阅读1737 评论6   字号:大中小 订阅
% y7 s, \6 F! r  U% q8 N
( Q, V, ~  R9 m# 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就够了 然后就是 分析每次返回内容的规律,黄天不负有心人啊,我总算是搞定了,下面是我整理的接口
' ^; G9 y% c1 D# g; M# g
+ p4 u' Q; g. C0 D5 t Google 中国地图偏移接口3 V; c2 q5 ?$ X* A9 z1 O& x! R

9 @( B& w+ j6 d3 P& ^7 [+ v! q% P
3 q+ Z) i) g. T+ ~2 P. x) \3 n& C) ]0 P, q  Y: M2 p
1.      接口地址:http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067
) T7 ~: d9 g' _6 f+ ^0 _: x
3 t7 M$ g+ _( ^8 m! \6 I: \
  n. f4 @7 R# n; z+ R) r2 V  w
" g; T1 w& u3 z& k! D(注:.cn和.com都可以,我用国内服务器就会选择.cn用美国服务器就会选择.com)
8 x4 G) F9 s+ Z1 K- A9 V6 S
. k7 f' H! E# c% I# ^2.      返回内容中的有效部分:3 g6 x* b1 I2 Q6 ]0 N
, r6 Z" d$ Q6 F6 ]6 @
3.      (39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270])
! `7 m( Z5 I- u+ |4.      Spn参数暂时未知实际意义,但是需要上发spn参数,任意两个小数用逗号分开5 C) |6 U8 u" L& D) S
/ B8 o5 a( f! r: y, j+ }
Vp参数纬经度值,用逗号分隔,z参数为地图缩放级别,无实际意义
+ g! A7 A' Z( n, I5 n' i2 l0 Q! Q! x: h- H1 p! x7 T9 G
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方向上维度偏移像素
7 J4 m! z8 z7 `" D- @- G9 m. ^1 D) ?$ G3 p/ ?
6.      经纬度的偏移转换我们需要江经纬度39.111195,117.148067转化为18级像素值25620917 和 55392414,然后分别加上偏移量-270,1193,然后再转化为经纬度39.11231854918217 和117.15446412563324,即位偏移后的经纬度
) ?% E* m) q* r' q7 D. J  |' w2 j7 x  |0 L; W, E* Z# O
0 n% g- g6 \8 y. _

  ?+ Q8 z+ [7 }& H: p8 Y  @9 W" {5 f$ [+ T# S! I
! c' x# P+ s$ a" J
+ s  f" Q* F+ y0 x% R5 P
数据经度  每0.01个经纬度一个偏移量, m8 i; G2 {0 \4 w9 u. i% \4 \
  J( E9 X3 |# T3 ]
总共数据量(9557005)条5 [# G6 U0 }5 W2 A6 `" \4 N1 ^. T( Z
' w$ M4 b( e- F+ w- B; B
数据格式CSV文件  每一个经度一个文件
4 Z, M/ b* A- S& c  l
: Y" V$ s( f) }从73-134总共62个文件  总大小480MB3 H  _' t/ E% D8 Y
) y1 }) g0 W% \6 F- a
数据介绍  依次为  经度  纬度  此位置偏移像素X,Y放心(google地图的第18级偏移量,没向上一级除2)
: |9 Z* M, o" ?
0 w) A. _, [) m7 S* F7 o* `此位置经纬度偏移  保留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电子地图偏移问题, v+ S' V3 F" B# _
2010年1月13日ant发表评论阅读评论 8,509 views
% ~8 G; Q# C1 G* S1 p, B1 t受中国的一些政策法规的限制,Google电子地图必需加上偏移。其实,不光是google地图,国内所有做地图的公司的产品都是要加上偏移的。各公司在自己的客户端上再加上修正算法,从而保证使用他们的产品不会产生偏移。7 a3 B3 N; s8 k7 M8 P
/ Z- V) Y+ [& L0 C& O
注意:2010/03/31 因Google更换了API,本文所提的方法已经失效。. [2 a% E  y* i" R2 l: b; [
请使用本站的偏移修正接口: http://www.anttna.com/goffset/goffset1.php?lat=纠偏前的纬度值&lon=纠偏前的经度值2 m# A/ v" y% Y
/ X8 Y4 z* b5 a3 q. r7 z0 Z
Google电子地图偏移的原理/ G! X; e& d1 m! n6 e
' C9 p. _) v/ S
google 地图在显示指定经纬度(lat,lon)的坐标点(x,y)点时,根据偏移函数算出该点的偏移值(a,b),把该点的坐标减去偏移值后的结果(x-a,y-b)显示在电子地图上。( u; [- X9 G7 _7 t4 h
. T5 X/ @0 [5 C7 U; W# F
Google电子地图偏移的修正方法
$ u4 m. o% h9 `" N6 n: K! r. f- ~4 t! i* X9 j3 h
知道了原理后,修正的方法就很简单了:用同样的方法获取该点的偏移值(a,b),预先给定位点加上这个偏移值,把结果(x+a,y+b)提交给google map,google map再经过上面的算法处理后(x+a-a,y+b-b),显示在地图上的就是(x,y)了。4 V( R) G" i& u' i$ Y6 n

/ q7 J1 T* |" |如何得到该点的偏移值(a,b)?% R; P3 M( ~' f# k) f
8 I$ s8 O, t  f4 ?# @3 b$ z  \
网上已经有人研究出了google获取偏移值的方法,接口地址为 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=xxxx,xxxx ,只要提交同样的经纬度到该接口,返回的结果里就包含了该经纬度的偏移值。1 [0 Q1 b9 |! }9 ]- z5 _
: y1 a* t6 _) h: O* T! J
为了简化操作,ant封装了该接口,可以提交经纬度到接口 http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx 直接获得偏移值。返回格式为: zoom,offset_x,offset_y
% a  d& {- h7 N6 u1 M* A% E) k( `+ S$ G! I3 [3 j( d1 a
zoom: 这个值在做坐标运算时需要用到。$ u* F3 A* d# @/ s2 l; a) U

' `# Q6 j) n& x" ^! Noffset_x: 指定经纬度X方向的偏移值! N* I7 L5 G! d, o1 r8 f6 A- \
2 s6 x0 O" M% o& W
offset_y:指定经纬度Y方向的偏移值
- V- Q" w6 z  i  W! v* _& S
2 [  ~2 s: P5 _# [( S有了这三个值就可以在google map里修正坐标了
) L: b1 _/ D) x) E! b7 h  k% {0 d" |
01" D9 j. o( G3 B* K' P& y
</p>
, m& A+ b/ n; @) k" R: a02
/ _! Y7 y! p5 l. p% ?<p>function convertCoord(vertex,zoom,offsetX,offsetY)<br />
( d' I! K  u$ V" s+ E/ j" m; ?4 I03+ B" r5 F) m/ B1 K# P! D" i
{<br />
0 s8 L' P8 a8 k$ ^% z044 Z5 C9 S/ G! c* O/ c) J% r% m
var projection = gMap.getCurrentMapType().getProjection();<br />! }# l0 A6 D, Y
05
; q- B) p, b2 ?) q, f! u( I  {9 s3 Wvar point = projection.fromLatLngToPixel(vertex, zoom);<br />
# |: x4 d. E1 Y# d8 ^06- [* _5 y* k7 U. g, L, ~/ ]
point = new GPoint(point.x + offsetX, point.y + offsetY);<br />8 a% H, A4 j7 A
07
9 z& y$ p8 Z9 t' a2 x5 P) n# j vertex = projection.fromPixelToLatLng(point, zoom);<br />
" ]8 |* V% s8 O08! P! g8 Q6 P8 x  ~. ?) w) L
return vertex;<br />
" ]! r! ^! q3 Q  b- A09
8 S; o' w2 q& `' `/ p: G7 |( F% C }</p>2 I9 `0 j& w& {: I* d
10  j2 }( {' K/ _
<p>var point = new GLatLng(lat,lng);//原经纬度点</p>
' X7 Q) a  |* J9 P11* r4 v1 @" U- J0 {
<p>//通过接口http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx获得的数据<br />
( f2 k5 E1 ~% r9 `$ \12, b  N* A& D- N' q& p
var zoom=18;<br />
4 B9 W. B; e  U- f( c13
; ?0 L3 S3 c* Q  c( @& nvar offset_x=100;<br />
5 M. h# U4 e& w. z141 Q* R- H  _3 R5 o9 @
var offset_y=200;<br />4 p& g( m$ q6 D( t( J5 n
15; A2 A" s  g/ Y) A; R3 B, L
//修正经纬度<br />
* X) m5 c# J6 \  I16' o$ {) @8 c. I9 j
point=convertCoord(point,zoom,offset_x,offset_y);<br />5 S* |: F- h+ W4 o. c: f
17% ^0 I4 t* [* M7 k- [
//</p>
2 g3 J/ a" n% Q& i2 q18
& [, Y, c1 [* B- i- \" z" W<p>
3 n) p( ~% N3 P! |, r效果测试& r; H! l" y9 X( |7 D  s5 m
4 G+ c7 k( Q+ n/ e  F* H' s3 t
之前和zhjtan讨论过关于google map的偏移问题,这里仍然用该经纬度(22.535076,114.021229)做测试。% b! f! y, y9 D1 i" T

. n- L+ J# n# L4 j4 P  e6 K) d未修正的地图(电子地图和卫星地图不一致)
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2011-6-15 14:21 | 显示全部楼层
没 看懂" s, B; |( ^* v! d
    纯顶把``5 B9 i8 m5 i' }2 m$ R& M
回复 支持 反对

使用道具 举报

发表于 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-26 12:52 , Processed in 0.335439 second(s), 17 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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