我正在尝试使用folium来制作一个Choropleth,它在GeoJSON,Pandas和Leaflet之间提供了一个很好的链接。

GeoJSON格式如下:

{
  "type":"FeatureCollection",
  "features":[
        {
          "type":"Feature",
          "geometry":
          {
              "type":"Polygon",
              "coordinates":[[[-1.6704591323124895,49.62681486270549], .....
              {
                  "insee":"50173",
                  "nom":"Équeurdreville-Hainneville",
                  "wikipedia":"fr:Équeurdreville-Hainneville",
                  "surf_m2":12940306}},

Pandas DataFrame:
postal_count.head(5)
Out[98]:
  Code_commune_INSEE  CP_count
0              75120       723
1              75115       698
2              75112       671
3              75118       627
4              75111       622

“Code_communes_INSEE”对应于GeoJSON中的属性“insee”。我想在上面的DataFrame中使用变量“CP_count”来做一个choropleth。

这是我的代码(this notebook的片段)
map_france = folium.Map(location=[47.000000, 2.000000], zoom_start=6)
map_france.choropleth(
                    geo_str=open(geo_path + 'simplified_communes100m.json').read(),
                    data=postal_count,
                    columns=['Code_commune_INSEE', 'CP_count'],
                    key_on='feature.geometry.properties.insee',
                    fill_color='YlGn',
)
map_france.save(table_path + 'choro_test1.html')

我仍然一次又一次收到此错误:
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-83-ea0fd2c1c207> in <module>()
      8                     fill_color='YlGn',
      9 )
---> 10 map_france.save('/media/flo/Stockage/Data/MesAides/map/choro_test1.html')

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/folium/element.py in save(self, outfile, close_file, **kwargs)
    151
    152         root = self.get_root()
--> 153         html = root.render(**kwargs)
    154         fid.write(html.encode('utf8'))
    155         if close_file:

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/folium/element.py in render(self, **kwargs)
    357         """Renders the HTML representation of the element."""
    358         for name, child in self._children.items():
--> 359             child.render(**kwargs)
    360         return self._template.render(this=self, kwargs=kwargs)
    361

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/folium/element.py in render(self, **kwargs)
    665
    666         for name, element in self._children.items():
--> 667             element.render(**kwargs)

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/folium/element.py in render(self, **kwargs)
    661         script = self._template.module.__dict__.get('script', None)
    662         if script is not None:
--> 663             figure.script.add_children(Element(script(self, kwargs)),
    664                                        name=self.get_name())
    665

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/jinja2/runtime.py in __call__(self, *args, **kwargs)
    434             raise TypeError('macro %r takes not more than %d argument(s)' %
    435                             (self.name, len(self.arguments)))
--> 436         return self._func(*arguments)
    437
    438     def __repr__(self):

<template> in macro(l_this, l_kwargs)

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/jinja2/runtime.py in call(_Context__self, _Context__obj, *args, **kwargs)
    194                 args = (__self.environment,) + args
    195         try:
--> 196             return __obj(*args, **kwargs)
    197         except StopIteration:
    198             return __self.environment.undefined('value was undefined because '

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/folium/features.py in style_data(self)
    352
    353         for feature in self.data['features']:
--> 354             feature.setdefault('properties', {}).setdefault('style', {}).update(self.style_function(feature))  # noqa
    355         return json.dumps(self.data, sort_keys=True)
    356

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/folium/folium.py in style_function(x)
    671                 "color": line_color,
    672                 "fillOpacity": fill_opacity,
--> 673                 "fillColor": color_scale_fun(x)
    674             }
    675

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/folium/folium.py in color_scale_fun(x)
    659             def color_scale_fun(x):
    660                 return color_range[len(
--> 661                     [u for u in color_domain if
    662                      u <= color_data[get_by_key(x, key_on)]])]
    663         else:

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/folium/folium.py in <listcomp>(.0)
    660                 return color_range[len(
    661                     [u for u in color_domain if
--> 662                      u <= color_data[get_by_key(x, key_on)]])]
    663         else:
    664             def color_scale_fun(x):

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/folium/folium.py in get_by_key(obj, key)
    655                 return (obj.get(key, None) if len(key.split('.')) <= 1 else
    656                         get_by_key(obj.get(key.split('.')[0], None),
--> 657                                    '.'.join(key.split('.')[1:])))
    658
    659             def color_scale_fun(x):

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/folium/folium.py in get_by_key(obj, key)
    655                 return (obj.get(key, None) if len(key.split('.')) <= 1 else
    656                         get_by_key(obj.get(key.split('.')[0], None),
--> 657                                    '.'.join(key.split('.')[1:])))
    658
    659             def color_scale_fun(x):

/home/flo/.virtualenvs/mesaides/lib/python3.4/site-packages/folium/folium.py in get_by_key(obj, key)
    653
    654             def get_by_key(obj, key):
--> 655                 return (obj.get(key, None) if len(key.split('.')) <= 1 else
    656                         get_by_key(obj.get(key.split('.')[0], None),
    657                                    '.'.join(key.split('.')[1:])))

AttributeError: 'NoneType' object has no attribute 'get'

我尝试使用key_on='feature.geometry.properties.insee'失败。

最佳答案

有两个问题:

1-正确访问'insee'参数是:key_on='feature.properties.insee'
找到正确的key_on的最佳方法是使用geoJSON dict来确保您调用的是正确的属性。

2-一旦有了正确的key_on参数,您需要确保 geoJSON 中的所有可用键都包含在您的Pandas DataFrame中(否则它将引发KeyError)

在这种情况下,我使用以下命令行来获取我的geoJSON包含的所有insee key :

ogrinfo -ro -al communes-20150101-100m.shp -geom=NO | grep insee > list_code_insee.txt

如果您遇到相同的问题,这应该可以解决您的问题。

关于pandas - Folium Choropleth + GeoJSON引发AttributeError : 'NoneType' ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37003421/

10-13 06:38