偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

地理位置和經(jīng)緯度坐標之間如何轉(zhuǎn)換? Python 教你批量實現(xiàn)

開發(fā) 后端
做地圖可視化時需要提供經(jīng)緯度坐標,但一般來說我們手上拿到的通常只有地理位置,比如說 北京市東大街302號狗不理包子店,可視化之前需經(jīng)緯度坐標轉(zhuǎn)換。

[[393824]]

本文轉(zhuǎn)載自微信公眾號「小張Python」,作者zeroing。轉(zhuǎn)載本文請聯(lián)系小張Python公眾號。   

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

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

如何將地理位置批量轉(zhuǎn)化為經(jīng)緯度坐標?本文將針對這個問題,介紹兩個用 Python 來實現(xiàn)的方法

1,調(diào)用第三方 API

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

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

百度地圖開放平臺

1.2,創(chuàng)建一個應用,獲取 AK 參數(shù)

登錄控制臺之后,選擇左側(cè) 應用管理-> 我的應用 -> 創(chuàng)建應用

創(chuàng)建應用頁面中有三項信息需要填寫

  • 應用名稱,無限制隨意填寫即可;
  • 應用類型 ,選擇服務端;
  • IP 白名單,只是個人簡單測試的話0.0.0.0/0 即可,如果考慮安全問題, 可以將自己的 IP 填進去, AK 參數(shù)泄露的話非本機 IP 無法訪問,這樣也不用擔心額度被其他用戶盜用

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

經(jīng)緯度地理位置根據(jù)轉(zhuǎn)換方向分為兩類,接下來我們分別演示一下其用法:

  • 地理編碼:將地理地址轉(zhuǎn)換為坐標點(經(jīng)緯度);
  • 逆地理編碼,將經(jīng)緯度轉(zhuǎn)化為地理地址;

1.3.1 地理編碼,

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

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

輸出結果如下

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

1.3.2 逆地理編碼

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

  1. lat = '40.05703033345938' 
  2. lng = '116.3084202915042' 
  3. AK = '你的AK' 
  4.  
  5.  
  6. url = 'http://api.map.baidu.com/reverse_geocoding/v3/?ak={}&output=json&coordtype=wgs84ll&location={},{}'.format(AK,lat,lng) 
  7.  
  8. res = requests.get(url) 
  9.  
  10. print(res.text) 
  11. address = json.loads(res.text)['result']['formatted_address'
  12.  
  13. print('\n'
  14. print('address is ',address) 

像我們這類免(bai) 費 piao) 用戶,借助百度 API 每天最高可調(diào)用 6000 次,這個量級基本上能滿足我們?nèi)粘P枰?,但如果這個數(shù)量滿足不了你的話,可以在線購買更高的使用額度

2,Geopy

2.1 Geopy 庫介紹

這里介紹一個Python 包 Geopy ,借助它也可以實現(xiàn)經(jīng)緯度地理位置轉(zhuǎn)換,

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

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

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

2. 2 地理編碼

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

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

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

結果如下

  1. 西二旗北路, 東北旺村, 海淀區(qū), 北京市, 102208, 中國 
  2. 40.056793 116.305811 

2.3 逆地理編碼

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

結果如下

  1. 1#, 西二旗北路, 東北旺村, 海淀區(qū), 北京市, 102208, 中國 

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

2.4 根據(jù)經(jīng)緯度計算距離

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

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

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

  1. from geopy import distance 
  2. newport_ri = (41.49008, -71.312796) 
  3. cleveland_oh = (41.499498, -81.695391) 
  4. print(distance.distance(newport_ri, cleveland_oh).miles)#最后以英里單位輸出 
  5.  
  6. #output 
  7. 538.39044536 
  8.  
  9. wellington = (-41.32, 174.81) 
  10. salamanca = (40.96, -5.50) 
  11. print(distance.distance(wellington, salamanca).km)# 以 km 作為單位輸出 
  12. 19959.6792674 

3 批量地址坐標轉(zhuǎn)換

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

3.1 數(shù)據(jù)讀取

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

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

3.2 數(shù)據(jù)預處理

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

預處理結果如下

3.3 地理編碼(經(jīng)緯度轉(zhuǎn)換)

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

為了測試轉(zhuǎn)換效率,這里我加了一個計時器;98 條數(shù)據(jù)成功轉(zhuǎn)換后共耗時 4.65s 左右,效率還不錯,要比 Geopy 優(yōu)秀得多,

3.5 案例源碼數(shù)據(jù)

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

4. 小結

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

第三方API

  • 優(yōu)勢:地理編碼、逆編碼比較準確,精度高;且支持高并發(fā);
  • 劣勢:不支持國外,環(huán)境配置較為復雜;

Geopy (用 Nominatim 模塊的話)

  • 優(yōu)勢:簡單方便,上手快;支持國外地理編碼
  • 劣勢:不支持并發(fā)訪問、效率低且精度較低;

這里給大家一個建議,如果地址數(shù)據(jù)在國內(nèi)的話 經(jīng)緯度轉(zhuǎn)換 建議用第三方 API,穩(wěn)定且準確;若是涉及下緯度距離計算、單位換算或地址數(shù)據(jù)在國外,建議用 Geopy

好了,以上就是本篇文章的全部內(nèi)容啦,如果對你有所幫助,點個贊是對我最大的鼓勵

責任編輯:武曉燕 來源: 小張Python
相關推薦

2011-10-21 09:28:25

百度地圖API

2024-07-09 08:37:13

2013-05-23 14:43:15

Android開發(fā)IP地址經(jīng)緯度坐標

2023-12-11 07:37:08

mongodb經(jīng)緯度性能

2023-09-13 16:38:09

Geo數(shù)據(jù)類型Redis

2023-10-27 16:12:29

2013-11-15 15:46:16

Nagios地圖

2021-08-08 09:19:18

IPinfogaIP地址安全工具

2023-03-13 22:01:15

ChatGPTPython

2012-06-14 09:37:45

Google地圖

2012-02-14 16:51:07

HTML 5

2012-06-18 15:40:32

jQuery

2013-07-16 11:16:03

云計算

2013-03-29 10:47:39

Android獲取經(jīng)緯AndroidGPS定

2012-02-01 09:33:36

百度地圖API

2023-11-30 08:06:43

Springboot地理位置

2021-07-05 08:41:49

RedisGEO系統(tǒng)

2011-11-18 09:28:17

地理位置API

2012-02-26 21:41:46

手機黑客

2011-09-13 16:24:11

PhoneGap AP
點贊
收藏

51CTO技術棧公眾號