将geopandas shapely多边形转换为geojson

34
我使用geopandas创建了一个圆形,并返回了一个shapely多边形:
POLYGON: ((...))

我希望将这个相同的多边形转换为GeoJSON对象。我发现了这个:

shapely.geometry.mapping(shapelyObject)

返回这个:

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

但是当我试图在Mapbox中进行映射时,它没有显示任何内容。我认为可能它不是完全的GeoJSON对象。


1
请查看 https://www.mapbox.com/help/define-geojson/。 - Paul Varghese
@PaulVarghese 那我只需要将它包装在 "geometry": { } 中吗? - conv3d
8个回答

48

如果您不想手动创建此字典,也可以依靠geopandas来创建它:

翻译后:

如果你不想手动创建这个字典,你也可以依赖于 geopandas 来创建:

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'}

(请注意,这将得到一个FeatureCollection而不是单个要素。)

或者将其转换为字符串(或文件):

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"}'

5
我明白了:AttributeError: 'Series' 对象没有属性 'geo_interface'。 - Jan Pisl

28

Shapely返回一个Python字典,其中所有坐标都在元组中。您需要将其转换为JSON才能使Mapbox等地图服务正确接受它。

{"Shapely返回一个Python字典,其中所有坐标都在元组中。您需要将其转换为JSON才能使Mapbox等地图服务正确接受它。"}
json.dumps(shapely.geometry.mapping(shapelyObject))

2
当然,最终它变得像json.dumps()一样简单。 - Akaisteph7
如何将其加载回来并创建一个有形的对象? - Marek
如何将其加载回来并创建一个有形的对象? - undefined

11

9
使用pandas编写标准的geojson对象时,应使用文档中建议的fiona提供的驱动程序进行操作。请参见文档
gdf.to_file('path/to/file.geojson', driver='GeoJSON')

请查看import fiona; fiona.supported_drivers获取完全支持的驱动程序列表。


4
假设 polygon_list 是一个由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

1
你也可以使用 PyShp
import shapefile

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

或者

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

例子用法:
>>> geojson_data["type"]

'MultiPolygon'

1
使用fiona提供的驱动程序:
data=shapefile.to_file("file.geojson",driver='GeoJSON')

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

data

2
你好,能否提供更多关于你回答的细节呢?例如,你可以解释一下你的解决方案是如何运作的,以及提问者可能遗漏了什么信息等等。这将有助于未来阅读该帖子的其他人更好地理解你的解决方案。谢谢。 - EnriqueBet
geopandas使用fiona进行数据转换,fiona具有驱动程序,例如从geodataframe创建shapefile、geojson等。如果您需要在fiona中检查驱动程序,只需键入>import fiona >fiona.supported_drivers,结果应为{'ESRI Shapefile': 'raw','ARCGEN': 'r','PCIDSK': 'r','SUA': 'r','DGN': 'raw','SEGY': 'r','MapInfo File': 'raw','GeoJSON': 'rw','PDS': 'r','FileGDB': 'raw','GPX': 'raw','DXF': 'raw','GMT': 'raw','Idrisi': 'r','GPKG': 'rw','OpenFileGDB': 'r','BNA': 'raw','AeronavFAA': 'r','GPSTrackMaker': 'raw'}。 - Francis Odero

0

使用geopandas,您可以进行以下操作:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接