【PythonRS】基于矢量点读取遥感影像波段值制作训练样本

news/2025/3/15 11:33:28/文章来源:https://www.cnblogs.com/RSran/p/18343763

        在进行遥感定量反演或数据分析时,往往我们都具有矢量的真值,可能是点文件也可能是面文件,最重要的还是通过这个矢量获取影像中该区域的值,这样方便做波段分析以及后续的反演等流程。今天给大家分享一下如何通过点文件获取影像的波段值。

原创作者:RS迷途小书童

博客地址:https://blog.csdn.net/m0_56729804?type=blog

注意:栅格影像和矢量点文件都应具有相同坐标系!!!

1 获取label值

        我这里分析时点矢量是具有多个字段的,这些字段都是标签值,或者可以说是测量的真值,如果你只有一种类型的真值可以自己修改一下。将所有的真值和坐标写入列表中并返回。

# -*- coding: utf-8 -*-
"""
@Time : 2024/3/5 14:48
@Auth : RS迷途小书童
@File :Get_Raster_datas_from_Points.py
@IDE :PyCharm
@Purpose:通过矢量点获取栅格数据的值(多波段)
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import os
import sys
import numpy as np
from datetime import datetime
from osgeo import gdal, osr, ogr# 从点矢量中获取标签数据
def Get_label_point(train_image, train_shp, class_id):""":param train_image: 输入训练的影像:param train_shp: 输入训练的点矢量:param class_id: 输入训练的点矢量对应类别的字段名:return: x,y,类别值"""ogr.RegisterAll()  # 注册所有的驱动ds_image = gdal.Open(train_image)ds_proj_image = osr.SpatialReference()ds_proj_image.ImportFromWkt(ds_image.GetProjectionRef())ds_shp = ogr.Open(train_shp)if ds_shp is None:print("打开文件【%s】失败!", train_shp)returnlayer = ds_shp.GetLayerByIndex(0)  # 通过索引获取shapefile的第一个图层if layer is None:print("获取第%d个图层失败!\n")returnds_proj_shp = layer.GetSpatialRef()transform = osr.CreateCoordinateTransformation(ds_proj_shp, ds_proj_image)# # 通过索引获取shapefile的第一个图层layer.ResetReading()# 重置图层的读取位置到开始位置feature = layer.GetNextFeature()values = list()while feature is not None:value = feature.GetField(class_id)  # 通过字段名获取该要素的类ID属性值value1 = feature.GetField("1")value2 = feature.GetField("2")value3 = feature.GetField("3")value4 = feature.GetField("4")value5 = feature.GetField("5")geometry = feature.GetGeometryRef()x = geometry.GetX(0)y = geometry.GetY(0)point_transform = transform.TransformPoint(x, y, 0)values.append([point_transform[0], point_transform[1], value, value1, value2, value3, value4, value5, x, y])# 将坐标、字段加入到标签数组中feature = layer.GetNextFeature()  # 继续下一个要素的读取ds = Nonereturn values

2 获取栅格值

        通过上一步存储的坐标可以定位到栅格影像中的实际位置,通过波段的循环将所有波段值写入列表/数组或者表格中,我这里是写入表格中。

# -*- coding: utf-8 -*-
"""
@Time : 2024/3/5 14:48
@Auth : RS迷途小书童
@File :Get_Raster_datas_from_Points.py
@IDE :PyCharm
@Purpose:通过矢量点获取栅格数据的值(多波段)
@Web:博客地址:https://blog.csdn.net/m0_56729804
"""
import os
import sys
import numpy as np
from datetime import datetime
from osgeo import gdal, osr, ogr# 通过点矢量获取栅格各波段的值
def Get_train_data_point(train_image, train_shp, class_id, work_path):""":param train_image: 输入训练的影像:param train_shp: 输入训练的点矢量:param class_id: 输入训练的点矢量对应类别的字段名:param work_path: 工作空间:return: 训练的特征值,训练的样本类别"""print("【数据准备阶段】")print("[%s]获取样本点数据......" % datetime.now().strftime('%Y-%m-%d %H:%M:%S'))import openpyxlwb = openpyxl.load_workbook(r'G:\RS迷途小书童/2.xlsx')  # read_only=True 只读打开可以提高效率ws_sheets = wb.sheetnames  # 获取所有的sheet名称ws = wb[ws_sheets[0]]  # 激活指定的工作空间os.chdir(work_path)ds_image = gdal.Open(train_image)ds_geo = ds_image.GetGeoTransform()left_x, left_y, resolution_x, resolution_y = ds_geo[0], ds_geo[3], ds_geo[1], ds_geo[5]point_values = Get_label_point(train_image, train_shp, class_id)  # 读取点文件中的位置以及类别属性ds_bands = ds_image.RasterCount  # 获取影像的波段数train_x, train_y = list(), list()z = 2for point_value in point_values:# 遍历所有的样本点row, col = int((point_value[0] - left_x) / resolution_x), int((point_value[1] - left_y) / resolution_y)# 通过仿射变换参数,获取矢量点对应的栅格行列数try:arr_point = ds_image.ReadAsArray(row, col, 1, 1)point_data = list()for i in range(ds_bands):  # 遍历该点所有的波段point_data.append(int(arr_point[i]))  # 添加每个波段的值train_x.append(point_data)ws.cell(z, 1).value = point_data[0]ws.cell(z, 2).value = point_data[1]ws.cell(z, 3).value = point_data[2]"""ws.cell(z, 4).value = point_data[3]ws.cell(z, 5).value = point_data[4]ws.cell(z, 6).value = point_data[5]ws.cell(z, 7).value = point_data[6]ws.cell(z, 8).value = point_data[7]ws.cell(z, 9).value = point_data[8]ws.cell(z, 10).value = point_data[9]ws.cell(z, 11).value = point_data[10]ws.cell(z, 12).value = point_data[11]ws.cell(z, 13).value = point_value[2]ws.cell(z, 14).value = point_value[3]ws.cell(z, 15).value = point_value[4]ws.cell(z, 16).value = point_value[5]ws.cell(z, 17).value = point_value[6]ws.cell(z, 18).value = point_value[7]ws.cell(z, 19).value = point_value[8]ws.cell(z, 20).value = point_value[9]"""# 将每个点的特征添加至数组,本质为二维数组train_y.append(float(point_value[2]))# print((point_value))# 将每个点对应的类别加入数组except Exception as e:print(e)z += 1train_y_num = len(train_y)if train_y_num != 0:print("[%s]共获取%s个样本点数据......" % (datetime.now().strftime('%Y-%m-%d %H:%M:%S'), train_y_num))else:print("[%s]未获取到训练样本,请检查样本数据!" % datetime.now().strftime('%Y-%m-%d %H:%M:%S'))sys.exit(0)# print(train_x)# print(train_y)np.save("train.npy", train_x)np.save("label.npy", train_y)print("--------------------------------------------------------------------------------------")wb.save(r"G:\RS迷途小书童/2.xlsx")return train_x, train_y

        后续在分享使用Python机器学习分类时,再和大家分享如何使用栅格、矢量面读取栅格值并制作成训练集和样本集。本质其实就是通过仿射变换矩阵和循环波段读取到该点的值,如果大家有什么问题也可以留言交流。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

17.python字符类型

python之字符类型字符串 (一)字符类型的符号: <class str> (二)查看字符类型语句:type()(三)常见的字符串类型语句: capitalize()、title()、count()、join、split、strip、strip、rstrip、startswith、startswith、endswith、find、rfind、replace、upper、…

SqlDbx客户端连接服务器Oracle数据库

查了很多文章,介绍的不对,走了好多弯路,最后整理一下,供参考 一、下载Oracle客户端1、SqlDbx如果是32位的,客户端也要下载32位的 2、Oracle客户端版本要和服务端版本一致(本例用的是12.1.0.2.0) 3、32位客户端下载地址:https://www.oracle.com/database/technologies/i…

Python异常处理机制

编程错误 编写程序时遇到的错误可大致分为 2 类,分别为语法错误和运行时错误。 语法错误 语法错误,也就是解析代码时出现的错误。当代码不符合Python语法规则时,Python解释器在解析时就会报出SyntaxError语法错误,与此同时还会明确指出最早探测到错误的语句。例如: print …

洛谷P1223 排队接水

P1223 排队接水 题目描述 有 \(n\) 个人在一个水龙头前排队接水,假如每个人接水的时间为 \(T_i\),请编程找出这 \(n\) 个人排队的一种顺序,使得 \(n\) 个人的平均等待时间最小。 输入格式 第一行为一个整数 \(n\)。 第二行 \(n\) 个整数,第 \(i\) 个整数 \(T_i\) 表示第 \(…

Nessus Professional 10.8.0 Auto Installer for Ubuntu 24.04

Nessus Professional 10.8.0 Auto Installer for Ubuntu 24.04Nessus Professional 10.8.0 Auto Installer for Ubuntu 24.04 发布 Nessus 试用版自动化安装程序,支持 macOS Sonoma、RHEL 9 和 Ubuntu 24.04 请访问原文链接:https://sysin.org/blog/nessus-auto-install-for-…

Fortinet FortiGate Firmware (FortiOS 7.6.0) 全系列下载 - 下一代防火墙 (NGFW)

Fortinet FortiGate Firmware (FortiOS 7.6.0) 全系列下载 - 下一代防火墙 (NGFW)Fortinet FortiGate Firmware (FortiOS 7.6.0) 全系列下载 - 下一代防火墙 (NGFW) 防特网 飞塔 防火墙 系统软件 请访问原文链接:https://sysin.org/blog/fortinet-fortigate/,查看最新版。原创…

哲讯智能:苏州SAP代理,引领企业智能化转型

苏州,这座融合古典与现代的城市,以其独特的魅力和创新精神,成为企业发展的热土。在数字化转型的大潮中,哲讯智能科技有限公司作为苏州地区值得信赖的SAP代理,致力于为企业提供全面的SAP解决方案,助力企业实现智能化管理和业务流程的优化。SAP系统的重要性SAP系统作为全球…

【闲话】08.05.24

又笑又哭的是什么毛病0805 闲话 头图:今日推歌: 《1212。》 エイハブ/A4。おおお のべつ幕無しのこの世 噢噢噢 如此无止境的人世间 本能の赴くままに 在本能的驱使下随之逐流 生きる意義は推して知るべし 最后在其中知晓活着的意义 そりゃ幸じゃんか 这是多么幸运啊好久没听…

《数据结构习题解析与实验指导_李冬梅,张琪编著》总结出的大纲

下面大纲为《数据结构习题解析与实验指导_李冬梅,张琪编著》总结出的大纲,可装13学习下: OnionYang@

【PythonGIS】Arcpy中常用出图函数详解

出图是每个GISer都要经历的事,但有时候会有许多重复且多且无聊的出图任务,这个时候我们肯定想能不能自动化出图。ArcGIS中的模型创建就可以实现,但是我的数据大部分是在Python中处理的,所以就想能不能使用Python进行批量出图,正好今天跟大家分享一下。这里使用的mxd作为模…

SpringBoot-事件监听机制

SpringBoot-事件监听机制本文参考的SpringBoot版本是2.6.13一、Spring Boot 启动事件顺序事件执行顺序:  1. ApplicationStartingEvent         spring boot最开始启动时触发,SpringApplication.run() 之前发送。2. ApplicationEnvironmentPreparedEvent   …

免费为您的网页创建在线客服,扣子(COZE) WEB SDK图文使用教程

🧙‍♂️ 大家好,我是斜杠君,手把手教你搭建扣子AI应用。 📜 我的教程《AI应用开发系列教程之扣子(Coze)实战教程》上线了,完全免费学习。最近,扣子(COZE) 的 Web SDK 正式上线了。有同学问"Web SDK"如何使用?今天,斜杠君就带大家学习COZE 「Web SDK」的使…