python处理shp和栅格文件的相关库shapefile、gdal等

读取含polygon的shp文件:

def readshp(shp_path):
	sf = shapefile.Reader(shp_path)#创建reader类的对象进行shapefile文件的读取
	shapes = sf.shapes()# .shapes()读取几何数据信息,存放着该文件中所有对象的 几何数据
	#records = sf.records()
	out = []
	for i, shape in enumerate(Shapes):
		polybox = Polygon(shape.points)#shape.points=[(x1,y1),(x2,y2),(x3,y3),…],首尾相连,起始点重复,矩形五个点坐标处于一个列表
		out.append(polybox)
	return out

下图是该函数调试一张含多个矩形polygon的shp文件结果
在这里插入图片描述

def read_TIF(filename):
	dataset = gdal.Open(filename)
	img_width = dataset.RasterXSize#获取栅格宽度 水平方向
	img_height = dataset.RasterYSize#获取栅格高度 竖直方向
	img_nbands = dataset.RasterCount#获取栅格通道数
	geoTransform = dataset.GetGeoTransform()
	x0, y0 = geoTransform[0], geoTransform[3]
	x1, y1 = geoTransform[0] + img_width * geoTransform[1], geoTransform[3] + img_height * geoTransform[5]
	polybox_tif = Polygon([(x0,y0),(x1,y0),(x1,y1),(x0,y1)])
	image_data = dataset.ReadAsArray(0,0,image_width,image_height)
	img_array = img_data.reshape((img_height,img_width,4))
	......

其中,对于gdal库,GDAL中使用dataset表示一个栅格数据(使用抽象类GDALDataset表示),一个dataset包含了对于栅格数据的波段,空间参考以及元数据等信息。一张GeoTIFF遥感影像,一张DEM影像,或者一张土地利用图,在GDAL中都是一个GDALDataset。
在这里插入图片描述

class Grid:
    # 读取图像文件
    def read_img(self, filename):
        data = gdal.Open(filename)  # 打开文件
        im_width = data.RasterXSize  # 读取图像行数
        im_height = data.RasterYSize  # 读取图像列数
        im_geotrans = data.GetGeoTransform()
        # 仿射矩阵,左上角像素的大地坐标和像素分辨率。
        # 共有六个参数,分表代表左上角x坐标;东西方向上图像的分辨率;如果北边朝上,地图的旋转角度,0表示图像的行与x轴平行;左上角y坐标;
        # 如果北边朝上,地图的旋转角度,0表示图像的列与y轴平行;南北方向上地图的分辨率。
        im_proj = data.GetProjection()  # 地图投影信息
        im_data = data.ReadAsArray(0, 0, im_width, im_height)  # 此处读取整张图像
        # ReadAsArray(<xoff>, <yoff>, <xsize>, <ysize>)
        # 读出从(xoff,yoff)开始,大小为(xsize,ysize)的矩阵。
        del data  # 释放内存,如果不释放,在arcgis,envi中打开该图像时会显示文件被占用
        return im_proj, im_geotrans, im_data

对于GetGeoTransform()
GetGeoTransform是仿射变换,计算坐标偏移。(现实世界坐标(地理坐标或投影坐标)与图像坐标行列号),其中Geo[0/3]是现实世界坐标而不是行列号。
0、3 是x和y坐标 起始点现实世界坐标 1、5 是像素宽度和高度 2、4 是x和y方向旋转角

#GetGeoTransform,在真实坐标和栅格数据坐标具有相同srs情况下,计算坐标偏移。
#作用:图像坐标(行列号)和现实世界坐标(投影坐标或地理坐标)之间的转换。是仿射变换,不是投影转换,和上面不同。
#0、3 x\y坐标 起始点现实世界坐标  1、5 像素宽度和高度  2、4 x\y方向旋转角
gt = ds.GetGeoTransform() #正变换:图像坐标到现实世界坐标。正变换时输入行列号,输出的现实世界坐标是栅格图像srs下的坐标
inv_gt = gdal.InvGeoTransform(gt) #逆变换:现实世界坐标到图像坐标
offsets = gdal.ApplyGeoTransform(inv_gt, 465200, 5296000) #逆变换:输入的投影坐标具有和栅格图像的相同的srs
xoff, yoff = map(int, offsets)  #取整

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Python中,要将Shapefile(.shp)这种常见的地理空间数据格式换为栅格(Raster),你可以使用GDALGDAL提供了广泛的地理空间处理功能,包括数据读写、换等。 首先,确保你已经安装了GDAL和 Fiona,这两个分别用于高级地理空间操作和与Shapefile交互: ```bash pip install gdal Fiona ``` 然后,你可以编写一个Python脚本来执行这个换过程。以下是一个简单的示例,假设我们有一个名为`input.shp`的Shapefile,你想将其换为栅格并保存到一个新的tif文件中,栅格分辨率设为10米: ```python from osgeo import ogr, gdal # 设置源Shapefile路径和输出栅格文件路径 source_file = "path_to_your_input.shp" output_raster = "path_to_save_output_raster.tif" # 创建数据驱动器对象 driver = ogr.GetDriverByName("ESRI Shapefile") # 打开Shapefile dataSource = driver.Open(source_file, 0) # 获取第一个层(通常只有一个) layer = dataSource.GetLayer() # 获取几何字段类型(例如,如果Shapefile包含点,则是"POINT") geometry_type = layer.GetGeomType() # 创建栅格驱动(这里假设我们要用GTiff) raster_driver = gdal.GetDriverByName("GTiff") # 创建输出数据集(带GeoTransform和Projection) width = layer.XCount height = layer.YCount bands = 1 projection = layer.GetSpatialRef() geotransform = layer.GetGeometryRef().GetEnvelope() output_dataset = raster_driver.Create(output_raster, width, height, bands, gdal.GDT_Float32, options=["COMPRESS=LZW"]) # 写入元数据 output_dataset.SetProjection(projection.ExportToWkt()) output_dataset.SetGeoTransform(geotransform) # 遍历每个Shapefile特征并创建栅格值 for feature in layer: geom = feature.GetGeometryRef() x, y = geom.GetX(), geom.GetY() # 根据几何类型调整坐标获取方式 output_dataset.WriteArray([x, y], x, y) # 如果是点,可能直接是坐标;如果是线或面,可能需要采样或计算中心点 # 保存并关闭数据集 output_dataset.FlushCache() output_dataset = None # 关闭Shapefile dataSource = None print("Shapefile converted to raster successfully.") ``` 运行这段代码之前,请确认路径和参数正确无误。如果你的Shapefile中的几何类型不是预期的点,可能需要对获取栅格值的部分进行相应调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清梦枕星河~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值