0

I have a Feature Collection of Polygons and MultiPolygons and I have to first write it in a temporary file to then load it with geopandas.GeoDataFrame.from_file(tmp_json_file), I'm looking for a way to do it without the temporary file. I've tried to use geopandas.GeoDataFrame.from_feature(), it works pretty well for Feature Collection of simple Polygon but i can't make it work for Feature Collection of Polygons and MultiPolygons, I was thinking about doing something like below, but it's not working yet.

features_collection = []

for feature in json_data['features']:
   tmp_properties = {'id': feature['properties']['id']}

   if is_multipolygon (feature):
       tmp = Feature(geometry=MultiPolygon((feature['geometry']['coordinates'])), properties=tmp_properties)
   else: 
       Feature(geometry=Polygon((feature['geometry']['coordinates'])), properties=tmp_properties)
   features_collection.append(tmp)

collection = FeatureCollection(features_collection)

return geopandas.GeoDataFrame.from_features(collection['features'])

The GeoJSON is taken from an API, returning territory (some territory are modelized by a single polygon, other by a set of polygons (formatted as a MultiPolygon).

The GeoJSON are structured as follow : http://pastebin.com/PPdMUGkY

I'm getting the following error from the function above :

Traceback (most recent call last):
  File "overlap.py", line 210, in <module>
    print bdv_json_to_geodf(contours_bdv)
  File "overlap.py", line 148, in json_to_geodf
    return geopandas.GeoDataFrame.from_features(collection['features'])
  File "/Library/Python/2.7/site-packages/geopandas/geodataframe.py", line 179, in from_features
    d = {'geometry': shape(f['geometry'])}
  File "/Library/Frameworks/GEOS.framework/Versions/3/Python/2.7/site-packages/shapely/geometry/geo.py", line 40, in shape
    return MultiPolygon(ob["coordinates"], context_type='geojson')
  File "/Library/Frameworks/GEOS.framework/Versions/3/Python/2.7/site-packages/shapely/geometry/multipolygon.py", line 64, in __init__
    self._geom, self._ndim = geos_multipolygon_from_py(polygons)
  File "/Library/Frameworks/GEOS.framework/Versions/3/Python/2.7/site-packages/shapely/geometry/multipolygon.py", line 138, in geos_multipolygon_from_py
    N = len(ob[0][0][0])
TypeError: object of type 'float' has no len()
4

1 回答 1

4

对我来说,如果我只是将 json_data 功能提供给GeoDataFrame.from_features

In [17]: gdf = geopandas.GeoDataFrame.from_features(json_data['features'])

In [18]: gdf.head()
Out[18]:
                                            geometry  id
0  (POLYGON ((-0.58570861816406 44.810461337462, ...   2
1  (POLYGON ((-0.5851936340332 44.816550206151, -...   1
2  POLYGON ((-0.58805465698242 44.824018340447, -...   5
3  POLYGON ((-0.59412002563477 44.821664359038, -...   9
4  (POLYGON ((-0.58502197265625 44.817159057661, ...  12

生成的 GeoDataFrame 混合了 Polygons 和 MultiPolygons,就像在输入数据中一样:

In [19]: gdf.geom_type.head()
Out[19]:
0    MultiPolygon
1    MultiPolygon
2         Polygon
3         Polygon
4    MultiPolygon
dtype: object

我在 Windows 上使用 GeoPandas 0.2、shapely 1.5.15、pandas 0.18.1 进行了尝试。

于 2016-06-16T09:08:25.650 回答