写一段处理栅格数据并保存的python代码
时间: 2023-12-28 12:03:23 浏览: 148
以下是一个处理栅格数据的示例代码,它使用了Python中的GDAL库读取和处理栅格数据,并将结果保存为新的栅格文件。
```python
import gdal
# 读取栅格数据
input_raster = gdal.Open('path/to/input/raster.tif')
band = input_raster.GetRasterBand(1)
data = band.ReadAsArray()
# 对栅格数据进行处理
new_data = data * 2
# 创建新的栅格文件
driver = gdal.GetDriverByName('GTiff')
output_raster = driver.CreateCopy('path/to/output/raster.tif', input_raster)
# 将新的数据写入新的栅格文件
output_band = output_raster.GetRasterBand(1)
output_band.WriteArray(new_data)
# 保存新的栅格文件
output_band.FlushCache()
output_raster = None
```
在这个示例中,我们首先使用GDAL库打开了一个栅格文件并读取了其第一个波段的数据。然后,我们对数据进行了简单的处理,将其乘以2。接下来,我们使用GDAL的CreateCopy方法创建了一个新的栅格文件,该文件与原始文件具有相同的元数据和投影。最后,我们将新的数据写入新的栅格文件并保存它。
相关问题
用python写一段矢量转栅格的代码
好的,下面是一段用Python实现矢量转栅格的代码,基于GDAL库:
```python
import gdal
import numpy as np
# 打开矢量文件
src_ds = gdal.Open('vector.shp')
# 获取矢量文件范围、分辨率和投影
xmin, xres, xskew, ymax, yskew, yres = src_ds.GetGeoTransform()
xsize = src_ds.RasterXSize
ysize = src_ds.RasterYSize
proj = src_ds.GetProjection()
# 创建栅格数据集
dst_ds = gdal.GetDriverByName('GTiff').Create('raster.tif', xsize, ysize, 1, gdal.GDT_Byte)
# 设置栅格数据集的范围、分辨率和投影
dst_ds.SetGeoTransform((xmin, xres, xskew, ymax, yskew, yres))
dst_ds.SetProjection(proj)
# 将矢量文件转换为栅格数据
gdal.RasterizeLayer(dst_ds, [1], src_ds.GetLayer(), burn_values=[255])
# 读取栅格数据
data = dst_ds.GetRasterBand(1).ReadAsArray()
# 将栅格数据转换为二进制数组
binary_data = np.where(data == 255, 1, 0)
# 保存二进制数组为文本文件
np.savetxt('binary.txt', binary_data, fmt='%d')
```
假设我们要将一个名为“vector.shp”的矢量文件转换为栅格数据,代码将创建一个名为“raster.tif”的栅格数据集,并将其保存为二进制数组“binary.txt”。注意,这段代码仅将矢量文件中的一个图层转换为栅格数据,如果要转换多个图层,则需要对每个图层分别进行操作。
rasterio栅格数据分析代码
下面是使用Rasterio进行栅格数据分析的示例代码:
```python
import rasterio
import numpy as np
import matplotlib.pyplot as plt
# 打开栅格数据
with rasterio.open('path/to/raster.tif') as src:
# 读取数据和元数据
data = src.read()
meta = src.meta
# 查看数据的维度、数据类型和范围
print('Data shape:', data.shape)
print('Data type:', data.dtype)
print('Data range:', np.min(data), np.max(data))
# 可视化数据
plt.imshow(data[0], cmap='gray')
plt.show()
# 重投影数据
from rasterio.warp import calculate_default_transform, reproject, Resampling
dst_crs = 'EPSG:4326'
transform, width, height = calculate_default_transform(meta['crs'], dst_crs, meta['width'], meta['height'], *meta['bounds'])
meta.update({'crs': dst_crs, 'transform': transform, 'width': width, 'height': height})
with rasterio.open('path/to/reprojected.tif', 'w', **meta) as dst:
reproject(
source=rasterio.band(data, 1),
destination=rasterio.band(dst, 1),
src_transform=meta['transform'],
src_crs=meta['crs'],
dst_transform=transform,
dst_crs=dst_crs,
resampling=Resampling.nearest
)
# 剪切数据
from rasterio.mask import mask
# 定义裁剪区域
geometry = {'type': 'Polygon', 'coordinates': [[(x1, y1), (x2, y2), (x3, y3), (x4, y4)]]}
# 根据裁剪区域获取掩膜
mask = rasterio.features.geometry_mask([geometry], out_shape=data.shape, transform=meta['transform'], invert=True)
# 剪切数据
clipped_data = data[:, mask]
# 可视化剪切后的数据
plt.imshow(clipped_data[0], cmap='gray')
plt.show()
```
这段代码首先使用`rasterio.open()`函数打开一个栅格数据,然后读取数据和元数据。接着,我们查看了数据的维度、数据类型和范围,并可视化了数据。然后,我们使用`rasterio.warp.reproject()`函数将数据重投影到一个新的坐标系,并保存为一个新的栅格数据。最后,我们使用`rasterio.mask.mask()`函数根据一个裁剪区域获取掩膜,并用掩膜剪切了数据。
阅读全文