Python如何批量處理經(jīng)緯度數(shù)據(jù)并生成位置信息
前言
這次的內(nèi)容是無意之間想到要做的,因?yàn)楸救嗽谧詫W(xué)Python,學(xué)習(xí)到pandas模塊的時(shí)候就想著怎么樣可以將學(xué)習(xí)獲得的知識(shí)應(yīng)用起來,于是就有了今天這個(gè)實(shí)戰(zhàn)內(nèi)容。
準(zhǔn)備
- ①Python 3.x及以上的運(yùn)行環(huán)境
- ②導(dǎo)入pandas模塊
- ③導(dǎo)入geopy模塊,可以直接pip install geopy獲得
- ④導(dǎo)入warnings模塊,用于過濾無用的警告信息
其中g(shù)eopy作為一個(gè)地理位置相關(guān)的庫(kù),提供了一系列方便的調(diào)用其他地圖api的方法,其中就包括了:
1、通過地名(如建筑物)獲取詳細(xì)地理位置;
2、通過給定的經(jīng)緯度獲取詳細(xì)的地址這兩種實(shí)用方法。具體請(qǐng)參考官方文檔,地址:歡迎使用Geopy文檔! — GeoPy 2.2.0 文檔
讀取處理數(shù)據(jù)
由于使用的是pandas模塊,所以按照以往的經(jīng)驗(yàn),我選擇使用csv文件保存經(jīng)緯度數(shù)據(jù),通過python程序生成指定數(shù)目和范圍的隨機(jī)數(shù)用來模擬實(shí)際中的經(jīng)緯度數(shù)據(jù),效果如下(注:這里只生成了東經(jīng)0-180°的,實(shí)際上應(yīng)該還包括西經(jīng)0-180°):
然后通過pandas的read_csv()方法得到一個(gè)DataFrame對(duì)象。
到這里思路就很清晰了,即通過某種方式我們可以方便地獲取每一行的經(jīng)度和緯度信息并進(jìn)行處理,這種方式就是行/列切片。
生成位置信息
geopy提供了一系列方便的調(diào)用其他地圖api的方法,考慮到某些api的調(diào)用需要用戶注冊(cè)并生成密鑰才可以使用,我選擇無需注冊(cè)的Nominatim的api,官網(wǎng):Nominatim
結(jié)合上一步,將每次切片得到的經(jīng)緯度數(shù)據(jù)分別填充,調(diào)用reverse()函數(shù)后得到較為準(zhǔn)確的位置信息。
關(guān)鍵部分如下——
data="{}, {}".format(str(longtitude),str(latitude)) geolocator = Nominatim(user_agent=username) location = geolocator.reverse(data,zoom=18)
tips:
location | 輸出一個(gè)對(duì)應(yīng)經(jīng)緯度的大致地理位置,比如說精確到街道 |
location.address | 輸出一個(gè)對(duì)應(yīng)經(jīng)緯度的詳細(xì)地理位置,包括是什么建筑物 |
location.raw | 輸出一個(gè)對(duì)應(yīng)經(jīng)緯度的原始信息,貌似默認(rèn)是json格式 |
最終效果
其中的none是因?yàn)榻?jīng)緯度坐標(biāo)在水系或者無人區(qū)中,無法確定地理位置。
完整代碼
from geopy.geocoders import Nominatim import warnings as bill_warn import pandas as pd1 def locate_address(urlname,username): bill_warn.filterwarnings(action="ignore",message="whatever") geo_frame=pd1.DataFrame(pd1.read_csv(urlname)) for i in range(0,len(geo_frame)): longtitude = geo_frame.iloc[i,1] latitude = geo_frame.iloc[i,2] data="{}, {}".format(str(longtitude),str(latitude)) geolocator = Nominatim(user_agent=username) location = geolocator.reverse(data,zoom=18) print("The information to this set of data:") print(location) print("Transform successfully conducted!!!") locate_address("location.csv","myuseragent")
注意事項(xiàng)
① 如果遇到下列的異常
問題就是在于初始化Nomitanim的時(shí)候,沒有指定user_agent的名字,而是調(diào)用了默認(rèn)的user_agent,解決辦法就是在構(gòu)造函數(shù)改為你想要的任何的名字
geolocator = Nominatim(user_agent=“你想要的名字”)
②Nominatim的調(diào)用也有一定的數(shù)量限制,所以請(qǐng)合理使用!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python接口自動(dòng)化測(cè)試的實(shí)現(xiàn)
這篇文章主要介紹了Python接口自動(dòng)化測(cè)試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08python實(shí)點(diǎn)云分割k-means(sklearn)詳解
這篇文章主要為大家詳細(xì)介紹了Python實(shí)點(diǎn)云分割k-means,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05python連接數(shù)據(jù)庫(kù)后通過占位符添加數(shù)據(jù)
在pymysql中支持對(duì)占位符的處理,開發(fā)者需要在SQL中使用“%”定義占位符,在使用excute()方法執(zhí)行時(shí)對(duì)占位符的數(shù)據(jù)進(jìn)行填充即可,本文給大家介紹python連接數(shù)據(jù)庫(kù)后通過占位符添加數(shù)據(jù)的方法,需要的朋友參考下吧2021-12-12python對(duì)excel文檔去重及求和的實(shí)例
下面小編就為大家分享一篇python對(duì)excel文檔去重及求和的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04Python基于opencv實(shí)現(xiàn)的人臉識(shí)別(適合初學(xué)者)
OpenCV是一個(gè)基于BSD許可開源發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫(kù),下面這篇文章主要給大家介紹了關(guān)于Python基于opencv實(shí)現(xiàn)的人臉識(shí)別,文中通過實(shí)例代碼介紹的非常詳細(xì),本文的教程非常適合初學(xué)者,需要的朋友可以參考下2022-03-03Python2.x中str與unicode相關(guān)問題的解決方法
這篇文章主要介紹了Python2.x中str與Unicode相關(guān)問題的解決方法,Python2.x版本中由于沒有默認(rèn)使用Unicode而會(huì)在實(shí)際使用中碰到一些字符問題,針對(duì)這些問題本文討論了一些解決方法,需要的朋友可以參考下2015-03-03python+selenium 點(diǎn)擊單選框-radio的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python+selenium 點(diǎn)擊單選框-radio的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09Python簡(jiǎn)繁體轉(zhuǎn)換的簡(jiǎn)單實(shí)現(xiàn)步驟
工作中需要將繁體中文轉(zhuǎn)換成簡(jiǎn)體中文上網(wǎng)找了些資料,下面這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)簡(jiǎn)繁體轉(zhuǎn)換的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06