#-*- coding: utf-8 -*-
#/**
#* 各地圖api座標系統比較與轉換;
#* wgs84座標系:即地球座標系,國際上通用的座標系。裝置一般包含gps晶元或者北斗晶元獲取的經緯度為wgs84地理座標系,
#* 谷歌地圖採用的是wgs84地理座標系(中國範圍除外);
#* gcj02座標系:即火星座標系,是由中國國家測繪局制訂的地理資訊系統的座標系統。由wgs84座標係經加密後的座標系。谷歌中國地圖和搜搜中國地圖採用的是gcj02地理座標系; #*/
import
math
from decimal import *
class
transfer:
def__init__(self,key=none):
self.a=6378245.0self.ee=decimal(0.00669342162296594323)
deftransformlng(self,x,y):
ret=decimal()
ret = 300.0+x+2.0*y+0.1*x*x+0.1*x*y+0.1*math.sqrt(math.fabs(x))
ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0ret += (20.0 * math.sin(x * math.pi) + 40.0 * math.sin(x / 3.0 * math.pi)) * 2.0 / 3.0ret += (150.0 * math.sin(x / 12.0 * math.pi) + 300.0 * math.sin(x / 30.0* math.pi)) * 2.0 / 3.0
return
ret
deftransformlat(self,x,y):
ret =decimal()
ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y+ 0.2 *math.sqrt(math.fabs(x))
ret += (20.0 * math.sin(6.0 * x * math.pi) + 20.0 * math.sin(2.0 * x * math.pi)) * 2.0 / 3.0ret += (20.0 * math.sin(y * math.pi) + 40.0 * math.sin(y / 3.0 * math.pi)) * 2.0 / 3.0ret += (160.0 * math.sin(y / 12.0 * math.pi) + 320 * math.sin(y * math.pi / 30.0)) * 2.0 / 3.0
return
ret
deftransfrom(self,lng,lat):
dlat = self.transformlat(lng - 105.0, lat - 35.0)
dlng = self.transformlng(lng - 105.0, lat - 35.0)
radlat = lat / 180.0 *math.pi
magic =math.sin(radlat)
magic = 1 - self.ee * decimal(magic) *decimal(magic)
sqrtmagic =math.sqrt(magic)
dlat = decimal((dlat * 180.0)) / ((decimal(self.a) * (1 - self.ee)) / (decimal(magic) * decimal(sqrtmagic)) *decimal(math.pi))
dlng = (dlng * 180.0) / (self.a / sqrtmagic * math.cos(radlat) *math.pi)
mglat = lat +float(dlat)
mglng = lng +dlng
return
mglng,mglat
#gps座標轉換為gcj02座標系
defwg84_to_gcj02(self,wg84_lng,wg84_lat):
dlat=self.transformlat(wg84_lng-105.0,wg84_lat-35.0)
dlng=self.transformlng(wg84_lng-105.0,wg84_lat-35.0)
radlat = wg84_lat / 180.0 *math.pi
magic =math.sin(radlat)
magic = 1 - self.ee * decimal(magic) *decimal(magic)
sqrtmagic =math.sqrt(magic)
dlat = decimal((dlat * 180.0)) / ((decimal(self.a) * (1 - self.ee)) / (decimal(magic) * decimal(sqrtmagic)) *decimal(math.pi))
dlng = (dlng * 180.0) / (self.a / sqrtmagic * math.cos(radlat) *math.pi)
gcj02lat = wg84_lat +float(dlat)
gcj02lng = wg84_lng +dlng
return
gcj02lng,gcj02lat
#def
gcj02_to_bd09(self,gcj02_lng,gcj02_lat):
x =gcj02_lng
y =gcj02_lat
z = math.sqrt(x * x + y * y) + 0.00002 * math.sin(y *math.pi)
theta = math.atan2(y, x) + 0.000003 * math.cos(x *math.pi)
bd09_lng = z * math.cos(theta) + 0.0065bd09_lat = z * math.sin(theta) + 0.006
return
bd09_lng,bd09_lat
#def
wg84_to_bd09(self,wg84_lng,wg84_lat):
gcj02lng,gcj02lat=self.wg84_to_gcj02(wg84_lng,wg84_lat)
return
self.gcj02_to_bd09(gcj02lng,gcj02lat)
#def
bd09_to_gcj02(self,bd09_lng,bd09_lat):
x = bd09_lng - 0.0065y = bd09_lat - 0.006z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y *math.pi)
theta = math.atan2(y, x) - 0.000003 * math.cos(x *math.pi)
gcj02_lng = z *math.cos(theta)
gcj02_lat = z *math.sin(theta)
return
gcj02_lng,gcj02_lat
#gcj座標轉wg84座標
defgcj02_to_wg84(self,gcj02_lng,gcj02_lat):
mlng,mlat=self.transfrom(gcj02_lng,gcj02_lat)
wg84_lng=gcj02_lng*2-mlng
wg84_lat=gcj02_lat*2-mlat
return
wg84_lng,wg84_lat
#def
bd09_to_wg84(self,bd09_lng,bd09_lat):
gcj02_lng, gcj02_lat=self.bd09_to_gcj02(bd09_lng,bd09_lat)
return
self.gcj02_to_wg84(gcj02_lng,gcj02_lat)
tr=transfer()
#測試
print(tr.bd09_to_gcj02(113.30764968,23.1200491)) #
轉換正確
print(tr.bd09_to_wg84(113.30764968,23.1200491)) #
轉換正確
print(tr.wg84_to_bd09(113.30764968,23.1200491)) #
轉換正確
由python實現的各類座標系轉換程式,驗證可行
arcgis 經緯度轉大地座標 大地經緯度轉UTM
在日常gnss應用中,常需要應用到utm座標,而python提供了較為完備座標轉換工具,無需再去用arcgis了。首先貼出幾個帖子,值得一讀,其次,說一下要用到的工具,pyproj,其源於proj4庫 安裝 pip install pyproj 呼叫 import pyproj 再者,庫函式使用,先...
經緯度座標系轉東北天 經緯度座標系轉換
網際網路地圖的座標系現狀 地球座標 wgs84 國際標準,從 gps 裝置中取出的資料的座標系 國際地圖提供商使用的座標系 火星座標 gcj 02 也叫國測局座標系 中國標準,從國行移動裝置中定位獲取的座標資料使用這個座標系 國家規定 國內出版的各種地圖系統 包括電子形式 必須至少採用gcj 02對...
python 編寫的經緯度座標轉換類
測試 coding utf 8 各地圖api座標系統比較與轉換 wgs84座標系 即地球座標系,國際上通用的座標系。裝置一般包含gps晶元或者北斗晶元獲取的經緯度為wgs84地理座標系,谷歌地圖採用的是wgs84地理座標系 中國範圍除外 gcj02座標系 即火星座標系,是由中國國家測繪局制訂的地理資...