收藏本站 劰载中...网站公告 | 吾爱海洋论坛交流QQ群:835383472

地理数据可视化|常见地图坐标系以及转换方法、转换工具,看这篇就够了! - 海洋测绘数据转化

[复制链接]
+ K% c/ ~+ ~! E3 n$ J, I* X

l 为什么要进行坐标系转换?

" K# @9 o. T @, ]

因为国内对地理坐标有特殊的政策,GPS获取的原始坐标不能在互联网上对外提供,所有电子地图必须对位置做偏移处理,这就导致从底层接口得到的坐标展示在地图上会有偏移。这种偏移不是线性的,不能简单地通过加减来校正,并且不同的地图提供商采用的算法也不一样。不同的坐标系之间可能有几十到几百米的偏移,所以在地图上绘制矢量图形、做地理数据可视化时,需要修正不同坐标系之间的偏差。

% _/ a$ G1 q8 u# i9 L% k7 {

l 关于坐标系

! W5 n; {/ |- J* Y* K# y& L7 U ?

通常GPS获取的是WGS84坐标体系,包括很多国外地图厂商提供的地图数据也是WGS84坐标体系,但是在我国,由于政策原因,在地图发布和出版的时候,坐标至少需要经过国家测绘局加密,也就是对WGS84坐标进行一次非线性加偏,得到GCJ02坐标系,俗称火星坐标。

1 K+ H( N% t {! {# I( X

另外,国内许多地图公司,由于各种原因,会在火星坐标的基础上进行二次非线性加偏,得到自己的坐标系统,各地图厂商使用坐标系情况如下 。

% G! B" i7 T, P$ ]8 v1 z
4 V8 A) P/ U8 B

l 坐标转换方法

" @3 d; `# a1 _, i3 p4 c: P

整理了一下坐标系转换的方法,仅限单个数组转换

" D8 Q5 Y. u1 i" |& E

火星坐标转wgs84

. O$ ^6 `/ h! Q h2 p" j* Y
// 火星坐标转wgs84 2 T0 ]: F }' h5 d" S. t) D; Y function gcj02towgs84(lng, lat) {; Z1 n/ b* W% ~! h0 | var x_PI = 3.14159265358979324 * 3000.0 / 180.0;% u5 e; ?8 Z' D/ U0 | var PI = 3.1415926535897932384626;* Z6 t: D! O; c, w! r var a = 6378245.0; . t" l a/ h# u1 I2 [8 ` var ee = 0.00669342162296594323;9 ~* U5 u/ k& f if ((lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false)) { 0 i' [4 N0 p% Y) j7 V5 M return [lng, lat] . a" i7 s1 O) f9 y: ^4 k; k' R }' n. e/ G6 |9 f Z- K" o$ k else { & P ]: V3 m% v% F' q* Q9 E var dlat = ((lng, lat) => { T/ B2 C/ l C* X' g# k' o. E var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));/ u0 y0 n$ |* S+ h7 z! `; y ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; 8 ?( B& Q3 [$ E# y ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; 4 O! `. Z9 D, h& a ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; , Z Z5 U7 T, e1 E! @ return ret . m0 q* {0 U' D+ t* u })(lng - 105.0, lat - 35.0); 0 ^' b& Z+ o% ? var dlng = ((lng, lat) => { : G4 L3 O. A4 D) q$ C& i! D var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); " O5 R* G0 @+ z* f ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;4 ~! B* f& \4 G' H4 ]- | ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;4 y8 U8 R+ j2 b$ I5 I \7 y! V ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; 8 h. L, N$ M# C6 {2 ^8 `! a return ret ( b$ @5 `- X! m( G. Y3 l })(lng - 105.0, lat - 35.0);* i# k2 E4 e, L; o2 x var radlat = lat / 180.0 * PI; 6 ^3 j8 a& o- S" J! w3 |! z var magic = Math.sin(radlat); 0 g: ?& P* T3 y" F% v L0 u! M/ a9 e magic = 1 - ee * magic * magic; . B% d n- s4 I% T) K var sqrtmagic = Math.sqrt(magic); ( `( i; j* \* l! e! J$ b dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); % i( O' [8 E0 P/ a4 p9 I$ H3 u1 |2 N dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); h2 A3 U! N1 p4 [ mglat = lat + dlat;% n: {, f ?* k) H9 C0 s! D mglng = lng + dlng; 8 r/ i5 ^" @" R% K& T return [lng * 2 - mglng, lat * 2 - mglat] $ k& o% g. |9 R1 y }: o/ d; i% a0 Z# ^$ L' i2 I }
5 a1 P6 K' N! b" [ c- @: c

wgs84转火星坐标

, t0 O4 t" X2 c Q1 h' |0 p
// wgs84转火星坐标( l9 C) {% ]3 A# C1 z7 D [, c W function wgs84togcj02(lng, lat) { 3 |9 @+ ]$ Y# g: c$ o var x_PI = 3.14159265358979324 * 3000.0 / 180.0; 2 I8 X9 k4 ?. q9 E, i var PI = 3.1415926535897932384626;8 Q8 v+ l0 v: _! r var a = 6378245.0; , a/ i) z' ^0 V0 J var ee = 0.00669342162296594323; & m8 L( Y2 T$ r9 r& Z- ? if ((lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false)) {1 v5 _9 n! k: `" U' }. A3 q1 P return [lng, lat] , e( b) p1 K5 P: F6 M( R( {2 }* O/ q } else {1 Y# X- W+ o( o- T4 [ var dlat = ((lng, lat) => { `" r& U9 S Q var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); , h; ?! M g4 o# c ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;% q' y4 Y1 g6 B* I5 L R0 n ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; $ l: j5 g/ ~. P6 i: |$ s3 V ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; : Y: c4 H$ y/ [4 m5 x return ret# X" W# V3 e6 N5 |2 Z* O' s })(lng - 105.0, lat - 35.0);7 P/ @1 K3 t* W; E* k2 v var dlng = ((lng, lat) => { & e9 l+ D& i4 \: u A! S" { var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));% X: m8 Z) [0 z, n; m. |. A7 v ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;5 e/ s% R" |7 g0 s ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; |* P+ K) z, J4 l: D ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;( T A9 y. Z, O0 Q! e1 a. C8 `1 T return ret , i" s8 z2 o; X |6 O$ G: B }% R- \; L: _& }/ z( a% P )(lng - 105.0, lat - 35.0); 8 Q/ S( s; c P) B4 ]5 l+ k0 t var radlat = lat / 180.0 * PI;& f2 T% Q2 r9 C! {) d var magic = Math.sin(radlat);% S, U/ t3 C" g# ]* M; R magic = 1 - ee * magic * magic;& H+ g m8 p+ d; ]/ M var sqrtmagic = Math.sqrt(magic);# p4 v6 ^6 x& e* i dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); & g2 o" N! ^0 ?& k dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); ' w: _" V. v( S4 Y: G" j1 q. J var mglat = lat + dlat; $ D" \0 b. M7 E! I: F1 |) R8 f var mglng = lng + dlng; ]$ U; \( Q3 [1 u1 N# Z6 C V return [mglng, mglat] " e ~: W) p! x4 g; s* L E }6 o) r% x; s. n* p2 P) T" E }
3 R: N! J# u6 R

百度转火星坐标

5 q8 i' n1 b8 q! \, M" ?$ U8 C
// 百度转火星坐标 4 I( t$ k4 F \ const bd2xh = (bd_lng, bd_lat) => { J3 c- }( b# T* S; I& E2 J const x_pi = Math.PI * 3000.0 / 180.0;; O2 x, R* n1 N' i' o const x = bd_lng - 0.0065; ( H8 e/ |) ]$ ]$ W. g) s! m const y = bd_lat - 0.006;6 v# Z8 t: o3 n$ h2 N% R( ^% [ let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi); g* V; j% L7 C. I let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi); 5 X% F8 F2 x# f$ R$ u return [z * Math.cos(theta), z * Math.sin(theta)]; % Q8 ^7 y, m( K* v }
* L: D9 g1 R* e; \

l 坐标转换工具

& b7 H) o, N( v0 U, e

有的静态数据不需要动态转换也有现成的在线坐标系转换工具可以直接拿来用

0 D1 S N6 ^+ }0 _' Y: o! g ! F% h5 a. m2 a2 @6 i

支持常见百度地图(BD09)、火星坐标系(GCJ02)、WGS84坐标系之间的相互转换

. {8 d" e: m2 I! r* ^) h

具体支持的坐标系转换如下

+ ]8 J* n" H7 [4 E

1)WGS-84 → GCJ-02

/ P" X$ t# m. F2 R: a- \/ G! E

2)WGS-84 → BD-09

* I/ t% Y7 U: T9 }0 S3 G( ]

2)GCJ-02 → WGS-84

$ d7 s( R' S8 H

3)GCJ-02 → BD-09

1 |& t) {, S' c/ l

4)BD-09 → GCJ-02

. ]2 W& Z! R* E3 O m

5)BD-09 → WGS-84

6 G4 S( [+ B7 \) o1 ?8 C

支持单个数组、不包含嵌套关系的对象、标准GeoJSON

% s/ \7 {. U2 r1 ^- `% _2 _: o7 G

这个工具也还可以获取行政边界数据、地图数据模拟

4 {, y6 t) [2 l. ?( \! x F
9 c9 }* u! P1 e
关注【官方微信公众号】,查看更多可视化资讯~等你呦

1、EasyV数字孪生可视化2、易知微数字孪生世界

EasyV数字孪生可视化平台免费试用

易知微官网,申请EasyV免费试用,个人版已上线,立即去免费体验!

& N( E! b! A/ f" L; |# t

免费试用期间:运营、产品、设计、技术人员专业一对一拉群指导,解答疑惑。

+ X# r% m" z# f3 \9 D% B0 n ! ^6 H, o+ e2 L8 T - F* ~: [, ^! @0 l& E" R1 X7 A% y0 Y, l 7 _$ `5 W7 A8 _& W0 g c/ W- I( b
回复

举报 使用道具

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
三观道人
活跃在昨天 18:26
快速回复 返回顶部 返回列表