簡體   English   中英

如何從經緯度坐標列表中獲取城市、state 和國家?

[英]How to get city, state, and country from a list of latitude and longitude coordinates?

我有 500,000 個緯度和經度坐標列表,如下所示:

Latitude   Longitude  
42.022506  -88.168156  
41.877445  -87.723846  
29.986801  -90.166314  

我希望使用 python 來獲取城市、state 以及新列中每個坐標的國家/地區,如下所示:

Latitude   Longitude   City        State   Country
42.022506  -88.168156  Streamwood  IL      United States
41.877445  -87.723846  Chicago     IL      United States
29.986801  -90.166314  Metairie    LA      United States

有了這么大的數據集,如何在 python 中實現? 聽說過Google的API,Nominatim的API,Geopy的package。

如何將所有行都運行到此代碼中? 現在我必須在最后一行手動輸入緯度和經度。

import csv 
import pandas as pd
import numpy as np
import math
from geopy.geocoders import Nominatim

input_file = "Lat-Log.csv" # file contains ID, Latitude, Longitude
output_file = "output.csv"
df = pd.read_csv(input_file) 

geolocator = Nominatim(user_agent="geoapiExercises")
def city_state_country(coord):
    location = geolocator.reverse(coord, exactly_one=True)
    address = location.raw['address']
    city = address.get('city', '')
    state = address.get('state', '')
    country = address.get('country', '')
    return city, state, country
print(city_state_country("47.470706, -99.704723"))

output 給我('Bowdon'、'North Dakota'、'USA')。 我希望用我的列(緯度和經度)替換坐標以運行我的列表。 如何將我的列輸入到代碼中以運行整個文檔?

您想要在每一行上運行 function,這可以使用apply()來完成。

有兩個並發症,即您想要 1) 向 function 提供多個 arguments,以及 2) 取回多個結果。

這些問題解釋了如何做這些事情:

以下是調整代碼以執行此操作的方法:

import pandas as pd
import io
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="geoapiExercises")

s = """Latitude   Longitude  
42.022506  -88.168156  
41.877445  -87.723846  
29.986801  -90.166314"""

df = pd.read_csv(io.StringIO(s), delim_whitespace=True)

def city_state_country(row):
    coord = f"{row['Latitude']}, {row['Longitude']}"
    location = geolocator.reverse(coord, exactly_one=True)
    address = location.raw['address']
    city = address.get('city', '')
    state = address.get('state', '')
    country = address.get('country', '')
    row['city'] = city
    row['state'] = state
    row['country'] = country
    return row

df = df.apply(city_state_country, axis=1)
print(df)

(我用 dataframe 的內聯定義替換了您的 read_csv() 調用。忽略它。這對示例並不重要。我這樣做是為了使示例獨立。)

dataframe 的每一行都會調用city_state_country() function。( axis=1參數使 apply() 使用行而不是列運行。)function 獲取緯度和經度,並進行查詢。 然后,它修改該行以包含來自查詢的信息。

這得到以下結果:

    Latitude  Longitude     city      state        country
0  42.022506 -88.168156            Illinois  United States
1  41.877445 -87.723846  Chicago   Illinois  United States
2  29.986801 -90.166314           Louisiana  United States

與您的示例不同,但 Nominatim 似乎沒有為您的兩個坐標返回一個城市。 (它稱它們為城鎮,而不是城市。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM