Python中具有Geopy和Folium的多个地理编码地图标记

在上一篇文章中,我已经演示了如何在Python中使用Nominatim(使用Geopy模块)将位置名称地理编码为经度和纬度坐标。 在这篇文章中,我想展示如何使用Geopy对一个位置列表进行地理编码。 为此,我将使用Pandas模块读取一个简单简短的csv文件,该文件包含由国家,城市和街道列中的条目指定的位置名称:

#导入熊猫
import pandas
#读取包含位置数据的csv文件
data = pandas.read_csv("locations.csv")
#显示csv文件中的表
data
国家城市街道公制
0GermanyBerlinAlexanderplatz 110
1GermanyBerlinDircksenstrasse 25
2GermanyBerlinRathausstrasse 116

让我们检查表格数据的数据类型:

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)) 
#显示表格数据
countrycitystreetmetricaddressescoordinates
0GermanyBerlinAlexanderplatz 110Germany, Berlin, Alexanderplatz 1(Alexanderstraße, Spandauer Vorstadt, Mitte, B…
1GermanyBerlinDircksenstrasse 25Germany, Berlin, Dircksenstrasse 2(2, Dircksenstraße, Luisenstadt, Mitte, Berlin…
2GermanyBerlinRathausstrasse 116Germany, 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

You May Also Like

Leave a Reply

Leave a Reply

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据