将 geopandas 形状多边形转换为 geojson
Convert geopandas shapely polygon to geojson
我使用 geopandas 创建了一个圆,它返回了一个形状匀称的多边形:
POLYGON: ((...))
我想要这个与 geojson 对象相同的多边形。我运行穿过这个:
shapely.geometry.mapping(shapelyObject)
哪个returns这个:
{'type': 'Polygon', 'coordinates': (((570909.9247264927, 125477.71811034005)...}
但是当我尝试在 mapbox 中映射它时,它没有显示任何内容。我想也许它不完全是一个 geojson 对象。
像这样应该可以解决问题:
features = [{'type': 'Feature', 'properties': {}, 'geometry': shapely.geometry.mapping(shapelyObject)}]
现在您可以尝试在 mapbox 中映射 features
。
希望这有帮助。
参考:
https://gis.stackexchange.com/questions/213717/geometry-workflow-from-shapely-to-geojson
如果你不想手动创建这个字典,你也可以依赖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"}'
要使用 pandas 编写标准的 geojson 对象,您应按照 documentation
中的建议使用 fiona
提供的驱动程序
gdf.to_file('path/to/file.geojson', driver='GeoJSON')
有关完全支持的驱动程序列表,请参阅 import fiona; fiona.supported_drivers
Shapely returns 一个 python 字典,其中所有坐标都在元组中。您需要转换为 JSON 以便 mapbox 等...正确接受它。
json.dumps(shapely.geometry.mapping(shapelyObject))
使用fiona提供的驱动:
data=shapefile.to_file("file.geojson",driver='GeoJSON')
data=geopandas.read_file("file.geojson")
data
您也可以使用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'
假设 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
我使用 geopandas 创建了一个圆,它返回了一个形状匀称的多边形:
POLYGON: ((...))
我想要这个与 geojson 对象相同的多边形。我运行穿过这个:
shapely.geometry.mapping(shapelyObject)
哪个returns这个:
{'type': 'Polygon', 'coordinates': (((570909.9247264927, 125477.71811034005)...}
但是当我尝试在 mapbox 中映射它时,它没有显示任何内容。我想也许它不完全是一个 geojson 对象。
像这样应该可以解决问题:
features = [{'type': 'Feature', 'properties': {}, 'geometry': shapely.geometry.mapping(shapelyObject)}]
现在您可以尝试在 mapbox 中映射 features
。
希望这有帮助。
参考: https://gis.stackexchange.com/questions/213717/geometry-workflow-from-shapely-to-geojson
如果你不想手动创建这个字典,你也可以依赖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"}'
要使用 pandas 编写标准的 geojson 对象,您应按照 documentation
中的建议使用fiona
提供的驱动程序
gdf.to_file('path/to/file.geojson', driver='GeoJSON')
有关完全支持的驱动程序列表,请参阅 import fiona; fiona.supported_drivers
Shapely returns 一个 python 字典,其中所有坐标都在元组中。您需要转换为 JSON 以便 mapbox 等...正确接受它。
json.dumps(shapely.geometry.mapping(shapelyObject))
使用fiona提供的驱动:
data=shapefile.to_file("file.geojson",driver='GeoJSON')
data=geopandas.read_file("file.geojson")
data
您也可以使用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'
假设 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