码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Python基于Excel数据加以反距离加权空间插值并掩膜图层


    合集 - GIS空间分析(52)
    1.地统计学的基本概念及公式详解2023-04-242.单窗算法的地表温度反演:谷歌地球引擎GEE代码2023-04-263.SPSS计算极值、平均值、中位数、方差、偏度、峰度、变异系数2023-05-084.Python忽略NoData计算多张遥感影像的像元平均值:whitebox库2023-05-155.ArcGIS如何自动获得随机采样点?2023-05-176.ENVI手动地理配准栅格图像的方法2023-05-247.ArcMap手动新建矢量要素的方式2023-05-268.ENVI指定像元数量(行数与列数)裁剪栅格图像2023-05-309.Python批量填补遥感影像的无效值NoData2023-06-0110.ArcPy批量对大量遥感影像相减做差2023-06-2511.ArcMap镶嵌数据集的创建、数据导入与数据范围修改方法2023-07-0412.ENVI实现QUAC、简化黑暗像元、FLAASH方法的遥感影像大气校正2023-07-1013.ENVI大气校正方法反演Landsat 7地表温度2023-07-1714.ENVI、ERDAS计算Landsat 7地表温度:单窗算法实现2023-07-3015.全球都有哪些高光谱遥感卫星?2023-08-1916.ArcMap时间滑块绘制遥感影像的动态变化过程2023-08-2017.ENVI+ERDAS实现Hyperion叶绿素含量反演:经验比值法、一阶微分法2023-08-2618.ArcMap用一个面要素擦除另一个面要素的部分2023-08-2719.全局多项式(趋势面)与IDW逆距离加权插值:MATLAB代码2023-09-0220.ArcMap中矢量数据修改标注Label的方法2023-09-0321.回归克里格、普通克里格插值在ArcGIS中的实现2023-09-1022.GIS中的ROI文件可否由.xml格式转为.roi格式?2023-09-1623.地理探测器Geodetector下载、使用、结果分析方法2023-09-1724.ArcGIS将遥感影像的0值设置为NoData2023-09-2225.基于AvaSpe 2048测定物体的光谱曲线2023-09-2426.ArcGIS地图投影与坐标系转换的方法2023-09-2827.下载、安装CAN-EYE植被参数工具2023-10-0728.如何用CAN-EYE获取植被参数数据?2023-10-2229.ArcMap属性表出现乱码情况的解决2023-10-2730.物体三维模型的构建:3DSOM软件实现侧影轮廓方法2023-11-1231.空间三维模型的编码结构光方法实现:基于EinScan-S软件2023-11-2532.MATLAB时间序列数据重建与平滑:HANTS滤波2023-12-0133.无人机影像的空间三维建模:Pix4Dmapper运动结构恢复法2023-12-0934.Pix4Dmapper空间三维模型的应用实例:GIS选址分析2023-12-2335.用ArcGIS模型构建器生成、导出Python转换空间坐标系的代码01-1836.安装MicroStation软件、Terrasolid插件的方法01-2237.在Visual Studio中部署GDAL库的C++版本(包括SQLite、PROJ等依赖)02-0138.C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组02-0339.创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现02-0440.C++ GDAL用CreateCopy()新建栅格并修改波段的个数02-2641.基于Python GDAL为长时间序列遥感图像绘制时相变化曲线图02-2842.Python实现snap:对齐多张遥感影像的空间范围03-0443.Landsat 7的热红外波段有2个该如何选择?03-1044.遥感图像镶嵌拼接:ENVI的Pixel Based Mosaicking工具操作方法03-1145.ENVI为遥感影像设置空间坐标系的方法03-1346.基于R语言的raster包读取遥感影像03-1547.地理探测器R语言实现:geodetector03-1848.Python基于Excel生成矢量图层及属性表信息:ArcPy03-2049.ArcMap的mxd文件没有数据、显示感叹号怎么办?03-2250.基于R语言的GD库实现地理探测器并自动将连续变量转为类别变量03-2551.Linux电脑如何下载QGIS?03-29
    52.Python基于Excel数据加以反距离加权空间插值并掩膜图层04-10
    收起

      本文介绍基于Python中ArcPy模块,实现Excel数据读取并生成矢量图层,同时进行IDW插值与批量掩膜的方法。

    1 任务需求

      首先,我们来明确一下本文所需实现的需求。

      现有一个记录有北京市部分PM2.5浓度监测站点在2019年05月18日00时至23时(其中不含19时)等23个逐小时PM2.5浓度数据的Excel表格文件,我们需要将其中的数据依次读入一个包含北京市各PM2.5浓度监测站点的矢量点要素图层中;随后,基于这些站点导入的23个逐小时PM2.5浓度数据,逐小时对北京市PM2.5浓度加以反距离加权(IDW)方法的插值,即共绘制23幅插值图;最后,基于已有的北京市边界矢量数据,分别对这23幅插值图加以掩膜。

      在这里,包含北京市各PM2.5浓度监测站点的矢量点要素图层是基于Python基于Excel生成矢量图层及属性表信息:ArcPy得到的,如下图所示。

    image

      其中,该矢量图层还包括属性表,属性表内容包括每一个站点的编号、地理位置与中文名称,如下图所示。

      而记录有北京市部分PM2.5浓度监测站点在2019年05月18日00时至23时(其中不含19时)等23个逐小时PM2.5浓度数据的Excel表格文件则如下所示,其中包括各站点在23个整点时所监测到的PM2.5浓度。

    2 代码实现

      了解了需求后,我们就基于Python中的ArcPy模块,进行详细代码的撰写与介绍。

      这里需要说明的是:在编写代码的时候,为了方便执行,所以希望代码后期可以在ArcMap中直接通过工具箱运行,即用到Python程序脚本新建工具箱与自定义工具的方法;因此,代码中对于一些需要初始定义的变量,都用到了arcpy.GetParameterAsText()函数。大家如果只是希望在IDLE中运行代码,那么直接对这些变量进行具体赋值即可。关于Python程序脚本新建工具箱与自定义工具,大家可以查看ArcMap将Python写的代码转为工具箱与自定义工具详细了解。

      上面提到需要初始定义的变量一共有十个,其中arcpy.env.workspace参数表示当前工作空间,csv_path参数表示存储有北京市2019年05月18日00时至23时(其中不含19时)逐小时PM2.5浓度数据的.csv文件,shape_file_path参数表示站点信息矢量数据文件,boundary_file_path参数表示投影后北京市边界矢量数据文件,spatial_resolution参数表示IDW插值结果栅格图的像元大小,power参数表示IDW插值时所用距离的幂指数,look_point参数表示IDW插值时所用最邻近输入采样点数量的整数值,max_distance参数表示IDW插值时对最邻近输入采样点的限制距离,单位依据地图坐标系确定;idw_result_dir参数表示IDW插值结果图层保存路径,mask_result_dir参数表示IDW插值结果图层经掩膜后保存路径。

      代码的整体思路为:首先利用pd.read_csv函数读取记录有北京市部分PM2.5浓度监测站点在2019年05月18日00时至23时(其中不含19时)等23个逐小时PM2.5浓度数据的Excel表格文件数据,随后在北京市各PM2.5浓度监测站点的矢量点要素图层的属性表中新建23个列,每一个列表示该监测站点在某一时刻的浓度数据(共有23个时刻,因此共有23个列);其次,由于矢量要素图层中的部分站点在Excel文件中并没有数据,因此需要将这些站点从矢量要素图层中删除;最后,分别利用Idw函数与ExtractByMask函数进行IDW插值与掩膜。

      具体代码如下。

    # -*- coding: utf-8 -*-
    # @author: ChuTianjia
    
    import copy
    import arcpy
    import pandas as pd
    from arcpy.sa import *
    
    arcpy.env.workspace=arcpy.GetParameterAsText(0)
    csv_path=arcpy.GetParameterAsText(1)
    shape_file_path=arcpy.GetParameterAsText(2)
    idw_result_dir=arcpy.GetParameterAsText(8)
    boundary_file_path=arcpy.GetParameterAsText(3)
    mask_result_dir=arcpy.GetParameterAsText(9)
    spatial_resolution=arcpy.GetParameterAsText(4)
    power=arcpy.GetParameterAsText(5)
    look_point=arcpy.GetParameterAsText(6)
    max_distance=arcpy.GetParameterAsText(7)
    
    csv_data=pd.read_csv(csv_path,header=0,encoding="gbk")
    column_name_list=list(csv_data)
    hour_column=csv_data["hour"]
    
    pm_25_list=[[0]*len(csv_data) for i in range(csv_data.shape[1]-3)]
    
    for i in range(3,csv_data.shape[1]):
        for index,data in csv_data.iterrows():
            pm_25_list[i-3][index]=data[i]
    
    field_list=["hour_00","hour_01","hour_02","hour_03","hour_04","hour_05",\
                "hour_06","hour_07","hour_08","hour_09","hour_10",\
                "hour_11","hour_12","hour_13","hour_14","hour_15",\
                "hour_16","hour_17","hour_18","hour_20",\
                "hour_21","hour_22","hour_23"]
    field_list_use=copy.deepcopy(field_list)
    field_list_use.insert(0,"Name")
    
    # Update the columns in the attribute table
    for i in range(len(field_list)):
        arcpy.AddField_management(shape_file_path,field_list[i],"SHORT")
    
    delete_num=0
    delete_name=[]
    with arcpy.da.UpdateCursor(shape_file_path,field_list_use) as cursor:
        for row in cursor:
            for column_name in column_name_list:
                if column_name==row[0]:
                    for i in range(len(csv_data[column_name])):
                        row[i+1]=csv_data[column_name][i]
                        cursor.updateRow(row)
    
            # Find stations that without any data        
            if row[0] not in column_name_list:
                cursor.deleteRow()
                delete_num+=1
                delete_name.append(row[0])
    
    arcpy.AddWarning("Delete {0} site(s) that do not contain any data, and the site(s) name is(are):".format(delete_num))
    for i in delete_name:
        arcpy.AddMessage(i)
    arcpy.AddMessage("\n")
    
    # Perform IDW interpolation
    arcpy.env.extent=boundary_file_path
    for i in range(len(field_list)):
        idw_result=Idw(shape_file_path,field_list[i],spatial_resolution,power,RadiusVariable(look_point,max_distance))
        idw_result_path=idw_result_dir+"\\"+"BJ_"+field_list[i]+".tif"
        idw_result.save(idw_result_path)
        arcpy.AddMessage("{0} has completed IDW interpolation.".format(field_list[i]))
    
    # Perform mask
    tif_file_list=arcpy.ListRasters("BJ_hour_*","TIF")
    for raster in tif_file_list:
        mask_result=ExtractByMask(raster,boundary_file_path)
        mask_result_path=mask_result_dir+"\\"+raster.strip(".tif")+"_Mask.tif"
        mask_result.save(mask_result_path)
        arcpy.AddMessage("{0} has been masked.".format(raster.strip(".tif")))
    

    3 运行结果

      执行上述代码,如果是在ArcMap中直接通过工具箱运行,则可以看到代码运行过程中出现的提示。

      例如,下图所示提示可以知道有哪几个站点是没有数据、从而被剔除的。

      下图则可以显示出目前代码的运行情况。

      同时,在我们设定的结果文件夹中可以看到,23小时的插值图与掩膜图都将自动生成并保存在指定文件夹。

      再来看看具体的图片长什么样子。

      首先查看IDW插值结果图;我们以当日10时的插值结果图为例进行查看。可以看到其已对北京市边界矢量数据所包含的矩形范围完成了插值。

      接下来,查看IDW插值结果图经过掩膜后的图像;我们同样以当日10时的插值、掩膜结果图为例进行查看。可以看到,经过掩膜操作后的图像已经完全符合北京市边界矢量数据的范围。

      至此,大功告成。

  • 相关阅读:
    代码审计——任意文件下载详解(二)
    C++ 设计模式 —— 桥接模式
    IDEA2024最新版的激活与安装-保姆级教学
    Chrome代码分析(一)——Node对象结构
    Pytorch——查找、替换module相关操作
    Linux ubuntu磁盘扩容
    Navicat 连接 SQL Server 报错(IM002 未发现数据源名称并且未指定默认驱动程序)
    哈希表及其封装
    2021年9月电子学会图形化二级编程题解析含答案:帮小企鹅躲避暴风雪
    【示波器专题】示波器探头不同的衰减比对测量的影响
  • 原文地址:https://www.cnblogs.com/fkxxgis/p/18125409
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号