在上一篇文章中,我已经演示了如何在Python中使用Nominatim(使用Geopy模块)将位置名称地理编码为经度和纬度坐标。 在这篇文章中,我想展示如何使用Geopy对一个位置列表进行地理编码。 为此,我将使用Pandas模块读取一个简单简短的csv文件,该文件包含由国家,城市和街道列中的条目指定的位置名称:
#导入熊猫 import pandas #读取包含位置数据的csv文件 data = pandas.read_csv("locations.csv") #显示csv文件中的表 data
国家 | 城市 | 街道 | 公制 | |
---|---|---|---|---|
0 | Germany | Berlin | Alexanderplatz 1 | 10 |
1 | Germany | Berlin | Dircksenstrasse 2 | 5 |
2 | Germany | Berlin | Rathausstrasse 1 | 16 |
让我们检查表格数据的数据类型:
type(data)
pandas.core.frame.DataFrame
现在,我已经读完数据,我将对位置进行地理编码并将地理编码的coordiantes分配给新列。由于数据是熊猫数据帧,因此我可以利用apply()方法将相关的Nominatim地理编码服务应用于数据帧中的每个地址。
首先,我需要将所有列条目聚合到地址中,然后将其添加到表格DataFrame中的新列中。然后,我可以创建一个引用Nominatim Geopy服务的服务对象,并将该服务应用于每个位置,然后将经过地理编码的结果返回到另一个新列中:
#将国家,城市和街道合并为一个地址字符串 data["addresses"] = data["country"] + ", " + data["city"] + ", " + data["street "] #导入geopy模块 import geopy #创建一个服务对象 service = geopy.Nominatim(user_agent = "myGeocoder") #对熊猫人DataFrame使用.apply()方法对每个地址进行地址解析 from geopy.extra.rate_limiter import RateLimiter data["coordinates"] = data["addresses"].apply(RateLimiter(service.geocode,min_delay_seconds=1)) #显示表格数据
country | city | street | metric | addresses | coordinates | |
---|---|---|---|---|---|---|
0 | Germany | Berlin | Alexanderplatz 1 | 10 | Germany, Berlin, Alexanderplatz 1 | (Alexanderstraße, Spandauer Vorstadt, Mitte, B… |
1 | Germany | Berlin | Dircksenstrasse 2 | 5 | Germany, Berlin, Dircksenstrasse 2 | (2, Dircksenstraße, Luisenstadt, Mitte, Berlin… |
2 | Germany | Berlin | Rathausstrasse 1 | 16 | Germany, Berlin, Rathausstrasse 1 | (1-14, Rathausstraße, Spandauer Vorstadt, Mitt… |
让我们检查“ coordinate”列条目的数据类型:
type(data["coordinates"][0]) geopy.location.Location
地理编码的位置类型为Geopy位置。 Location类的对象具有各种属性。其中一个是纬度,另一个是经度:
data["coordinates"][0].longitude
13.4144809
data["coordinates"][0].latitude
52.5228654
现在,我计算“平均”经度和纬度分数。我想将它们用作我的Folium位置标记图的中心点:
#提取经度和纬度值以分离列表 longs = [coord.longitude for coord in data["coordinates"]] lats = [coord.latitude for coord in data["coordinates"]] #计算平均经度和纬度值 import statistics meanLong = statistics.mean(longs) meanLat = statistics.mean(lats) #显示结果 print("meanLong = " + str(meanLong) + "; meanLat = " + str(meanLat))
meanLong = 13.412910038576356; meanLat = 52.52100943333333
[longs,lats]
[[13.4144809, 13.4136431, 13.410606115729072], [52.5228654, 52.5208149, 52.519348]]
使用Folium模块,我现在可以为位置创建标记并将其绘制在地图图块上:
#导入FOLIUM import folium #创建以柏林为中心的基础地图 mapObj = folium.Map(location = [meanLat,meanLong], zoom_start = 15) #为柏林创建标记对象,对数据DataFrame中的每个位置一一创建 for i in range(0,data.shape[0]): # .shape[0] for Pandas DataFrame is the number of rows #为位置i创建标记 markerObj = folium.Marker(location = [lats[i],longs[i]]) #在地图上添加标记 markerObj.add_to(mapObj) #显示地图 mapObj
专业领域为优化和仿真的工业工程师(R,Python,SQL,VBA)
Leave a Reply