python各類經緯度轉換

2021-09-12 23:25:15 字數 4706 閱讀 5399

import math

import urllib

import json

x_pi = 3.14159265358979324 * 3000.0 / 180.0

pi = 3.1415926535897932384626 # π

a = 6378245.0 # 長半軸

ee = 0.00669342162296594323 # 扁率

class geocoding:

def __init__(self, api_key):

self.api_key = api_key

def geocode(self, address):

"""利用高德geocoding服務解析位址獲取位置座標

:param address:需要解析的位址

:return:

"""geocoding =

geocoding = urllib.urlencode(geocoding)

ret = urllib.urlopen("%s?%s" % ("", geocoding))

if ret.getcode() == 200:

res = ret.read()

json_obj = json.loads(res)

if json_obj['status'] == '1' and int(json_obj['count']) >= 1:

geocodes = json_obj['geocodes'][0]

lng = float(geocodes.get('location').split(',')[0])

lat = float(geocodes.get('location').split(',')[1])

return [lng, lat]

else:

return none

else:

return none

def gcj02_to_bd09(lng, lat):

""":param lng:火星座標經度

:param lat:火星座標緯度

:return:

"""z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi)

theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi)

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

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

return [bd_lng, bd_lat]

def bd09_to_gcj02(bd_lon, bd_lat):

""":return:轉換後的座標列表形式

"""x = bd_lon - 0.0065

y = bd_lat - 0.006

z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)

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

gg_lng = z * math.cos(theta)

gg_lat = z * math.sin(theta)

return [gg_lng, gg_lat]

def wgs84_to_gcj02(lng, lat):

"""wgs84轉gcj02(火星座標系)

:param lng:wgs84座標系的經度

:param lat:wgs84座標系的緯度

:return:

"""if out_of_china(lng, lat): # 判斷是否在國內

return lng, lat

dlat = _transformlat(lng - 105.0, lat - 35.0)

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

radlat = lat / 180.0 * pi

magic = math.sin(radlat)

magic = 1 - ee * magic * magic

sqrtmagic = math.sqrt(magic)

dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)

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

mglat = lat + dlat

mglng = lng + dlng

return [mglng, mglat]

def gcj02_to_wgs84(lng, lat):

"""gcj02(火星座標系)轉gps84

:param lng:火星座標系的經度

:param lat:火星座標系緯度

:return:

"""if out_of_china(lng, lat):

return lng, lat

dlat = _transformlat(lng - 105.0, lat - 35.0)

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

radlat = lat / 180.0 * pi

magic = math.sin(radlat)

magic = 1 - ee * magic * magic

sqrtmagic = math.sqrt(magic)

dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)

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

mglat = lat + dlat

mglng = lng + dlng

return [lng * 2 - mglng, lat * 2 - mglat]

def bd09_to_wgs84(bd_lon, bd_lat):

lon, lat = bd09_to_gcj02(bd_lon, bd_lat)

return gcj02_to_wgs84(lon, lat)

def wgs84_to_bd09(lon, lat):

lon, lat = wgs84_to_gcj02(lon, lat)

return gcj02_to_bd09(lon, lat)

def _transformlat(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 * pi) + 20.0 *

math.sin(2.0 * lng * pi)) * 2.0 / 3.0

ret += (20.0 * math.sin(lat * pi) + 40.0 *

math.sin(lat / 3.0 * pi)) * 2.0 / 3.0

ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *

math.sin(lat * pi / 30.0)) * 2.0 / 3.0

return ret

def _transformlng(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 * pi) + 20.0 *

math.sin(2.0 * lng * pi)) * 2.0 / 3.0

ret += (20.0 * math.sin(lng * pi) + 40.0 *

math.sin(lng / 3.0 * pi)) * 2.0 / 3.0

ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *

math.sin(lng / 30.0 * pi)) * 2.0 / 3.0

return ret

def out_of_china(lng, lat):

"""判斷是否在國內,不在國內不做偏移

各類經緯度轉換工具類

package com.util author daniel since 2016 7 27 0027 public class coordtransform param lng gcj02 經度 param lat gcj02 緯度 public static double transformgc...

經緯度座標轉換

經緯度與xy座標轉換工具類 public class latlngxyzconverthelper xy轉經緯度 需要轉換的x座標 需要轉換的y座標 地圖級別 轉換後的經度 轉換後的緯度 public static void tiletolatlng double tile x,double til...

經緯度格式轉換

public float dufenmiaotodu float d,float f,float m public float dutodufen fen float d public float fentofenmiao miao float f float 有效數字位數 6 double 有效數...