conv3d
conv3d

Reputation: 2896

Convert geopandas shapely polygon to geojson

I created a circle using geopandas and it returned a shapely polygon:

POLYGON: ((...))

I want this same polygon as a geojson object. I ran across this:

shapely.geometry.mapping(shapelyObject)

which returns this:

{'type': 'Polygon', 'coordinates': (((570909.9247264927, 125477.71811034005)...}

But when I try to map this in mapbox it does not show anything. I think maybe it is not fully a geojson object.

Upvotes: 37

Views: 73292

Answers (8)

zabop
zabop

Reputation: 7922

With geopandas, you can do:

with open("out.geojson","w") as f:
    f.write(gpd.GeoSeries([shapely_object]).to_json())

Upvotes: 2

xitong
xitong

Reputation: 349

Assume polygon_list is a list of shapely.geometry.Polygon.

geo_dict = {}
geo_dict["type"] = "FeatureCollection"
geo_dict["features"] = [{"type": "Feature", "geometry": a} for a in [geometry.mapping(b) for b in polygon_list]]
my_geojson = json.dumps(geo_dict) # str in json format

Upvotes: 4

bwl1289
bwl1289

Reputation: 2078

You can also use PyShp

import shapefile

with shapefile.Reader("shapefile.shp") as shp:
    geojson_data = shp.__geo_interface__

or

geojson_data = shapefile.Reader("shapefile.shp").__geo_interface__

example usage:

>>> geojson_data["type"]

'MultiPolygon'

Upvotes: 1

Francis Odero
Francis Odero

Reputation: 151

Use the driver provided by fiona:

data=shapefile.to_file("file.geojson",driver='GeoJSON')

data=geopandas.read_file("file.geojson")

data

Upvotes: 1

Alex Carruthers
Alex Carruthers

Reputation: 445

Shapely returns a python dict where all the coordinates are in tuples. You need to convert to JSON in order for mapbox, etc... to properly accept it.

json.dumps(shapely.geometry.mapping(shapelyObject))

Upvotes: 31

MCMZL
MCMZL

Reputation: 1146

To write a standard geojson object using pandas you shall use the driver provided by fiona as recommended in the documentation

gdf.to_file('path/to/file.geojson', driver='GeoJSON')

See import fiona; fiona.supported_drivers for a list of fully supported drivers

Upvotes: 9

joris
joris

Reputation: 139302

If you don't want to create this dict manually, you can also rely on geopandas creating it:

In [1]: import shapely.geometry

In [2]: import geopandas

In [3]: shapely_polygon = shapely.geometry.Polygon([(0, 0), (0, 1), (1, 0)])

In [4]: geopandas.GeoSeries([shapely_polygon]).__geo_interface__
Out[4]: 
{'bbox': (0.0, 0.0, 1.0, 1.0),
 'features': [{'bbox': (0.0, 0.0, 1.0, 1.0),
   'geometry': {'coordinates': (((0.0, 0.0),
      (0.0, 1.0),
      (1.0, 0.0),
      (0.0, 0.0)),),
    'type': 'Polygon'},
   'id': '0',
   'properties': {},
   'type': 'Feature'}],
 'type': 'FeatureCollection'}

(Note that this gives a FeatureCollection and not a single feature.)

Or to a string (or file):

In [4]: geopandas.GeoSeries([shapely_polygon]).to_json()
Out[4]: '{"features": [{"bbox": [0.0, 0.0, 1.0, 1.0], "geometry": {"coordinates": [[[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [0.0, 0.0]]], "type": "Polygon"}, "properties": {}, "id": "0", "type": "Feature"}], "bbox": [0.0, 0.0, 1.0, 1.0], "type": "FeatureCollection"}'

Upvotes: 49

Paul Varghese
Paul Varghese

Reputation: 1655

Something like this should do the trick:

features = [{'type': 'Feature', 'properties': {}, 'geometry': shapely.geometry.mapping(shapelyObject)}]

Now you can try to map features in mapbox. Hope this helps.

Reference: https://gis.stackexchange.com/questions/213717/geometry-workflow-from-shapely-to-geojson

Upvotes: 13

Related Questions