使用GeoJson多边形颜色功能修改国家颜色时遇ValueError求助
解决folium中GeoJson加载文件时的ValueError问题
嘿,我看到你在尝试用folium给地图上的国家添加颜色时遇到了错误,别担心,这是个新手常踩的小坑,咱们一步步把它解决掉~
错误原因解析
你现在直接把open('world.json','r', encoding='utf-8-sig')传给了folium.GeoJson的data参数,但folium需要的是解析好的JSON数据或者文件路径字符串,而不是你现在传入的「打开的文件对象」(报错信息里的<_io.TextIOWrapper>就是这个文件对象)。它不知道怎么处理这个对象,所以就抛出了ValueError。
两种快速解决方法
方法1:直接传入文件路径(最简单)
folium支持直接接收文件路径字符串,它会自动帮你读取并解析JSON内容,把代码里的GeoJson部分改成这样就行:
fg.add_child(folium.GeoJson( data='world.json', style_function = lambda x: {'fillColor':'yellow'} ))
方法2:手动读取文件内容
如果你需要手动处理文件(比如做一些内容修改),可以先读取文件的文本内容再传入:
# 先读取JSON文件内容 with open('world.json','r', encoding='utf-8-sig') as f: geo_json_data = f.read() # 再传入GeoJson fg.add_child(folium.GeoJson( data=geo_json_data, style_function = lambda x: {'fillColor':'yellow'} ))
修改后的完整代码(附带两个小优化)
我还帮你调整了两个细节:一是把fillColour改成美式拼写fillColor(folium遵循美式拼写,英式的可能不生效);二是把fill_opacity=1.15改成0.7(opacity取值范围是0-1,超过的话会被自动设为1,0.7的视觉效果更自然):
import folium import pandas data = pandas.read_csv("Volcanoes_USA.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=[38.58,-99.09], zoom_start=6, tiles="Mapbox Bright") 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", color=color_producer(el), fill_color='grey', fill_opacity=0.7 )) # 修正后的GeoJson加载代码 fg.add_child(folium.GeoJson( data='world.json', style_function = lambda x: {'fillColor':'yellow'} )) map.add_child(fg) map.save("map.html") # 别忘了保存成HTML文件才能查看效果哦
内容的提问来源于stack exchange,提问作者Waunita Gopaul
相关产品推荐
相关产品推荐

