Python+GDAL | 基于矢量(点)读取栅格数据

这篇文章主要描述了如何使用GDAL/OGR打开矢量文件、读取点位的经纬度,并根据经纬度读取栅格数据。

代码

#读取矢量
from osgeo import ogr
import os, sys
#改变工作空间
os.chdir(r'D:\')

#############获取矢量点位的经纬度
#设置driver
driver = ogr.GetDriverByName('ESRI Shapefile')
#打开矢量
ds = driver.Open('sites.shp', 0)
if ds is None:
    print('Could not open ' +'sites.shp')
    sys.exit(1)
#获取图层
layer = ds.GetLayer()

#获取要素及要素地理位置
xValues = []
yValues = []
feature = layer.GetNextFeature()
while feature:
    geometry = feature.GetGeometryRef()
    x = geometry.GetX()
    y = geometry.GetY()
    xValues.append(x)
    yValues.append(y)  
    feature = layer.GetNextFeature()

#############获取点位所在像元的栅格值
#读取栅格
from osgeo import gdal
from gdalconst import *
import os, sys

os.chdir(r'D:\')

#获取注册类
gdal.AllRegister()
#打开栅格数据
ds = gdal.Open('aster.img', GA_ReadOnly)
if ds is None:
    print('Could not open image')
    sys.exit(1)
#获取行列、波段
rows = ds.RasterYSize
cols = ds.RasterXSize
bands = ds.RasterCount
#获取放射变换信息
transform = ds.GetGeoTransform()
xOrigin = transform[0]
yOrigin = transform[3]
pixelWidth = transform[1]
pixelHeight = transform[5]
#
values = []
for i in range(len(xValues)):
    x = xValues[i]
    y = yValues[i]
    #获取点位所在栅格的位置
    xOffset = int((x-xOrigin)/pixelWidth)
    yOffset = int((y-yOrigin)/pixelHeight)
    
    s = str(int(x)) + ' ' + str(int(y)) + ' ' + str(xOffset) + ' '+str(yOffset) + ' '
    #提取每个波段上对应的像元值
    for j in range(bands):
        band = ds.GetRasterBand(j+1)
        data = band.ReadAsArray(xOffset, yOffset,1,1)
        value = data[0,0]
        s = s + str(value) + ' ' 
    print(s)
    values.append(s)
  • 11
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
要实现按照矢量数据的属性裁剪数据,可以使用Python中的GDAL库和OGR库。具体步骤如下: 1.读取矢量数据数据,可以使用OGR库和GDAL库中的相关函数进行读取和处理。 2.获取矢量数据的属性信息,可以使用OGR库中的GetField函数获取属性值。 3.遍历数据中的每一个像素,判断该像素是否在矢量数据范围内。 4.如果该像素在矢量数据范围内,则根据矢量数据的属性值进行裁剪操作。 5.将裁剪后的数据保存为新的数据。 下面是一个简单的示例代码: ```python from osgeo import gdal, ogr # 读取矢量数据 vector = ogr.Open('vector.shp') layer = vector.GetLayer() feature = layer.GetFeature(0) field_value = feature.GetField('field_name') # 读取数据 raster = gdal.Open('raster.tif') band = raster.GetRasterBand(1) cols = raster.RasterXSize rows = raster.RasterYSize # 创建输出数据 driver = gdal.GetDriverByName('GTiff') out_raster = driver.Create('out_raster.tif', cols, rows, 1, band.DataType) out_band = out_raster.GetRasterBand(1) # 遍历数据 for i in range(rows): for j in range(cols): # 获取像素值 pixel_value = band.ReadAsArray(j, i, 1, 1)[0][0] # 判断像素是否在矢量数据范围内 if is_in_vector(layer, j, i): # 根据属性值进行裁剪操作 if pixel_value == field_value: out_band.WriteArray(pixel_value, j, i) # 保存输出数据 out_band.FlushCache() out_band.ComputeStatistics(False) out_raster.SetProjection(raster.GetProjection()) out_raster.SetGeoTransform(raster.GetGeoTransform()) out_raster = None ``` 其中,is_in_vector函数可以根据像素的坐标判断该像素是否在矢量数据范围内。具体实现可以参考OGR库中的SpatialReference类和Geometry类。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值