我已经从美国人口普查局下载了us-counties shapefile,并使用mapshaper.com将其转换为topojson文件。不幸的是,我必须对topojson进行相当多的解析才能获得FIPS县代码。我正在使用Folium渲染地图,但一直出现错误。
我已将数据框放入一系列FIPS_codes和$ amounts中。使用style_function,我从topojson文件中调用FIPS_codes,并将该值与系列进行比较,以绘制美国县地图。
import branca
colorscale = branca.colormap.linear.YlOrRd_09.scale(0, 50e3)
def style_function(feature):
county_dict = cms_2017_grouped_series.get(
features['objects']['tl_2017_us_county']['geometries']['properties']['GEOID'], None)
return {
'fillOpacity': 0.5,
'weight': 0,
'fillColor': '#black' if employed is None else colorscale(employed)
}
我得到的错误是AttributeError: 'list' object has no attribute 'get'
呈现地图所需的其余代码如下
m = folium.Map(
location=[48, -102],
tiles='cartodbpositron',
zoom_start=3
)
folium.TopoJson(
json.load(open(county_geo)),
'objects.tl_2017_us_county.geometries.properties.GEOID',
style_function=style_function
).add_to(m)
答案 0 :(得分:0)
我按照您的步骤创建了topojson和好消息,它退出了。只需修改您的代码中的几件事
我首先创建了一些模拟用户数据。我使用geopandas和topjson文件来简化操作,但是您只需要使用包含县和就业人数的pandas数据框
import geopandas as gpd
gdf = gpd.read_file('tl_2017_us_county.json')
gdf['employed'] = np.random.randint(low=1, high=100000, size= len(gdf))
使用数据框创建一个系列。这将在func样式中用于将数据“绑定”到地图上
cms_2017_grouped_series = gdf.set_index('GEOID')['employed']
print(cms_2017_grouped_series.head())
GEOID
31039 54221
53069 68374
35011 8477
31109 2278
31129 40247
Name: employed, dtype: int64
这非常接近您的样式功能。我刚刚使用.get()
更改了行,以使用更正的feature
字典键。哦,我在下面的fillColor中使用返回值(employed
)
import branca
colorscale = branca.colormap.linear.YlOrRd_09.scale(0, 50e3)
def style_function(feature):
employed = cms_2017_grouped_series.get(feature['properties']['GEOID'], None)
return {
'fillOpacity': 0.5,
'weight': 0,
'fillColor': '#black' if employed is None else colorscale(employed)
}
接下来是object_path
的轻微mod。我还要保存地图,然后在Chrome中打开地图,因为由于尺寸原因,该地图无法在笔记本中呈现
m = folium.Map(
location=[48, -102],
tiles='cartodbpositron',
zoom_start=3
)
folium.TopoJson(open('tl_2017_us_county.json'), 'objects.tl_2017_us_county',
style_function=style_function).add_to(m)
m.save('map.html')