首頁 > 軟體

Python shapefile轉GeoJson的2種方式範例

2023-03-09 06:04:45

GeoJson的簡要介紹

GeoJson是用json的語法表達和儲存地理資料,可以說是json的子集。

GeoJson以鍵值對的形式儲存原有物件的資訊,具有輕量化、易解析等優點。

GeoJson包括的地理要素有Point(點)、 MultiPoint(多點)、 LineString(線)、MultiLineString(多線)、 Polygon(面)、 MultiPolygon(多面)、 GeometryCollection(幾何集合)

這些地理要素包括在geometry的type屬性中,並且不同的type具有不同的coordinates值。更多的GeoJson相關內容可參考RFC7946標準。

     {
         "type": "MultiPoint",
         "coordinates": [
             [100.0, 0.0],
             [101.0, 1.0]
         ]
     }
 
 
     {
         "type": "MultiPolygon",
         "coordinates": [
             [
                 [
                     [102.0, 2.0],
                     [103.0, 2.0],
                     [103.0, 3.0],
                     [102.0, 3.0],
                     [102.0, 2.0]
                 ]
             ],
             [
                 [
                     [100.0, 0.0],
                     [101.0, 0.0],
                     [101.0, 1.0],
                     [100.0, 1.0],
                     [100.0, 0.0]
                 ],
                 [
                     [100.2, 0.2],
                     [100.2, 0.8],
                     [100.8, 0.8],
                     [100.8, 0.2],
                     [100.2, 0.2]
                 ]
             ]
         ]
     }

兩種將shapefile檔案轉換為GeoJson的方式

1. 使用geopandas

核心程式碼:geopandas.GeoSeries 和out_data.to_file

import geopandas as gpd
 
def shp2geojson_gpd(shp_file, geojson_file):
    """
    將shapefile格式的檔案轉化為geojson
    :param shp_file: 需要轉換的shapefile檔名,投影資訊可以缺失,也可以指定
    :param geojson_file: 轉換輸出的geojson檔名
    """
 
    if os.path.exists(geojson_file):
        os.remove(geojson_file)
 
    out_data = gpd.read_file(shp_file)
    crs = out_data.crs
    out_data = gpd.GeoSeries(out_data.geometry, crs=crs)
    out_data.to_file(geojson_file, driver='GeoJSON', encoding="utf-8")
    print("successfully convert shapefile to geojson")

使用geopandas轉換的時候兩行核心程式碼即可搞定,簡單粗暴。但是在實踐過程中發現,採用geopandas轉換後的GeoJson檔案並沒有保留shapefile中的屬性properities資訊,如area, name等,如下圖所示:

2. 使用gdal

import gdal 
import ogr
import os
 
def shp2geojson_gdal(shp_file, geojson_file):
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
    gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
    src_ds = ogr.Open(shp_file)
    src_layer = src_ds.GetLayer(0)
 
    # 建立結果Geojson
    baseName = os.path.basename(geojson_file)
    dst_driver = ogr.GetDriverByName('GeoJSON')
    dst_ds = dst_driver.CreateDataSource(geojson_file)
    if dst_ds.GetLayer(baseName):
        dst_ds.DeleteLayer(baseName)
    dst_layer = dst_ds.CreateLayer(baseName, src_layer.GetSpatialRef())
    dst_layer.CreateFields(src_layer.schema)
    dst_feat = ogr.Feature(dst_layer.GetLayerDefn())
 
    # 生成結果檔案
    for feature in src_layer:
        dst_feat.SetGeometry(feature.geometry())
        for j in range(feature.GetFieldCount()):
            dst_feat.SetField(j, feature.GetField(j))
        dst_layer.CreateFeature(dst_feat)
 
    del dst_ds
    del src_ds
    print("successfully convert shapefile to geojson")

結果包含原始shapefile檔案中的屬性資訊:

總結

到此這篇關於Python shapefile轉GeoJson的2種方式的文章就介紹到這了,更多相關Python shapefile轉GeoJson內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com