(Arcgis)Python3.8批量裁剪利用shp文件裁剪tif栅格影像数据

使用环境:
pycharm2020
arcgis pro 中的python3.8

一、pycharm中设置python编译器。左上角“文件”——“设置”——找到python interpreter——找到arcgis pro安装文件夹中的python

D:\ArcGIS Pro\bin\Python\envs\arcgispro-py3\python.exe

使用arcgis pro原因:自带arcpy库,不需要进行pip install安装。(我是有python官网上的,但是不知道为什么装不了arcpy,所以用的这个方法)(代码是python3编写的,如果用arcgis 10.x版本,是python2需要自行修改)

二、python编程
设置 input_folder 变量为包含要裁剪的栅格影像数据的文件夹路径。shapefile 变量应该是用于裁剪的 shapefile 文件的路径。output_folder 变量是用于存储裁剪后的影像数据的文件夹路径。
代码会循环处理输入文件夹中的每个 .tif 文件,使用 Extract by Mask 工具将其裁剪为指定的 shapefile 边界,并将结果保存到输出文件夹中。
请确保在运行代码之前,你已经安装了 ArcPy 库,并根据你的实际情况修改了文件夹路径和文件名。
文件夹路径中如果包含了非UTF-8编码(中文)的字符,第一行加上# -*- coding: utf-8 -*-

# -*- coding: utf-8 -*-

import arcpy
import os

# 设置工作环境
arcpy.env.workspace = r"C:\path\to\workspace"
arcpy.CheckOutExtension("Spatial")

# 输入文件夹路径和shapefile路径
input_folder = r"C:\path\to\input_folder"
shapefile = r"C:\path\to\shapefile.shp"

# 输出文件夹路径
output_folder = r"C:\path\to\output_folder"
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 获取输入文件夹中的所有tif文件
tif_files = [file for file in os.listdir(input_folder) if file.endswith(".tif")]

# 循环处理每个tif文件
for tif_file in tif_files:
    # 输入tif文件路径
    input_tif = os.path.join(input_folder, tif_file)
    
    # 输出tif文件路径
    output_tif = os.path.join(output_folder, tif_file)
    
    # 使用Extract by Mask工具进行裁剪
    arcpy.gp.ExtractByMask_sa(input_tif, shapefile, output_tif)
    
    print(f"Cropped {tif_file} successfully!")

print("All files cropped successfully!")

Python中,要将Shapefile(.shp)这种常见的地理空间数据格式转换为栅格(Raster),你可以使用GDAL库。GDAL提供了广泛的地理空间处理功能,包括数据读写、转换等。 首先,确保你已经安装了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中的几何类型不是预期的点,可能需要对获取栅格值的部分进行相应调整。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是筱倩阿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值