如何用含经纬度的CSV逐行绘制单个地理位置地图并保存
问题描述
我有一个以lat(纬度)、long(经度)为表头的CSV文件。目前已能将所有位置绘制在同一幅地图中并保存,但希望逐个绘制每个位置的地图,保存为图片或HTML文件。
我已实现生成含所有位置标记地图的代码:
xy_table = pd.read_csv('testdata.csv') xy_table.head() # 数据示例: # | lat | long | # | --------- | ------ | # | lat 1 | long 1 | # | lat 2 | long 2 | xy_table['coordinates'] = xy_table[['long', 'lat']].values.tolist() xy_table.head() print(xy_table) from shapely.geometry import Point xy_table['coordinates'] = xy_table['coordinates'].apply(Point) xy_table.head() # 处理后的数据示例: # | lat | long |coordinates | # | ---------- | -------|--------------- | # | lat 1 | long 1 |POINT (long lat)| # | lat 2 | long 2 |POINT (long lat)| print(xy_table[['coordinates']]) type(xy_table) stations = geopandas.GeoDataFrame(xy_table, geometry = 'coordinates') type(stations) osm_map = folium.Map(location=[stations.lat.mean(), stations.long.mean()], zoom_start=12) points = folium.features.GeoJson(stations.to_json()) osm_map.add_child(points) osm_map.save('project-1.html') osm_map
解决方案
1. 生成单个位置的HTML地图
通过遍历数据行,为每个位置单独创建地图并保存:
import pandas as pd import folium # 读取CSV数据 xy_table = pd.read_csv('testdata.csv') # 遍历每一行数据,生成独立地图 for idx, row in xy_table.iterrows(): # 以当前位置为中心创建地图,zoom_start控制缩放级别 single_map = folium.Map(location=[row['lat'], row['long']], zoom_start=15) # 在地图上标记当前位置,弹窗显示位置信息 folium.Marker( location=[row['lat'], row['long']], popup=f"位置 {idx+1}<br>纬度: {row['lat']}<br>经度: {row['long']}", icon=folium.Icon(color='blue') ).add_to(single_map) # 保存为单独的HTML文件,文件名带位置索引 single_map.save(f"location_map_{idx+1}.html")
2. 生成图片格式的地图
若需要保存为PNG/JPG等图片,需借助selenium对HTML地图进行截图:
步骤1:安装依赖
pip install selenium # 下载对应浏览器驱动(如ChromeDriver),并配置到系统PATH中
步骤2:截图代码
import pandas as pd import folium from selenium import webdriver import time import os xy_table = pd.read_csv('testdata.csv') # 初始化Chrome浏览器驱动 driver = webdriver.Chrome() for idx, row in xy_table.iterrows(): # 创建临时地图HTML文件 temp_html = f"temp_map_{idx+1}.html" single_map = folium.Map(location=[row['lat'], row['long']], zoom_start=15) folium.Marker( location=[row['lat'], row['long']], popup=f"位置 {idx+1}", icon=folium.Icon(color='red') ).add_to(single_map) single_map.save(temp_html) # 打开临时HTML并截图 driver.get(f"file://{os.path.abspath(temp_html)}") time.sleep(2) # 等待地图加载完成 driver.save_screenshot(f"location_map_{idx+1}.png") # 删除临时HTML文件 os.remove(temp_html) # 关闭浏览器驱动 driver.quit()
内容的提问来源于stack exchange,提问作者Gaurav Tiwari
相关产品推荐
相关产品推荐

