Python地理数据处理 22:基于arcpy批量操作(四)

这篇具有很好参考价值的文章主要介绍了Python地理数据处理 22:基于arcpy批量操作(四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 批量裁剪进阶

代码描述:遍历a文件夹下的所有tif影像,并使用每个a文件夹中的tif影像对b文件夹下的所有tif影像进行裁剪。裁剪后的栅格将以两个tif文件进行组合命名,并保存到另一个文件夹中。

# -*- coding: cp936 -*-
import arcpy
import os
import time

start = time.clock()
arcpy.CheckOutExtension("spatial")

arcpy.CheckOutExtension("spatial")
a_folder = r"D:\dataset\a"
b_folder = r"D:\dataset\b"
output_folder = r"D:\dataset\output_tif"

# 设置工作环境
arcpy.env.workspace = a_folder

# 获取a文件夹下的所有tif影像
a_rasters = arcpy.ListRasters("*", "TIF")

# 创建输出文件夹
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# 遍历a文件夹下的每个tif影像
for indexa, a_raster in enumerate(a_rasters):
    # 构建输出文件名前缀
    a_name = os.path.splitext(a_raster)[0]

    a_raster = a_folder + "\\" + a_name + ".tif"
    
    # 设置工作环境为b文件夹
    arcpy.env.workspace = b_folder
    
    # 获取b文件夹下的所有tif影像
    b_rasters = arcpy.ListRasters("*", "TIF")
    
    # 遍历b文件夹下的每个tif影像
    for indexb, b_raster in enumerate(b_rasters):
        # 构建输出文件名
        output_name = a_name + "_" + os.path.splitext(b_raster)[0] + ".tif"
        
        # 构建输出路径
        output_path = os.path.join(output_folder, output_name)
        
        # 设置工作环境为a文件夹
        arcpy.env.workspace = a_folder

        b_raster = b_folder + "\\"  + b_raster
        
        # 裁剪b影像到输出路径
        arcpy.gp.ExtractByMask_sa(b_raster, a_raster, output_path)
        
        index = indexa + indexb + 1
        print "{} have been completed and the current file is ".format(index) + output_name

end = time.clock()  
print "All finish!!!"

2. 统计运算

获取栅格数据的平均值,并输出程序运行进度:

# -*- coding: utf-8 -*-
import arcpy
import os
import glob
from arcpy.sa import *

arcpy.CheckOutExtension("ImageAnalyst")
arcpy.CheckOutExtension("spatial")

input_folder = r"D:\dataset"
output_file = r'D:\dataset\Meandata.csv'

rasters = glob.glob(os.path.join(input_folder, "*.tif"))
where_clause = "VALUE = -32556"

total_rasters = len(rasters)
processed_rasters = 0

with open(output_file, 'w') as output:
    for raster in rasters:
        outSetNull = SetNull(raster, raster, where_clause)
        meanValueInfo = arcpy.GetRasterProperties_management(outSetNull, 'MEAN')
        meanValue = meanValueInfo.getOutput(0)
        output.write(os.path.basename(raster).split('.')[0] + ',' + str(meanValue) + '\n')
        
        processed_rasters += 1
        progress = float(processed_rasters) / total_rasters * 100
        print("Processed {} out of {} rasters. Progress: {:.2f}%".format(processed_rasters, total_rasters, progress))

print("All processing is done!")

程序运行进度:
Python地理数据处理 22:基于arcpy批量操作(四)

3. 栅格批量缩小n倍

某文件夹中包含多个子文件夹,如:“2003clip”, “2004clip”, “2005clip”, “2006clip”, “2007clip”, “2008clip”, “2009clip”, 每个子文件夹中包含多个tif图像,现在需要对这些图像乘以缩放因子,如0.0001

# -*- coding: cp936 -*-
import arcpy
import os
arcpy.CheckOutExtension('Spatial')

# 输入文件夹和输出文件夹路径
input_folder = r"D:\Datasets"
output_folder = r"D:\Datasets\缩小10000倍"

# 遍历输入文件夹中的所有子文件夹
for folder_name in ["2003clip", "2004clip", "2005clip", "2006clip", "2007clip", "2008clip", "2009clip"]:
    print folder_name
    # 子文件夹路径
    folder_path = os.path.join(input_folder, folder_name)
    
    # 获取子文件夹中的所有tif文件
    tif_files = [file for file in os.listdir(folder_path) if file.endswith(".tif")]
    
    # 遍历每个tif文件
    for tif_file in tif_files:
        # 输入tif文件路径
        input_tif = os.path.join(folder_path, tif_file)
        
        # 输出tif文件路径
        output_tif = os.path.join(output_folder, tif_file)
        
        # 打开Raster对象
        raster = arcpy.Raster(input_tif)
        
        # 过滤像元值大于10000和小于0的像元
        filtered_raster = arcpy.sa.Con((raster >= 0) & (raster <= 10000), raster)
        
        # 对过滤后的像元乘以0.0001
        scaled_raster = filtered_raster * 0.0001
        
        # 保存输出tif文件
        scaled_raster.save(output_tif)
        print folder_name + "OK!!!"
        
print "Finish!!!"

4. 建立属性表(简化、普适)

之前已经写过如何建立栅格属性表:Python地理数据处理 十九:arcpy批量处理数据之为栅格数据建立属性表并导出
现在,结合之前的,写一个更加简单普适的代码,方便今后使用:

# -*- coding: utf-8 -*-
import arcpy
import os
arcpy.CheckOutExtension("Spatial")

# 设置工作空间
arcpy.env.workspace = r"D:\dataset"

# 获取文件夹中的所有栅格数据
raster_list = arcpy.ListRasters()

# 检查是否有至少一个栅格数据
if len(raster_list) < 1:
    print("文件夹中至少需要有一个栅格数据才能建立属性表。")
    exit()

# 循环处理每个栅格数据
for raster in raster_list:
    raster_path = os.path.join(arcpy.env.workspace, raster)

    # 建立属性表
    arcpy.BuildRasterAttributeTable_management(raster_path)
    print "属性表已建立完成: {}。".format(raster)

print("属性表已建立完成。")

5. 计算土地利用未变化区域(LUCC)

土地利用数据每年都在变化,如何判断20年的土地利用变化数据中,哪些地方是未变化的?这是需要解决的一个问题,该代码实现以上内容,将变化的数据设置为100。
数据来源:GEE11:2个土地覆盖数据(LUCC)分享和下载文章来源地址https://www.toymoban.com/news/detail-445371.html

# -*- coding: utf-8 -*-
import arcpy
import os
arcpy.CheckOutExtension("Spatial")

# 设置工作空间
arcpy.env.workspace = r"D:\dataset"

# 获取文件夹中的所有tif影像
tif_list = arcpy.ListRasters("*.tif")

# 检查是否有至少2个tif影像
if len(tif_list) < 2:
    print("文件夹中至少需要有2个tif影像才能进行计算。")
    exit()

# 选择第一个tif影像作为基准影像
base_tif = tif_list[0]
base_tif_path = os.path.join(arcpy.env.workspace, base_tif)

# 读取基准影像的像素数组
base_raster = arcpy.Raster(base_tif_path)
base_array = arcpy.RasterToNumPyArray(base_raster)

# 循环处理每个tif影像
for tif in tif_list[1:]:
    tif_path = os.path.join(arcpy.env.workspace, tif)

    # 读取当前影像的像素数组
    current_raster = arcpy.Raster(tif_path)
    current_array = arcpy.RasterToNumPyArray(current_raster)

    # 对比基准数组和当前数组的像素值
    comparison_array = (base_array == current_array)

    # 将不相等的像素值置为100
    result_array = current_array.copy()
    result_array[~comparison_array] = 100

    # 更新基准数组为结果数组
    base_array = result_array

    print ("正常处理{}".format(tif))

# 创建输出栅格
output_raster = arcpy.NumPyArrayToRaster(result_array, arcpy.Point(base_raster.extent.XMin, base_raster.extent.YMin),
                                         base_raster.meanCellWidth, base_raster.meanCellHeight)

# 设置输出路径和名称
output_path = os.path.join(arcpy.env.workspace, "unchanged_landuse.tif")

# 保存输出栅格
output_raster.save(output_path)

print("未发生变化的土地利用栅格数据图像已生成")

到了这里,关于Python地理数据处理 22:基于arcpy批量操作(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MATLAB数据处理实用案例详解(22)】——基于BP神经网络的PID参数整定

    基于BP神经网络的PID控制的系统结构如下图所示: 考虑仿真对象,输入为r(k)=1.0,输入层为4,隐藏层为5,输出层为3,仿真输出满足 a ( k ) = 1.2 ( 1 − 0.8 e x p ( − 0.1 k ) ) , y ( k ) = a ( k ) y − 1 1 + ( y − 1 ) 2 + u − 1 a(k)=1.2(1-0.8exp(-0.1k)),y(k)=a(k) frac{y-1}{1+(y-1)^2}+u-1 a ( k ) = 1.2 ( 1 −

    2024年02月07日
    浏览(60)
  • NCDC气象数据的提取与处理(四):python批量读取、写入nc数据经纬度格点数值

    1.问题描述: 2.思路: 3.实现过程: 3.1格点位置匹配 3.2写入表格 4.运行效果 4.1打包站点信息 4.2读取nc文件列表 4.3提取对应格点的nc数据 4.4数据写入 NCDC的站点数据处理在之前三节里已经介绍过了,但是NCDC的就那么几种数据可能不能满足日常使用,比如说辐射数据他就没有。

    2024年02月05日
    浏览(77)
  • ArcGIS Pro实操宝典:地理空间数据处理全流程解析

    GIS是利用电子计算机及其外部设备,采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲,它是在一定的地域内,将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来,达到对地理和属性信息的综合管理。GIS的研究对象是整个地理空间,而地

    2024年04月23日
    浏览(41)
  • 【数据集处理】基于Python处理EAR5数据

    ERA5是ECMWF(欧洲中期天气预报中心)对1950年1月至今全球气候的第五代大气再分析数据集。 包含了四个 基本变量(日平均温度、降水、比湿度和距离地表2米的气压) ,这些变量在每日时间尺度上覆盖全球,从而可以对不同地区和时间段进行全面和统一的分析 时间分辨率:194

    2024年02月05日
    浏览(54)
  • Java 多线程批量处理数据

    1 需求 在项目开发中需要处理100万多的数据,这些数据需要从mysql数据库中读取出来,再通过调用其他平台的接口推送数据。由于时间紧迫,数据需要在短时间内完成推送,采用单线程推送很慢,所以采用多线程推送来提高效率。 2 配置多线程 2.1 application.yml 2.2 创建ThreadPoo

    2024年02月22日
    浏览(45)
  • 基于python的心脏病个人指数数据集数据处理——结课论文

    前言: 此论文是小赵的python数据分析与应用的结课作业 , 未上传论文涉及的所有数据集,本论文所涉及的数据预处理,数据分析和可视化仅以这些数据集为准,所有处理方法,结果以及结论仅个人观点。 心脏病个人指数数据集数据处理 摘要:     本论文包含了对心脏病个

    2024年02月04日
    浏览(44)
  • 多线程处理大批量数据操作

     @Autowired private DataSourceTransactionManager dataSourceTransactionManager; @Autowired private TransactionDefinition transactionDefinition; @Autowired private StudentService studentService; /**  * 对用户而言,27s 任是一个较长的时间,我们尝试用多线程的方式来经行修改操作看能否加快处理速度  * 预计创建10个线程

    2024年02月09日
    浏览(46)
  • 使用 multiprocessing 多进程处理批量数据

    示例代码 multiprocessing.Pool 创建进程池, 传入的参数是要要使用的 CPU 内核数量, 直接用 cpu_count() 可以拿到当前硬件配置所有的 CPU 内核数. pool.map 可以直接将处理后的结果拼接成一个 list 对象 应用在实际数据处理代码的效果对比: 普通处理方式, 用时 221 秒 多进程处理方式, 用时

    2024年02月09日
    浏览(43)
  • 【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

    欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水

    2024年03月15日
    浏览(46)
  • Java使用线程池批量处理数据操作

    疑问思路: 1.如何保证数据按顺序批量处理 2.如何保证数据全部处理完统一返回 3.如何保证是多任务异步操作 4.如何提高运行效率,减少运行时间 1.使用ArrayList 插入数据有序且可重复 2.CountDownLatch / Future / CompletableFuture 3.多线程 4.线程池创建多线程 具体流程: 获取需要进行批

    2024年02月09日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包