找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9809|回复: 10

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

[复制链接]
发表于 2011-4-14 08:42 | 显示全部楼层 |阅读模式
转自:Mark Chen 研究院5 E) C$ y" M  c; P: C: H
原文链接
* r6 p. @+ g9 p( b0 v8 IGoogle 全国 地图 纠偏数据 偏移数据 火星坐标修正 方案% L& D+ k' w6 l

% E6 U7 n# L* P/ LGPS相关 2010-04-09 10:40:05 阅读1737 评论6   字号:大中小 订阅' f7 c/ Y5 C; v; v

# ~; W  D* L/ b& Y; T. h中国地图和卫星图都存则偏移量,这个是由中国规划局,确定的,一个偏移算法,实际上是没有什么特殊规律的,他的生成算法是有规律,不过这个规律你我都很难拿到,那我们怎么解决这个偏差呢,毕竟做地图开发的都存在卫星图和地图的切换,谁不想让切换以后的地图对上呢! 后来我发现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就够了 然后就是 分析每次返回内容的规律,黄天不负有心人啊,我总算是搞定了,下面是我整理的接口
, i/ u# ?  V6 ]$ @3 J6 R4 a( S) n. J* Z# _# b5 i6 A$ `! L2 ^
Google 中国地图偏移接口& U; i+ x/ y; ^7 r
4 I2 j8 P' W" z7 N+ H" M4 q
. o9 f+ u2 R0 z# q. Z6 a. y5 e8 D/ W
! E* D2 b$ L  d6 u4 Y
1.      接口地址:http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.1480671 N# _3 S$ _  Q9 |2 p* ?

4 q& e  U5 b. G% i8 K. z  W
- @0 z: s7 B+ L6 V$ O
8 E6 q1 X% j3 z6 j: `(注:.cn和.com都可以,我用国内服务器就会选择.cn用美国服务器就会选择.com)
+ Q7 ^" ~+ N' P" J+ F
! h0 A1 K& ?) Q4 S3 Y  Q6 |2.      返回内容中的有效部分:
7 `9 \* Q) P) n7 k0 U3 o- r7 \$ B% s& O3 D7 Q# u& M
3.      (39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270])
4 g* _# \# Z! H4 j3 C" h* @0 F3 S  ~4.      Spn参数暂时未知实际意义,但是需要上发spn参数,任意两个小数用逗号分开
% Q' }- S0 u9 L: s) C
' ~4 g1 I4 O! Q# ~' pVp参数纬经度值,用逗号分隔,z参数为地图缩放级别,无实际意义
$ B3 A# Y' I, c9 A3 o3 K6 _
9 U7 D  k8 e6 `, U+ q5 j5.      取回的部分中有效数字为[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方向上维度偏移像素9 X& f  q# ]$ P# M9 q

1 M' T. |( W6 t8 j6.      经纬度的偏移转换我们需要江经纬度39.111195,117.148067转化为18级像素值25620917 和 55392414,然后分别加上偏移量-270,1193,然后再转化为经纬度39.11231854918217 和117.15446412563324,即位偏移后的经纬度
- `! b' G# H& o1 J, R* u$ o  o( N7 I7 ?% N) o, n, I7 f& j
, d) _3 W6 o1 X5 ~" i4 O
4 m1 c  N' L; J: s5 W8 q- }$ p2 j
) g: ^8 \6 O7 H. d) K

+ q( S% u9 t( [% H& W& l
3 J' _2 ~" F' M9 R3 u数据经度  每0.01个经纬度一个偏移量; Q- P/ ]* Y7 }# X* `/ [, c- Z* R* y

7 a$ ?6 x* ~! X4 ~' o$ t" A+ t. O总共数据量(9557005)条
# x' C, Q% q, d% E' T4 R1 n& b8 y& l4 A8 d. H2 Y
数据格式CSV文件  每一个经度一个文件
. ^; d  @& ~' C
$ s/ ~6 a8 f. ~  G1 ]" e从73-134总共62个文件  总大小480MB
# @$ m/ V. H: f& M: f0 O" y. w5 b* Y* \4 l- y
数据介绍  依次为  经度  纬度  此位置偏移像素X,Y放心(google地图的第18级偏移量,没向上一级除2)( b, _( c+ F: r! d- ~+ n
% N7 q5 X# I! X, _  \; \( Z
此位置经纬度偏移  保留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电子地图偏移问题9 G  O1 s- k3 K/ z
2010年1月13日ant发表评论阅读评论 8,509 views
& _9 b6 f% q; U8 s; ~( Q& H+ e受中国的一些政策法规的限制,Google电子地图必需加上偏移。其实,不光是google地图,国内所有做地图的公司的产品都是要加上偏移的。各公司在自己的客户端上再加上修正算法,从而保证使用他们的产品不会产生偏移。+ y8 U, _7 e5 z. ?  _/ o: J( }
) X5 [1 m" p( j) w, m/ P' t
注意:2010/03/31 因Google更换了API,本文所提的方法已经失效。
- K' ^" l" `* L2 I1 x请使用本站的偏移修正接口: http://www.anttna.com/goffset/goffset1.php?lat=纠偏前的纬度值&lon=纠偏前的经度值9 c' V. S* w8 K

' V2 p, A$ ]* B5 v" ]; s8 a2 |- }& GGoogle电子地图偏移的原理$ p( u( P% a. J8 w  K1 ]! u

3 [- S% H9 s& Vgoogle 地图在显示指定经纬度(lat,lon)的坐标点(x,y)点时,根据偏移函数算出该点的偏移值(a,b),把该点的坐标减去偏移值后的结果(x-a,y-b)显示在电子地图上。$ @/ J! C& R( R- d# k

2 O; I, E( I3 h( j' z' zGoogle电子地图偏移的修正方法
$ o! M5 r7 q5 |5 z" T# l/ c
$ \$ U; Q: R0 s/ H知道了原理后,修正的方法就很简单了:用同样的方法获取该点的偏移值(a,b),预先给定位点加上这个偏移值,把结果(x+a,y+b)提交给google map,google map再经过上面的算法处理后(x+a-a,y+b-b),显示在地图上的就是(x,y)了。" E3 |& l) D! o" {+ {, ?3 e
- T7 W$ k( O" k! K
如何得到该点的偏移值(a,b)?2 l- w# R0 ~% K/ I3 H
* W$ W- t. S; c7 J8 a' c# Y' R
网上已经有人研究出了google获取偏移值的方法,接口地址为 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=xxxx,xxxx ,只要提交同样的经纬度到该接口,返回的结果里就包含了该经纬度的偏移值。
$ _. U! M) s: S  h" V" }$ Q. i9 G, E' G- _+ ^
为了简化操作,ant封装了该接口,可以提交经纬度到接口 http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx 直接获得偏移值。返回格式为: zoom,offset_x,offset_y
9 L, I/ j7 i+ _) v5 ~  V* e6 {! y9 y' @& F: X* Z  E
zoom: 这个值在做坐标运算时需要用到。, ~# I3 ~( Q" Z/ Q- i" K# U) I
$ S2 u& b0 |2 v5 z
offset_x: 指定经纬度X方向的偏移值
# s+ C3 L2 J6 G/ R) o+ {  m& D  f% t  @& ^0 E6 P2 J& [6 K" `3 m
offset_y:指定经纬度Y方向的偏移值
) t4 L+ Y; W  {/ Y
. o6 i9 Y! }/ `有了这三个值就可以在google map里修正坐标了
9 W+ e7 B& G7 a- [- T3 q5 T+ w. \  O# R6 \6 r) @
01- L: V0 [- h9 V7 O6 D9 b# Y" l
</p>
, K5 `+ z! G  Q5 X7 h02+ W2 w% U* Y  p. N4 B& B
<p>function convertCoord(vertex,zoom,offsetX,offsetY)<br />
: l* O% N! }$ [  {) V) U( w03
$ R  z. W* R/ c/ j  Z! m; @* y {<br />  ]2 N* W9 q( \$ {; m
04
* a8 P6 F$ w, [- s7 L' V1 b var projection = gMap.getCurrentMapType().getProjection();<br />( \- i9 L  @. Z& Y9 N& y& U
05
* C6 a* a4 I" Svar point = projection.fromLatLngToPixel(vertex, zoom);<br />
# M) I3 h2 C# E8 H4 h/ w+ p06
1 `4 T. F0 f2 J' T& [8 M point = new GPoint(point.x + offsetX, point.y + offsetY);<br />
. ?' ~4 ]8 L/ p9 F% S0 U' ?07
) V- c  Y$ h7 K% u/ ?9 B% q, p' D vertex = projection.fromPixelToLatLng(point, zoom);<br />
9 K5 h! c% C& i2 C08
) a' y/ p1 t8 C7 T return vertex;<br />1 X6 {: X/ @) l% F
09
/ v& E; f2 X' @' C; B6 u }</p>1 M- l! b5 |' R7 M$ w3 N! F
10( X! @  a! U9 {5 K3 ?' N
<p>var point = new GLatLng(lat,lng);//原经纬度点</p>- k; m$ L9 `8 O! j( H# q/ R
11' A/ P! i5 P0 R' b1 Y( p
<p>//通过接口http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx获得的数据<br />) u3 X% o; I" k( H- ?& {' }
12
3 }& @- ^1 C, N+ e0 u+ Vvar zoom=18;<br />
4 f8 Z) \- S$ ~+ \- n1 N13  P" M$ y8 X4 ?6 t* n. i1 m1 g
var offset_x=100;<br /># K7 B$ I. e- A/ \/ l
14$ H( q0 e) o8 Z, n5 R# n9 N
var offset_y=200;<br />
- X  g' d0 K7 g2 T1 Z1 }15# [' t: [5 F* e  ]
//修正经纬度<br />
$ Q9 t/ m- `) l4 j* L6 j: _* R6 G, \161 ]1 B6 J; a, }* n! m
point=convertCoord(point,zoom,offset_x,offset_y);<br />" c) j5 l# V$ k
172 h" O/ c& m1 O9 a& O# ^2 y: r' e
//</p>$ d6 X) [6 A0 q# w
18+ A6 T# {! \4 P2 _% k  c) N
<p>) ?3 {6 i6 q* v4 g1 p: J' X3 h3 v
效果测试7 v' k  }- t9 i) B- \- A

  M! R$ F  j/ q$ M. u" c4 ^之前和zhjtan讨论过关于google map的偏移问题,这里仍然用该经纬度(22.535076,114.021229)做测试。4 h) o: m9 g+ k" J
! p; V. m  O1 N$ a7 l2 c7 ~
未修正的地图(电子地图和卫星地图不一致)
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2011-6-15 14:21 | 显示全部楼层
没 看懂
1 B7 R' h. E& Z    纯顶把``
3 s; o/ g- T! Z+ f( j- C
回复 支持 反对

使用道具 举报

发表于 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-4 10:30 , Processed in 0.322034 second(s), 17 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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