Python——栅格转矢量

Python栅格转矢量

在利用python进行栅格转矢量操作时,我们可以选择gdal、shapely等多个库包进行

现提出两种栅格转矢量方法,其一利用shapely+geopandas+rasterio,其二利用gdal进行

总体来说,前者更为简单,且矢量相同属性合并时,建议使用geopandas,因为gdal真的很麻烦(就目前所使用的的方法来说。。。

如果小伙伴有针对gdal相同属性矢量合并功能较为简单的代码的话,欢迎留言,一起学习啦~~

利用shapely+rasterio+geopandas进行栅格转矢量

#!usr/bin/env python
# -*- coding: utf-8 -*-
"""
date:2022/11/17
author:甲戌_Tr
email: liu_xxxi@163.com
"""

import rasterio
from rasterio import features
from shapely.geometry import shape
import geopandas as gpd

def raster2polygon(inraster,outshp,nodata=0):
    out_shp = gpd.GeoDataFrame(columns=['DN','geometry'])

    with rasterio.open(inraster) as f:
        image = f.read(1)
        img_crs = f.crs
        image[image == f.nodata] = nodata

        i = 0
        for coords, value in features.shapes(image, transform=f.transform):
            if value != nodata:
                geom = shape(coords)
                out_shp.loc[i] = [value,geom]
                i += 1

    out_shp.set_geometry('geometry',inplace=True)
    out_shp = out_shp.dissolve(by='DN')

    out_shp.to_file(outshp,crs=img_crs)

    return out_shp

利用gdal进行栅格转矢量

#!usr/bin/env python
# -*- coding: utf-8 -*-
"""
date:2022/11/17
author:甲戌_Tr
email: liu_xxxi@163.com
"""

from osgeo import gdal,ogr,osr

def gdal_raster2polygon(inraster,outshp):
    raster_ds = gdal.Open(inraster)
    band = raster_ds.GetRasterBand(1)

    raster_proj = osr.SpatialReference(wkt=raster_ds.GetProjection())
    epsg_num = raster_proj.GetAttrValue('AUTHORITY',1)
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(int(epsg_num))

    # srs.ImportFromWkt(raster_ds.GetProjection())

    driver = ogr.GetDriverByName("memory")

    out_ds = driver.CreateDataSource('out')

    out_layer = out_ds.CreateLayer('out',srs=srs,geom_type=ogr.wkbPolygon)

    field = ogr.FieldDefn('DN',ogr.OFTInteger)
    out_layer.CreateField(field)

    gdal.Polygonize(band,band,out_layer,0,[],callback=None)

    # 对相同DN值的矢量进行合并
    multipoly = True

    driver = ogr.GetDriverByName('ESRI Shapefile')

    union_ds = driver.CreateDataSource(outshp)
    union_layer = union_ds.CreateLayer(outshp,srs=srs,geom_type=ogr.wkbPolygon)


    ###分级字段创建
    fd = ogr.FieldDefn('DN', ogr.OFTInteger)
    union_layer.CreateField(fd)  # 创建字段

    unique_DN = []
    for f in out_layer:
        f_value = f.GetField("DN")
        if f_value not in unique_DN:

            unique_DN.append(int(f_value))

    out_layer.ResetReading()

    defn = out_layer.GetLayerDefn()

    for i in unique_DN:
        field_sql = f"DN={str(i)}"

        out_layer.SetAttributeFilter(field_sql)
        multi = ogr.Geometry(ogr.wkbMultiPolygon)

        for feat in out_layer:
            if feat.geometry():
                wkt = feat.geometry().ExportToWkt()
                multi.AddGeometryDirectly(ogr.CreateGeometryFromWkt(wkt))

        union = multi.UnionCascaded()
        geo_name = union.GetGeometryName()

        if geo_name != 'MULTIPOLYGON':
            multipoly = False

        if multipoly is False:
            for geom in union:
                poly = ogr.CreateGeometryFromWkb(geom.ExportToWkb())
                feat = ogr.Feature(defn)
                feat.SetGeometry(poly)
                union_layer.CreateFeature(feat)
                union_layer.ResetReading()
        else:
            out_feat = ogr.Feature(defn)
            out_feat.SetGeometry(union)
            out_feat.SetField('DN', i)
            union_layer.CreateFeature(out_feat)
            union_layer.ResetReading()

    union_layer.SetAttributeFilter(None)
    for ft in union_layer:
        if ft.GetField ('DN') ==None:
            union_layer.DeleteFeature(ft.GetFID())

    union_layer = None
    union_ds = None

欢迎指正~~

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!要使用GDAL库在Python中进行栅格矢量操作,您可以按照以下步骤进行: 1. 安装GDAL库:在Python环境中安装GDAL库,可以使用pip命令来安装,如下所示: ``` pip install gdal ``` 2. 导入GDAL库:在Python脚本中导入GDAL库,可以使用以下代码: ``` from osgeo import gdal, ogr ``` 3. 打开栅格文件:使用GDAL库的Open函数打开栅格文件,如下所示: ``` raster_ds = gdal.Open('path/to/raster/file.tif') ``` 4. 获取栅格图层:使用GDAL库的GetRasterBand函数获取栅格图层,如下所示: ``` band = raster_ds.GetRasterBand(1) ``` 5. 创建矢量数据源:使用GDAL库的CreateDataSource函数创建矢量数据源,如下所示: ``` driver = ogr.GetDriverByName('ESRI Shapefile') vector_ds = driver.CreateDataSource('path/to/vector/file.shp') ``` 6. 创建矢量图层:使用矢量数据源的CreateLayer函数创建矢量图层,如下所示: ``` layer = vector_ds.CreateLayer('layer_name', geom_type=ogr.wkbPolygon) ``` 7. 定义矢量属性:使用图层的CreateField函数定义矢量属性,如下所示: ``` field_defn = ogr.FieldDefn('attribute_name', ogr.OFTString) layer.CreateField(field_defn) ``` 8. 栅格矢量:使用GDAL库的Polygonize函数将栅格换为矢量,如下所示: ``` gdal.Polygonize(band, None, layer, 0, [], callback=None) ``` 9. 保存矢量文件:使用矢量数据源的SyncToDisk函数保存矢量文件,如下所示: ``` vector_ds.SyncToDisk() ``` 这些是使用GDAL库在Python中进行栅格矢量的基本步骤。您可以根据自己的需求对代码进行进一步的调整和优化。希望对您有所帮助!如果有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值