# -*- coding: utf-8 -*-
import math
from decimal import *
class transfer:
def __init__(self,key=None):
self.a=6378245.0
self.ee=Decimal(0.00669342162296594323)
def transformLng(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.0
ret += (20.0 \* math.sin(x \* math.pi) + 40.0 \* math.sin(x / 3.0 \* math.pi)) \* 2.0 / 3.0
ret += (150.0 \* math.sin(x / 12.0 \* math.pi) + 300.0 \* math.sin(x / 30.0\* math.pi)) \* 2.0 / 3.0
return ret
def transformLat(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.0
ret += (20.0 \* math.sin(y \* math.pi) + 40.0 \* math.sin(y / 3.0 \* math.pi)) \* 2.0 / 3.0
ret += (160.0 \* math.sin(y / 12.0 \* math.pi) + 320 \* math.sin(y \* math.pi / 30.0)) \* 2.0 / 3.0
return ret
def transfrom(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坐标系
def wg84\_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
#gcj02坐标转百度坐标
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.0065
bd09\_Lat = z \* math.sin(theta) + 0.006
return bd09\_Lng,bd09\_Lat
#wg84坐标转百度坐标
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)
#百度坐标转GCJ02坐标
def bd09\_to\_gcj02(self,bd09\_lng,bd09\_lat):
x = bd09\_lng - 0.0065
y = bd09\_lat - 0.006
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)
gcj02\_lng = z \* math.cos(theta)
gcj02\_lat = z \* math.sin(theta)
return gcj02\_lng,gcj02\_lat
#GCJ坐标转WG84坐标
def gcj02\_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
#将百度坐标转WG84坐标
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实现的各类坐标系转换程序,验证可行
在线的测试工具 https://tool.lu/coordinate
手机扫一扫
移动阅读更方便
你可能感兴趣的文章