当前位置: 首页 > 知识库问答 >
问题:

如何从纬度和经度坐标列表中获取城市、州和国家?

薛望
2023-03-14

我有500000个纬度和经度坐标列表,如下所示:

Latitude   Longitude  
42.022506  -88.168156  
41.877445  -87.723846  
29.986801  -90.166314  

我希望使用python在一个新列中获得每个坐标的城市、州和国家,如下所示:

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包。

如何将所有行运行到此代码中?现在我必须手动输入经纬度到最后一行。

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"))

输出给我('Bowdon','North Dakota','USA')。我希望用我的列(纬度和经度)替换坐标,以便在列表中运行。如何将我的列输入到代码中以运行整个文档?

共有1个答案

袁泰平
2023-03-14

您想在每一行上运行一个函数,这可以通过应用()来实现。

有两个复杂问题,即您希望1)为函数提供多个参数,以及2)返回多个结果。

这些问题解释了如何做这些事情:

  • python pandas-将带有两个参数的函数应用于列
  • 从应用()返回多个列

以下是如何调整代码以实现此目的:

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)

(我用数据帧的内联定义替换了您的read_csv()调用。忽略那个。这对例子并不重要。我这样做是为了使这个例子独立。)

city_state_country()函数与数据框的每一行一起被调用。(ax=1参数使用行而不是列来运行应用程序()。)函数获取lat和lon,并执行查询。然后,它修改行以包括查询中的信息。

这将得到以下结果:

    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

与您的示例不一样,但Namingm似乎不会返回两个坐标的城市。(它称之为城镇,而不是城市。)

 类似资料:
  • 我有一个表格,上面有国家、州、城市、城市的纬度/经度。我试图构建一个json字符串,如下所示。 数据库查询结果在一个数组中:JSONData。我有国家的代码。不确定如何添加一个州如果它不存在和一个城市如果它不存在与城市的纬度和经度(我有的部分???)

  • 问题内容: 我有一张表,上面有: 城市纬度经度 而且我需要一个sql查询来知道所有城市都距离纽约100英里。 问题答案: 也许这对您有帮助:http : //www.scribd.com/doc/2569355/Geo-Distance-Search-with- MySQL 这是一个不错的介绍。或只是google for ,您会发现一些教程。 如果有可能并且想让它变得更简单,请直接使用支持距离查询

  • 问题内容: 有没有一种方法可以使用javascript的google maps API从纬度和经度点获取城市名称? 如果可以,请举个例子吗? 问题答案: 这称为 反向地理编码 Google提供的文件: http://code.google.com/apis/maps/documentation/geocoding/#ReverseGeocoding。 调用Google地理编码网络服务的示例: ht

  • 问题内容: 我正在Swift3中开发应用程序,但遇到字母问题,我找不到答案。 我怎么知道基于纬度和经度的城市名称和国家简称? 问题答案: 我建议将Google Maps API 与您的项目集成。如果您这样做,则可以使用Google提供的反向地理编码来完成您的任务。 此外,谷歌还有用于IOS开发的Google Maps SDK ,这也是值得考虑的。 UPD: 您可以在不将地图集成到项目中的情况下做到

  • 我的代码是这样开始的: 我需要能够输入每个纬度和经度点的度和分钟(度,分钟)。然而,当我试图在代码的最后一行打印“距离”时,出现了编译错误。此外,Eclipse告诉我没有使用lat1、long1、lat2和long2(“获取纬度和经度值”部分)?有人能帮我打印距离吗?非常感谢。

  • 问题内容: 在Python中使用GDAL,如何获取GeoTIFF文件的纬度和经度? GeoTIFF似乎没有存储任何坐标信息。而是存储XY原点坐标。但是,XY坐标不提供左上角和左下角的纬度和经度。 看来我需要做一些数学运算才能解决这个问题,但是我不知道从哪里开始。 执行此操作需要什么程序? 我知道该方法对此很重要,但是,我不知道该怎么做。 问题答案: 要获取您的Geotiff角的坐标,请执行以下操作