Python原始碼 GCJ02轉WGS84座標

2021-10-09 06:00:55 字數 3449 閱讀 1400

#!/usr/bin/env python

# -*- encoding: utf-8 -*-

# file : gcj_wgs84.py

# author : zhenbei

# date : 2020-08-15 13:22

import json

import urllib

import math

import pandas as pd

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_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 _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):

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

:param lng:

:param lat:

:return:

"""return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)

if __name__ == '__main__':

dat=pd.read_csv('150908out.csv',encoding='gbk')

lock_list=dat['location'].tolist()

wgs84=

print(lock_list)

for i in lock_list:

print(i, type(i))

lng = i.split(',')[0]

lat = i.split(',')[1]

result4 = gcj02_to_wgs84(float(lng),float(lat) )

dat['wgs84']=wgs84

res=pd.dataframe(dat['wgs84'])

res.to_csv('parkplot2.csv',encoding='gbk')

WGS 84座標系轉GCJ02座標系

最近用到某個定位介面,返回的是wsg 84座標系下的經緯度資訊,但專案前端使用的是高德地圖,發現位置有偏移。需要進行座標轉換才能正常顯示。各地圖api座標系統比較 wgs84座標系 即地球座標系,國際上通用的座標系。裝置一般包含gps晶元或者北斗晶元獲取的經緯度為wgs84地理座標系。谷歌地圖採用的...

GCJ 02火星座標系和WGS 84座標系轉換關係

公式 a 6378245.0 長半軸 ee 0.00669342162296594323 扁率 def wgs84togcj02 lng,lat wgs84轉gcj02 火星座標系 param lng wgs84座標系的經度 param lat wgs84座標系的緯度 return if out o...

gcj 02和wgs84地理座標系的相互轉換原理

請求引數中的coord type控制的是請求引數中的bounds或者location的座標系統 地理座標的加密存在侷限性。因為 地理座標是連續的 空間的本質 加密後的地理座標是連續的 地圖的本質 加密函式是連續的 地圖的本質 如果假設加密函式是 f x 我們還可以直觀地知道,對於鄰近的兩個地理座標x...