python gdal,ogr实现geojson转shpfile

本文修改自:【python】geoJson转换Shapefile

gdal,ogr实现geojson转shpfile

import json
import gdal
from osgeo import ogr


def create_polygon(coords):
    ring = ogr.Geometry(ogr.wkbLinearRing)
    for coord in coords:
        for xy in coord:
            ring.AddPoint(xy[0], xy[1])

            poly = ogr.Geometry(ogr.wkbPolygon)
            poly.AddGeometry(ring)
    return poly.ExportToWkt()


def create_shp_with_geoJson(json, shpFile):
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
    gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
    driver = ogr.GetDriverByName("ESRI Shapefile")
    polygon_data_source = driver.CreateDataSource(shpFile)
    polygon_layer = polygon_data_source.CreateLayer("Vector", geom_type=ogr.wkbPolygon)
    field_testfield = ogr.FieldDefn("polygon", ogr.OFTString)
    field_testfield.SetWidth(254)
    polygon_layer.CreateField(field_testfield)

    '''
    polygon_data_source = driver.CreateDataSource(shpFile)
    point_layer = polygon_data_source.CreateLayer("Point", geom_type=ogr.wkbPoint)
    field_testfield = ogr.FieldDefn("point", ogr.OFTString)
    field_testfield.SetWidth(254)
    point_layer.CreateField(field_testfield)

    polygon_data_source = driver.CreateDataSource(shpFile)
    polyline_layer = polygon_data_source.CreateLayer("Line", geom_type=ogr.wkbLineString)
    field_testfield = ogr.FieldDefn("polyline", ogr.OFTString)
    field_testfield.SetWidth(254)
    polyline_layer.CreateField(field_testfield)
    '''

    for i in json['features']:
        geo = i.get("geometry")
        geo_type = geo.get('type')

        if geo_type == 'Polygon':
            # Polygon

            polygonCOOR = geo.get('coordinates')
            poly = create_polygon(polygonCOOR)
            if poly:
                feature = ogr.Feature(polygon_layer.GetLayerDefn())
                feature.SetField('polygon', 'polygon')
                area = ogr.CreateGeometryFromWkt(poly)
                feature.SetGeometry(area)
                polygon_layer.CreateFeature(feature)
                feature = None
        elif geo_type == "MultiPolygon":
            # 简单操作
            feature = ogr.Feature(polygon_layer.GetLayerDefn())
            feature.SetField('polygon', "polygon")

            gjson = ogr.CreateGeometryFromJson(str(geo))
            if gjson:
                feature.SetGeometry(gjson)
                polygon_layer.CreateFeature(feature)
                feature = None
        '''
        elif geo_type == "Point":
            # Point
            feature = ogr.Feature(point_layer.GetLayerDefn())
            feature.SetField('point', "point")

            point_geo = ogr.CreateGeometryFromJson(str(geo))
            if point_geo:
                feature.SetGeometry(point_geo)
                point_layer.CreateFeature(feature)
                feature = None
            pass
        elif geo_type == "LineString":
            # line
            feature = ogr.Feature(polyline_layer.GetLayerDefn())
            feature.SetField('polyline', "polyline")

            line_geo = ogr.CreateGeometryFromJson(str(geo))
            if line_geo:
                feature.SetGeometry(line_geo)
                polyline_layer.CreateFeature(feature)
                feature = None
            pass
        else:
            print('Could not discern geometry')
        '''


#
# geojson to shp
fg = 'input.geojson'
fs = 'out.shp'
with open(fg, 'r') as ff:
    temp = json.loads(ff.read())
    create_shp_with_geoJson(temp, fs)

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GDAL 中,可以通过 `osr` 模块中的 `SpatialReference` 和 `CoordinateTransformation` 类来实现地理坐标与投影坐标的换。下面是一个简单的例子: ```python from osgeo import gdal, osr # 定义源影像和目标影像的文件路径 src_file = 'input.tif' dst_file = 'output.tif' # 定义目标投影 dst_proj = 'EPSG:32650' # 例如,设置目标坐标系为 WGS84 UTM Zone 50N # 打开源影像文件 src_ds = gdal.Open(src_file) # 获取源影像的地理信息和投影信息 src_geo = src_ds.GetGeoTransform() src_proj = osr.SpatialReference() src_proj.ImportFromWkt(src_ds.GetProjection()) # 定义目标投影 dst_proj = osr.SpatialReference() dst_proj.SetFromUserInput(dst_proj) # 创建坐标换对象 coord_trans = osr.CoordinateTransformation(src_proj, dst_proj) # 计算换后的坐标 x, y, _ = coord_trans.TransformPoint(src_geo[0], src_geo[3]) # 输出换后的坐标 print('X: {}'.format(x)) print('Y: {}'.format(y)) # 关闭影像文件 src_ds = None ``` 在上面的例子中,我们打开了一个名为 `input.tif` 的影像文件,并获取了其地理信息和投影信息。然后,我们定义了一个名为 `dst_proj` 的目标投影,创建了一个名为 `coord_trans` 的坐标换对象,并使用 `coord_trans.TransformPoint` 方法计算了换后的坐标。最后,我们输出了换后的坐标,并关闭了影像文件。 需要注意的是,在上面的例子中,我们使用了 `osr.SpatialReference.SetFromUserInput` 方法来设置目标投影,该方法可以根据用户输入的字符串自动识别投影坐标系。如果你已经知道目标投影的 EPSG 代码或 WKT 字符串,也可以使用 `osr.SpatialReference.ImportFromEPSG` 或 `osr.SpatialReference.ImportFromWkt` 方法来设置目标投影。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值