我的topojson文件结构是否正确,以便在大草坪上绘制地图?

时间:2019-08-05 20:31:05

标签: topojson folium

我已经从美国人口普查局下载了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)

1 个答案:

答案 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')

enter image description here