folium添加GeoJson图层报缺失几何对象ValueError问题求助
问题描述
使用folium编写地图代码,计划添加polygon多边形图层展示人口数据,运行时触发报错。
原实现代码如下:
import folium import pandas data = pandas.read_csv("Volcanoes.txt") lat=list(data["LAT"]) lon=list(data["LON"]) elev=list(data["ELEV"]) def color_producer(elevation): if elevation < 1000: return 'green' elif 1000<=elevation<3000: return 'orange' else: return 'red' map=folium.Map(location=[42.304386,-83.066254],zoom_start=6,tiles="Stamen Terrain") fg=folium.FeatureGroup(name="My Map") for lt, ln ,el in zip(lat,lon,elev) : fg.add_child(folium.CircleMarker(location=[lt,ln],radius=6,popup=str(el)+"m", fill_color=color_producer(el),color='grey',fill_opacity=0.7)) fg.add_child(folium.GeoJson(data=open('world.json','r',encoding='utf-8-sig'),style_function=lambda x:{'fillColor':'yellow' })) map.add_child(fg) map.save("Map1.html")
运行抛出的错误信息:
Traceback (most recent call last): File "C:\Users\Vida\Desktop\Webmapping_real\map1.py", line 28, in <module> fg.add_child(folium.GeoJson(data=open('world.json','r',encoding='utf-8-sig'),style_function=lambda x:{'fillColor':'yellow' })) File "C:\Users\Vida\AppData\Local\Programs\Python\Python310\lib\site-packages\folium\features.py", line 499, in __init__ self.data = self.process_data(data) File "C:\Users\Vida\AppData\Local\Programs\Python\Python310\lib\site-packages\folium\features.py", line 544, in process_data raise ValueError('Cannot render objects with any missing geometries' ValueError: Cannot render objects with any missing geometries: <_io.TextIOWrapper name='world.json' mode='r' encoding='utf-8-sig'> PS C:\Users\Vida\Desktop\Webmapping_real>
故障原因
folium.GeoJson的data参数不支持直接传入open()返回的文件流对象,需要传入解析完成的GeoJson格式字符串/字典对象。当前代码直接传了未读取内容的文件句柄,folium无法识别其中的几何数据,因此抛出异常。
修复方案
修改GeoJson初始化部分的代码,将文件内容读取完成后再传入,两种实现均可:
- 直接读取文件内容为字符串传入
fg.add_child(folium.GeoJson( data=open('world.json','r',encoding='utf-8-sig').read(), style_function=lambda x:{'fillColor':'yellow'} ))
- 借助json模块加载为字典传入(可提前校验JSON格式合法性,更推荐)
# 顶部新增导入 import json # 替换原GeoJson相关代码 with open('world.json', 'r', encoding='utf-8-sig') as f: world_geo = json.load(f) fg.add_child(folium.GeoJson( data=world_geo, style_function=lambda x:{'fillColor':'yellow'} ))
注意:如果修改后仍报相同错误,优先检查两点:一是
world.json路径是否正确,是否和运行的py脚本在同一目录;二是world.json是否为标准GeoJson格式,是否存在要素缺失geometry字段的问题。
内容的提问来源于stack exchange,提问作者vida
相关产品推荐
相关产品推荐

