python读取数据文件、并把里面的数据变成x的二维坐标_(数据科学学习手札60)用Python实现WGS84、火星坐标系、百度坐标系、web墨卡托四种坐标相互转换...

importmathclassLngLatTransfer():def __init__(self):

self.x_pi= 3.14159265358979324 * 3000.0 / 180.0self.pi= math.pi #π

self.a = 6378245.0 #长半轴

self.es = 0.00669342162296594323 #偏心率平方

pass

defGCJ02_to_BD09(self, gcj_lng, gcj_lat):"""实现GCJ02向BD09坐标系的转换

:param lng: GCJ02坐标系下的经度

:param lat: GCJ02坐标系下的纬度

:return: 转换后的BD09下经纬度"""z= math.sqrt(gcj_lng * gcj_lng + gcj_lat * gcj_lat) + 0.00002 * math.sin(gcj_lat *self.x_pi)

theta= math.atan2(gcj_lat, gcj_lng) + 0.000003 * math.cos(gcj_lng *self.x_pi)

bd_lng= z * math.cos(theta) + 0.0065bd_lat= z * math.sin(theta) + 0.006

returnbd_lng, bd_latdefBD09_to_GCJ02(self, bd_lng, bd_lat):'''实现BD09坐标系向GCJ02坐标系的转换

:param bd_lng: BD09坐标系下的经度

:param bd_lat: BD09坐标系下的纬度

:return: 转换后的GCJ02下经纬度'''x= bd_lng - 0.0065y= bd_lat - 0.006z= math.sqrt(x * x + y * y) - 0.00002 * math.sin(y *self.x_pi)

theta= math.atan2(y, x) - 0.000003 * math.cos(x *self.x_pi)

gcj_lng= z *math.cos(theta)

gcj_lat= z *math.sin(theta)returngcj_lng, gcj_latdefWGS84_to_GCJ02(self, lng, lat):'''实现WGS84坐标系向GCJ02坐标系的转换

:param lng: WGS84坐标系下的经度

:param lat: WGS84坐标系下的纬度

:return: 转换后的GCJ02下经纬度'''dlat= self._transformlat(lng - 105.0, lat - 35.0)

dlng= self._transformlng(lng - 105.0, lat - 35.0)

radlat= lat / 180.0 *self.pi

magic=math.sin(radlat)

magic= 1 - self.es * magic *magic

sqrtmagic=math.sqrt(magic)

dlat= (dlat * 180.0) / ((self.a * (1 - self.es)) / (magic * sqrtmagic) *self.pi)

dlng= (dlng * 180.0) / (self.a / sqrtmagic * math.cos(radlat) *self.pi)

gcj_lng= lat +dlat

gcj_lat= lng +dlngreturngcj_lng, gcj_latdefGCJ02_to_WGS84(self, gcj_lng, gcj_lat):'''实现GCJ02坐标系向WGS84坐标系的转换

:param gcj_lng: GCJ02坐标系下的经度

:param gcj_lat: GCJ02坐标系下的纬度

:return: 转换后的WGS84下经纬度'''dlat= self._transformlat(gcj_lng - 105.0, gcj_lat - 35.0)

dlng= self._transformlng(gcj_lng - 105.0, gcj_lat - 35.0)

radlat= gcj_lat / 180.0 *self.pi

magic=math.sin(radlat)

magic= 1 - self.es * magic *magic

sqrtmagic=math.sqrt(magic)

dlat= (dlat * 180.0) / ((self.a * (1 - self.es)) / (magic * sqrtmagic) *self.pi)

dlng= (dlng * 180.0) / (self.a / sqrtmagic * math.cos(radlat) *self.pi)

mglat= gcj_lat +dlat

mglng= gcj_lng +dlng

lng= gcj_lng * 2 -mglng

lat= gcj_lat * 2 -mglatreturnlng, latdefBD09_to_WGS84(self, bd_lng, bd_lat):'''实现BD09坐标系向WGS84坐标系的转换

:param bd_lng: BD09坐标系下的经度

:param bd_lat: BD09坐标系下的纬度

:return: 转换后的WGS84下经纬度'''lng, lat=self.BD09_to_GCJ02(bd_lng, bd_lat)returnself.GCJ02_to_WGS84(lng, lat)defWGS84_to_BD09(self, lng, lat):'''实现WGS84坐标系向BD09坐标系的转换

:param lng: WGS84坐标系下的经度

:param lat: WGS84坐标系下的纬度

:return: 转换后的BD09下经纬度'''lng, lat=self.WGS84_to_GCJ02(lng, lat)returnself.GCJ02_to_BD09(lng, lat)def_transformlat(self, lng, lat):

ret= -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat +\0.1 * lng * lat + 0.2 *math.sqrt(math.fabs(lng))

ret+= (20.0 * math.sin(6.0 * lng * self.pi) + 20.0 *math.sin(2.0 * lng * self.pi)) * 2.0 / 3.0ret+= (20.0 * math.sin(lat * self.pi) + 40.0 *math.sin(lat/ 3.0 * self.pi)) * 2.0 / 3.0ret+= (160.0 * math.sin(lat / 12.0 * self.pi) + 320 *math.sin(lat* self.pi / 30.0)) * 2.0 / 3.0

returnretdef_transformlng(self, lng, lat):

ret= 300.0 + lng + 2.0 * lat + 0.1 * lng * lng +\0.1 * lng * lat + 0.1 *math.sqrt(math.fabs(lng))

ret+= (20.0 * math.sin(6.0 * lng * self.pi) + 20.0 *math.sin(2.0 * lng * self.pi)) * 2.0 / 3.0ret+= (20.0 * math.sin(lng * self.pi) + 40.0 *math.sin(lng/ 3.0 * self.pi)) * 2.0 / 3.0ret+= (150.0 * math.sin(lng / 12.0 * self.pi) + 300.0 *math.sin(lng/ 30.0 * self.pi)) * 2.0 / 3.0

returnretdefWGS84_to_WebMercator(self, lng, lat):'''实现WGS84向web墨卡托的转换

:param lng: WGS84经度

:param lat: WGS84纬度

:return: 转换后的web墨卡托坐标'''x= lng * 20037508.342789 / 180y= math.log(math.tan((90 + lat) * self.pi / 360)) / (self.pi / 180)

y= y * 20037508.34789 / 180

returnx, ydefWebMercator_to_WGS84(self, x, y):'''实现web墨卡托向WGS84的转换

:param x: web墨卡托x坐标

:param y: web墨卡托y坐标

:return: 转换后的WGS84经纬度'''lng= x / 20037508.34 * 180lat= y / 20037508.34 * 180lat= 180 / self.pi * (2 * math.atan(math.exp(lat * self.pi / 180)) - self.pi / 2)return lng, lat

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值