python gdal 按照属性提取矢量,并进行影像裁切

# -  *  -  coding:utf-8  -  *  - 
“”“ 
/ ******************* ************ 
ClipRaster.py:1 
    。按照属性提取矢量(在上层进行操作)
    2。矢量转为同源数据的栅格掩膜(某些矢量存在交叉点,无法使用gdalwarp进行裁切)
    3.栅格掩膜与源数据进行运行,得到裁切后的影像@version <1.1> 2018-07-03 Wujd:创建。“” 来自osgeo import ogr 来自osgeo import gdal 来自osgeo import gdal_array作为ga import os,math,ogr,osr #解决SHAPE文件的属性值










gdal.SetConfigOption('SHAPE_ENCODING', '')
# #解决中文路径乱码问题
# gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")

"""
路径设置
"""
input_vector ='./data/lns_210000_city.shp'
input_raster ='./data/GF1_WFV4_E124.8_N43.3_20180524_L1A0003210738_cal_orth.tiff'
extent_vector = './result/clip/lns_210000_city_42000102_clip.shp'
extent_raster = './result/clip/image_extent.tiff'
clip_raster = './result/clip/image_42000102_clip.tiff'


def copyInLayer(input_vector,extent_vector,filterStr):

    ds = ogr.Open(input_vector)
    driver = ogr.GetDriverByName("ESRI Shapefile")

    if os.access(extent_vector, os.F_OK):
        driver.DeleteDataSource(extent_vector)
    layer = ds.GetLayer()

    #findLayer = ds.ExecuteSQL("select * from lns_210000_city where 行政代码 = 211400 ")
    #filterStr="{} = {}".format('ID', 266)
    layer.SetAttributeFilter(filterStr)
    newds = driver.CreateDataSource(extent_vector)
    newds.CopyLayer(layer,'')
    newds.Destroy()def polygon2mask(extent_vector,input_raster,extent_raster):    “”“将具有多个功能的ESRI形状文件刻录到掩码文件        中输入栅格文件的扩展和分辨率。        多个特征由id的值表示    :param str extent_vector:输入ESRI形状文件    :param srt input_raster:基于烧录形状文件的输入栅格文件    :param srt extent_raster:out文件名,格式:csv     :param str字段:用于区分不同功能                 的字段,字段值应为数字类型,默认为“id”










    :return: status, 0 for success, 1 for failure
    """
    '''Open the shape file'''
    shp_driver = ogr.GetDriverByName("ESRI shapefile")
    shp_ds = shp_driver.Open(extent_vector)

    layer = shp_ds.GetLayer(0)

    '''Open the raster file'''
    raster_ds = gdal.Open(input_raster)
    ncol = raster_ds.RasterXSize
    nrow = raster_ds.RasterYSize
    proj = raster_ds.GetProjection()
    gt = raster_ds.GetGeoTransform()

    driver = gdal.GetDriverByName("GTiff")
    out_ds = driver.Create(extent_raster, ncol, nrow, 1, gdal.GDT_Byte)
    out_ds.SetProjection(proj)
    out_ds.SetGeoTransform(gt)
    band = out_ds.GetRasterBand(1)
    band.Fill(0)
    band.SetNoDataValue(0)

    #attribute = 'ATTRIBUTE=' + field
    status = gdal.RasterizeLayer(out_ds,  # output to our new dataset
                                 [1],  # output to our new dataset's first band
                                 layer,  # rasterize this layer
                                 None, None,  # No projection transform
                                 [1],  # burn value 0
                                 ['All_TOUCHED=TRUE'])  # rasterize all pixels touched by polygons
    del out_ds, shp_ds, raster_ds
    return status

def clipRaster(extent_raster,input_raster,clip_raster):

    extentArray = ga.LoadFile(extent_raster)
    inputArray = ga.LoadFile(input_raster)

    outputArray = extentArray*inputArray

    print(outputArray)

    out = ga.SaveArray(outputArray,clip_raster,format="GTiff",prototype=input_raster)    #prototype 原型设置为输入影像的格式
    out = None

if __name__ =='__main__':

    filterStr = "ID = 266"
    copyInLayer(input_vector, extent_vector, filterStr)
    polygon2mask(extent_vector, input_raster, extent_raster)
    clipRaster(extent_raster, input_raster, clip_raster)

    #copyInLayer(inshp, outputfile, filterStr)

    #polygon2mask(outputfile,rasterfile,outname)

    #clipRaster()

结果:
原始影像和矢量
原始影像和矢量
裁切后的影像和矢量
这里写图片描述

待优化的问题:

 filterStr = "行政代码 = 211200"
 layer.SetAttributeFilter(filterStr)

gdal执行sql表达式,含有中文字段名的无法运行
C:\ProgramData\Anaconda3\python.exe F:/20180703/ClipRaster_f.py
ERROR 1: SQL Expression Parsing Error: syntax error, unexpected end of string. Occurred around :
行政代码 = 211200
————----------
C:\ProgramData\Anaconda3\python.exe F:/20180703/ClipRaster_f.py
ERROR 1: “行政代码” not recognised as an available field.

解决遇到的问题:
1.gdal中无法读取到中文属性值,使用SetConfigOption

gdal.SetConfigOption(‘SHAPE_ENCODING’, ‘’)

2.按照属性提取矢量,在layer层次上进行拷贝

layer.SetAttributeFilter(filterStr)
newds = driver.CreateDataSource(extent _ vector)> newds.CopyLayer(layer,’’)3。矢量存在交叉点无法裁切,使用矢量转栅格掩膜的方法> out _ ds = driver.Create(extent _ raster,ncol,nrow,1,gdal.GDT _ Byte)> status = gdal.RasterizeLayer(out _ ds,[1],layer,None,None,[1],[‘All _ TOUCHED = TRUE’])4 。使用源数据信息输出裁切影像> ga.SaveArray(outputArray,clip _ raster,format =“GTiff”,prototype = input _ raster)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中使用GDAL进行矢量叠加可以通过以下步骤实现: 1. 导入所需的库和模块: ```python import ogr import osr from osgeo import gdal ``` 2. 打开两个矢量文件: ```python shp1 = ogr.Open("path/to/shp1.shp") lyr1 = shp1.GetLayer() shp2 = ogr.Open("path/to/shp2.shp") lyr2 = shp2.GetLayer() ``` 3. 创建一个新的矢量数据集和图层来存储叠加结果: ```python driver = ogr.GetDriverByName("ESRI Shapefile") output = driver.CreateDataSource("path/to/output.shp") output_lyr = output.CreateLayer("output", geom_type=ogr.wkbPolygon) ``` 4. 复制shp1的属性表结构到输出图层中: ```python lyr1_def = lyr1.GetLayerDefn() for i in range(lyr1_def.GetFieldCount()): output_lyr.CreateField(lyr1_def.GetFieldDefn(i)) ``` 5. 逐个读取shp1的要素,并使用Intersect方法与shp2进行叠加: ```python for feat1 in lyr1: geom1 = feat1.GetGeometryRef() # 筛选与shp1要素相交的shp2要素 lyr2.SetSpatialFilter(geom1) for feat2 in lyr2: geom2 = feat2.GetGeometryRef() # 判断两个要素是否相交 if geom1.Intersect(geom2): # 创建新的要素 output_feat = ogr.Feature(output_lyr.GetLayerDefn()) # 复制shp1的属性值到输出要素中 for i in range(lyr1_def.GetFieldCount()): output_feat.SetField(i, feat1.GetField(i)) # 将shp1和shp2的几何形状进行叠加 output_feat.SetGeometry(geom1.Intersection(geom2)) # 将新要素添加到输出图层 output_lyr.CreateFeature(output_feat) # 删除shp2筛选器 lyr2.SetSpatialFilter(None) break ``` 6. 关闭打开的矢量文件和输出数据集: ```python shp1 = None shp2 = None output = None ``` 这样,你就可以通过使用GDAL库的API在Python中实现两个矢量shp的叠加操作了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值