找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9806|回复: 10

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

[复制链接]
发表于 2011-4-14 08:42 | 显示全部楼层 |阅读模式
转自:Mark Chen 研究院8 T9 O& j8 E- k0 F1 A
原文链接9 t! P& [* W) M  [
Google 全国 地图 纠偏数据 偏移数据 火星坐标修正 方案
* P. n, N; F6 p; ]9 S. v: C* I+ R! B5 t1 E6 q% c- c; n. h+ T
GPS相关 2010-04-09 10:40:05 阅读1737 评论6   字号:大中小 订阅
1 c+ q9 o* Q3 v$ d- J2 i/ ~' X5 j* o7 n& f$ M4 Z% k
中国地图和卫星图都存则偏移量,这个是由中国规划局,确定的,一个偏移算法,实际上是没有什么特殊规律的,他的生成算法是有规律,不过这个规律你我都很难拿到,那我们怎么解决这个偏差呢,毕竟做地图开发的都存在卫星图和地图的切换,谁不想让切换以后的地图对上呢! 后来我发现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就够了 然后就是 分析每次返回内容的规律,黄天不负有心人啊,我总算是搞定了,下面是我整理的接口
1 ]- i/ e- I. \; t6 a, R3 ]1 B: |, R$ P
Google 中国地图偏移接口
/ D2 X6 P; C! {
3 N) z7 S  W- i5 U : O( i5 T0 d0 ^/ [) {

2 Z2 k$ O  ^. ~1.      接口地址:http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=39.111195,117.148067# E& ]6 S5 @3 d; X0 I1 P7 n
1 a/ x' g* F# _8 Y* J
7 A" U$ D5 ~1 ?! e; y0 s4 m" e' \

/ m8 }7 t! }& D" G( \& S(注:.cn和.com都可以,我用国内服务器就会选择.cn用美国服务器就会选择.com)0 ^3 v9 O. g7 W: p& @$ K
6 v6 i( z+ [+ f7 v+ q4 F1 b1 W
2.      返回内容中的有效部分:
5 L2 Y( G: a% a+ Q1 K1 Q- a# X( r' B2 l  e$ r4 H- s1 h
3.      (39.111195, 117.148067, 18, [9, -2, 18, -4, 37, -8, 74, -16, 149, -33, 298, -67, 596, -135, 1193, -270])
. t3 P' Y% G7 o- @6 @# j" [4.      Spn参数暂时未知实际意义,但是需要上发spn参数,任意两个小数用逗号分开5 |+ }5 A5 V  F* h# g8 x, C
# t7 E' a) E" N8 z
Vp参数纬经度值,用逗号分隔,z参数为地图缩放级别,无实际意义) b4 u; h; |* h, J
9 a3 H% a6 O4 l' w
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方向上维度偏移像素0 b# }8 v+ F9 h; H
5 f& b. b2 ]2 N8 q7 `! R
6.      经纬度的偏移转换我们需要江经纬度39.111195,117.148067转化为18级像素值25620917 和 55392414,然后分别加上偏移量-270,1193,然后再转化为经纬度39.11231854918217 和117.15446412563324,即位偏移后的经纬度
) r7 o% r2 B& \1 M0 t6 A( [& p* ?, S4 p  k0 O! P
, K3 d  e' Y5 d  x: g5 N

/ ^  b8 Q$ d0 _
5 s1 m0 e) H0 }7 a" K$ ]& O! C9 m5 |0 y# J3 h+ T

0 D3 Y, I) C$ T, m* R" l  G数据经度  每0.01个经纬度一个偏移量! w0 \% ^+ x5 z" o6 U. d

. X# R' ~8 ]/ ~2 H  A总共数据量(9557005)条+ y) X7 z3 K: m, @' v

" M3 a5 [0 K7 G: f6 D数据格式CSV文件  每一个经度一个文件
2 o9 M6 g5 `; v. o: }# a5 L( g* c: ^
从73-134总共62个文件  总大小480MB$ `0 C/ W3 C( n; `# `" }1 A4 r
/ e5 v7 {9 |5 U. X; L
数据介绍  依次为  经度  纬度  此位置偏移像素X,Y放心(google地图的第18级偏移量,没向上一级除2)
- l. _3 B' P" T! r. x/ [3 Q7 W1 u. T
2 `5 E/ |) T. v0 B此位置经纬度偏移  保留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电子地图偏移问题
: {0 R9 C$ T1 l2010年1月13日ant发表评论阅读评论 8,509 views
( X& u+ E9 P) q+ |. X受中国的一些政策法规的限制,Google电子地图必需加上偏移。其实,不光是google地图,国内所有做地图的公司的产品都是要加上偏移的。各公司在自己的客户端上再加上修正算法,从而保证使用他们的产品不会产生偏移。2 c* o, G6 z' i5 F0 c+ [  m& D
4 e' P0 }2 t" [( D$ H$ w. c
注意:2010/03/31 因Google更换了API,本文所提的方法已经失效。
/ N1 b, J4 B! d* g+ c请使用本站的偏移修正接口: http://www.anttna.com/goffset/goffset1.php?lat=纠偏前的纬度值&lon=纠偏前的经度值
* {9 C$ N4 V0 d5 C7 m% F6 l( _& p+ w5 [& P5 w! |
Google电子地图偏移的原理
8 J9 r2 l# I& W0 f& f- X% ?, h3 M6 P6 L  U: P
google 地图在显示指定经纬度(lat,lon)的坐标点(x,y)点时,根据偏移函数算出该点的偏移值(a,b),把该点的坐标减去偏移值后的结果(x-a,y-b)显示在电子地图上。; |  e. r, B' u1 m) Y

8 d7 b& _$ z5 l/ f: I9 uGoogle电子地图偏移的修正方法% H$ ?+ K4 Y* H; P6 _9 @/ s% F2 T, X

- @: D7 |+ K0 W知道了原理后,修正的方法就很简单了:用同样的方法获取该点的偏移值(a,b),预先给定位点加上这个偏移值,把结果(x+a,y+b)提交给google map,google map再经过上面的算法处理后(x+a-a,y+b-b),显示在地图上的就是(x,y)了。& H) o8 t2 C4 Z/ u: J

9 r% P4 Z1 k& o! q2 O& Z4 C9 `( b如何得到该点的偏移值(a,b)?
- ]# y! g9 r$ Z
5 Z4 V5 o8 ?! q5 W6 e' X网上已经有人研究出了google获取偏移值的方法,接口地址为 http://ditu.google.cn/maps/vp?spn=0.0,0.0&z=18&vp=xxxx,xxxx ,只要提交同样的经纬度到该接口,返回的结果里就包含了该经纬度的偏移值。  N) P3 _: ]$ D5 Z% b- ]

/ b% m( }. k! w& I8 ]" C为了简化操作,ant封装了该接口,可以提交经纬度到接口 http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx 直接获得偏移值。返回格式为: zoom,offset_x,offset_y
5 ^9 o  W$ V9 Z+ c4 ?( ~( W3 D3 I1 H% y8 ^! j
zoom: 这个值在做坐标运算时需要用到。  Z  m: C; s4 R; Z
- T; Y+ \% W+ R$ m1 y/ t
offset_x: 指定经纬度X方向的偏移值) G4 D" I* a5 T/ m* n7 Q

/ o4 b7 n' a( j4 R$ b' ~offset_y:指定经纬度Y方向的偏移值
! L  A% G; u7 s5 G9 r/ Q1 z0 _' R' d* F: ?# @  P( W  o7 {
有了这三个值就可以在google map里修正坐标了9 T0 p2 p# f, T5 N. d7 F, P
2 v* ]1 t; |/ {: _
01( k8 ?& e* v$ w/ N3 A
</p>& W4 }0 ]# r8 g4 O$ W$ X
023 [. d6 `/ [) R. a. g9 x: C! Y, l; y
<p>function convertCoord(vertex,zoom,offsetX,offsetY)<br />, \) H$ g0 G4 }/ K2 t1 c9 Y
032 c0 L, o( Q% l4 B) @9 w' ^5 \4 t
{<br />, f! Q$ y7 Q$ P+ v9 |  |/ G
048 w/ ], H+ g  U# p" j2 U
var projection = gMap.getCurrentMapType().getProjection();<br />
3 a- ?+ w% X. d+ a8 |05& k( i' P  L. t( N" z- \
var point = projection.fromLatLngToPixel(vertex, zoom);<br />
4 V$ ^% O8 V0 s9 V6 K7 o! B+ G" E060 K0 X  U& S$ e3 I1 Z% L
point = new GPoint(point.x + offsetX, point.y + offsetY);<br />
$ S. |/ `' q( n1 i072 k- a3 o% u) R/ S
vertex = projection.fromPixelToLatLng(point, zoom);<br />- |; a% e5 ~! d! _. E: V
08' U+ b8 }4 [1 f! R! }; a
return vertex;<br />/ d8 B$ N7 \. Q4 R2 P) y
09
' l* h8 R4 R4 E" B0 m# u }</p>- H/ L$ Y( h# R4 y/ W- ]
10
8 s; W" z, K4 a<p>var point = new GLatLng(lat,lng);//原经纬度点</p>  a& Y# R' [2 _6 Y2 S
110 |8 ~7 {- L# H5 s# t( m4 n
<p>//通过接口http://www.anttna.com/goffset/goffset.php?lat=xxx&lon=xxx获得的数据<br />7 {0 n' z2 Z7 f3 Z# B
12
0 Y0 o' ^% i. ~; f3 h0 avar zoom=18;<br />
3 P" R1 Y6 i+ n) q5 ^. b13
0 _& L1 X3 l! z  ]( S$ gvar offset_x=100;<br />3 j$ b9 \' z6 B; s1 z6 y
14( [6 U. s  t6 w6 S) v2 n/ v0 ~& u" }
var offset_y=200;<br />4 T% X0 P; V! M! G- V) A
15' `+ j. t1 z/ B
//修正经纬度<br />: f% t7 \3 j; Z3 G4 I& h0 z
16
0 F- v" |8 i$ r' X) n) ~( npoint=convertCoord(point,zoom,offset_x,offset_y);<br />
8 |7 _3 e3 }( @- A7 \* x% b/ a17. ?9 R$ U% i& k$ {5 ?
//</p>
& x7 ~  S8 c' o18* {: y, D& M: y$ X
<p>& g* g1 |6 b/ F* W+ U! y! k
效果测试
4 B) g  Q+ w: O* z0 m
5 l4 h! W$ D5 Y$ Z. C5 Z" U之前和zhjtan讨论过关于google map的偏移问题,这里仍然用该经纬度(22.535076,114.021229)做测试。& S* r+ Z3 M8 {  j
$ ~: l/ p" b, }
未修正的地图(电子地图和卫星地图不一致)
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2011-6-15 14:21 | 显示全部楼层
没 看懂
7 }' ~+ n+ j& g, p    纯顶把``) a% }! S  i  z' |
回复 支持 反对

使用道具 举报

发表于 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-2 09:22 , Processed in 0.626077 second(s), 16 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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