中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用Python實現地理位置和經緯度坐標之間的轉換

發布時間:2021-10-09 16:13:15 來源:億速云 閱讀:243 作者:柒染 欄目:編程語言

如何用Python實現地理位置和經緯度坐標之間的轉換 ,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

做地圖可視化時需要提供經緯度坐標,但一般來說我們手上拿到的通常只有地理位置,比如說 北京市東大街302號狗不理包子店,可視化之前需經緯度坐標轉換

需要轉換的數據如果僅有幾個還好,可以直接借助谷歌地圖自帶經緯度查詢手動轉換,但真實場景下需要轉換的數據量可能要上百甚至上千,再手動的話就比較頭疼了

如何將地理位置批量轉化為經緯度坐標?將針對這個問題,介紹兩個用 Python 來實現的方法

1,調用第三方 API

最常見辦法就是調用第三方 API,例如百度、高德地圖等服務平臺,提供了相應的功能接口,它們的這類技術已經非常成熟啦,準確穩定,關鍵還是免費的  ~,本期教程以百度為例(高德的用方類似),介紹一下其用法

1.1,用百度賬號登陸百度地圖控制臺

百度地圖開放平臺

如何用Python實現地理位置和經緯度坐標之間的轉換

1.2,創建一個應用,獲取 AK 參數

登錄控制臺之后,選擇左側 應用管理-> 我的應用 -> 創建應用

如何用Python實現地理位置和經緯度坐標之間的轉換

創建應用頁面中有三項信息需要填寫

  • 應用名稱,無限制隨意填寫即可;

  • 應用類型 ,選擇服務端;

  • IP 白名單,只是個人簡單測試的話0.0.0.0/0 即可,如果考慮安全問題, 可以將自己的 IP 填進去, AK 參數泄露的話非本機 IP  無法訪問,這樣也不用擔心額度被其他用戶盜用

如何用Python實現地理位置和經緯度坐標之間的轉換

1.3,地理編碼、逆地理編碼

經緯度地理位置根據轉換方向分為兩類,接下來我們分別演示一下其用法:

  • 地理編碼:將地理地址轉換為坐標點(經緯度);

  • 逆地理編碼,將經緯度轉化為地理地址;

1.3.1 地理編碼,

下面就是 Python 測試代碼塊,將 AK 參數(前面申請到的)和你需要轉換的地理位置拼接到 官方提供的 url 中,用 requests  訪問即可,

import requests import json import re  AK = '你的AK' address ='北京市海淀區上地十街10號' url = 'http://api.map.baidu.com/geocoding/v3/?address={}&output=json&ak={}&callback=showLocation'.format(address,AK) res = requests.get(url)  print(res.text) results = json.loads(re.findall(r'\((.*?)\)',res.text)[0])  print('\n') print('location is ',results['result']['location'])

輸出結果如下

showLocation&&showLocation({"status":0,"result":{"location":{"lng":116.3084202915042,"lat":40.05703033345938},"precise":1,"confidence":80,"comprehension":100,"level":"門址"}})   location is  {'lng': 116.3084202915042, 'lat': 40.05703033345938}

1.3.2 逆地理編碼

逆地理編與地理編碼用法相似

lat = '40.05703033345938' lng = '116.3084202915042' AK = '你的AK'   url = 'http://api.map.baidu.com/reverse_geocoding/v3/?ak={}&output=json&coordtype=wgs84ll&location={},{}'.format(AK,lat,lng)  res = requests.get(url)  print(res.text) address = json.loads(res.text)['result']['formatted_address']  print('\n') print('address is ',address)

像我們這類免(bai) 費 piao) 用戶,借助百度 API 每天最高可調用 6000  次,這個量級基本上能滿足我們日常需要,但如果這個數量滿足不了你的話,可以在線購買更高的使用額度

如何用Python實現地理位置和經緯度坐標之間的轉換

2,Geopy

2.1 Geopy 庫介紹

這里介紹一個Python 包 Geopy ,借助它也可以實現經緯度地理位置轉換,

這款包之經緯度轉換原理其實還是借助了第三方 API 平臺,因為市面上提供經緯度轉換 第三方平臺很多,為了方便, Geopy  把這些接口都分別封裝在一個類中,借助 Geopy 模塊來調用,支持的第三放平臺如下

如何用Python實現地理位置和經緯度坐標之間的轉換

Geopy作為一個專注于地理處理包之外, 除了能實現上面地理編碼、逆地理編碼功能之外,還有一個其它令我經驗的功能,  提供兩個經緯度坐標,計算他們在地球上的最短距離

下面將介紹一下 Geopy 的具體用法,

2. 2 地理編碼

使用 地理編碼功能時,需要借助 Geopy 的 geocoders 模塊,Geopy 把所有第三方API封裝到 geocoders 中

如何用Python實現地理位置和經緯度坐標之間的轉換

這里選用 OpenStreetMap 平臺上提供的 Nominatim 地理編碼器,因為可以免費供我們使用,不需要申請 API  ,但缺點是限流,限額,不能大規模頻繁訪問,否則會返回 403,429錯誤代碼

from geopy.geocoders import Nominatim geolocator=Nominatim() location= geolocator.geocode("北京市海淀區西二旗北路") print(location.address) print(location.latitude,location.longitude)

結果如下

西二旗北路, 東北旺村, 海淀區, 北京市, 102208, 中國 40.056793 116.305811

2.3 逆地理編碼

from geopy.geocoders import Nominatim geolocator=Nominatim() location= geolocator.reverse("40.056793 116.305811") print(location.address)

結果如下

1#, 西二旗北路, 東北旺村, 海淀區, 北京市, 102208, 中國

結果看起來還不錯,簡單方便;但提醒一下,因為前面說過 Nominatim 模塊是限額度的,不要頻繁訪問,否則會出現以下錯誤

如何用Python實現地理位置和經緯度坐標之間的轉換

2.4 根據經緯度計算距離

Geopy 最讓我驚喜的是這個用法,提供兩個經緯度坐標計算他們之間的距離,因為地球具體來說是橢圓,所以不能按照常規方法來計算  ,目前現有比較流行的幾個模型有以下幾個

model             major (km)   minor (km)     flattening 'WGS-84':        (6378.137,    6356.7523142,  1 / 298.257223563), 'GRS-80':        (6378.137,    6356.7523141,  1 / 298.257222101), 'Airy (1830)':   (6377.563396, 6356.256909,   1 / 299.3249646), 'Intl 1924':     (6378.388,    6356.911946,   1 / 297.0), 'Clarke (1880)': (6378.249145, 6356.51486955, 1 / 293.465), 'GRS-67':        (6378.1600,   6356.774719,   1 / 298.25), }

根據官方介紹,官網選擇的是 WGS-84 模型,根據統計最終計算到的距離誤差最高在0.5%左右;使用方法如下

from geopy import distance newport_ri = (41.49008, -71.312796) cleveland_oh = (41.499498, -81.695391) print(distance.distance(newport_ri, cleveland_oh).miles)#最后以英里單位輸出  #output 538.39044536  wellington = (-41.32, 174.81) salamanca = (40.96, -5.50) print(distance.distance(wellington, salamanca).km)# 以 km 作為單位輸出 19959.6792674

3 批量地址坐標轉換

上面聊了這么多知識點,下面引入一個案例來簡單回顧一下;本案例中借助百度API 來實現地理位置坐標轉換,把一個 csv  表格內的所有地址位置數據批量轉換為經緯度

3.1 數據讀取

import pandas as pd import string data_path = 'H:/Data/Latlon/map-location.csv' df = pd.read_csv(data_path,encoding='GB18030') df

一共有 98  條數據,每條數據都表示一個地理位置;數據明顯有一些擾亂項,例如左端的數字字符、以及數據中的分隔符\t;因此轉換之前需要對數據進行一次預處理操作

如何用Python實現地理位置和經緯度坐標之間的轉換

3.2 數據預處理

def process_str(x):     # 數據預處理,去掉前面的數字、及字符串中 \t     x = str(x).replace('\t','')     x = str(x).strip(string.digits)     return x  df['location']  = df['location'].apply(process_str) df

預處理結果如下

如何用Python實現地理位置和經緯度坐標之間的轉換

3.3 地理編碼(經緯度轉換)

import time start = time.time() AK = '你的AK' def get_location(str1):     # 獲取經緯度坐標     url = 'http://api.map.baidu.com/geocoding/v3/?address={}&output=json&ak={}&callback=showLocation'.format(str1,AK)     res = requests.get(url)     results = json.loads(re.findall(r'\((.*?)\)',res.text)[0])     return (results['result']['location']['lat'],results['result']['location']['lng']) df['(lat,lng)'] = df['location'].apply(get_location) print('耗時 {}s'.format(time.time()-start)) print(df)

為了測試轉換效率,這里我加了一個計時器;98 條數據成功轉換后共耗時 4.65s 左右,效率還不錯,要比 Geopy 優秀得多,

如何用Python實現地理位置和經緯度坐標之間的轉換

3.5 案例源碼數據

我已經把本案例中用到代碼的數據打包再一起了,感興趣的可以在公號后臺回復關鍵字:210418 ,即可獲取!

上面介紹了這么多,最后做個小結;聊一下這兩種方法在 地理坐標轉換方面 各自的優勢和劣勢

第三方API

  • 優勢:地理編碼、逆編碼比較準確,精度高;且支持高并發;

  • 劣勢:不支持國外,環境配置較為復雜;

Geopy (用 Nominatim 模塊的話)

  • 優勢:簡單方便,上手快;支持國外地理編碼

  • 劣勢:不支持并發訪問、效率低且精度較低;

這里給大家一個建議,如果地址數據在國內的話 經緯度轉換 建議用第三方 API,穩定且準確;若是涉及下緯度距離計算、單位換算或地址數據在國外,建議用  Geopy

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

运城市| 宁河县| 翁源县| 固镇县| 那坡县| 会东县| 孝昌县| 秀山| 凤阳县| 富裕县| 浦北县| 枣阳市| 定边县| 贵德县| 依安县| 遂宁市| 江孜县| 周至县| 安康市| 堆龙德庆县| 阿拉善盟| 武义县| 龙山县| 福州市| 玉屏| 榆中县| 新邵县| 徐汇区| 黔西| 乐都县| 云霄县| 兴山县| 思茅市| 仙桃市| 修武县| 漠河县| 宜良县| 石楼县| 盈江县| 文水县| 博爱县|