首页 > 编程语言 >【Python&RS】基于矢量点读取遥感影像波段值&制作训练样本

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

时间:2024-08-05 17:55:01浏览次数:18  
标签:point Python RS value cell train ws 训练样本 ds

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

原创作者: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)
        return
    layer = ds_shp.GetLayerByIndex(0)  # 通过索引获取shapefile的第一个图层
    if layer is None:
        print("获取第%d个图层失败!\n")
        return
    ds_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 = None
    return 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 openpyxl
    wb = 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 = 2
    for 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 += 1
    train_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机器学习分类时,再和大家分享如何使用栅格、矢量面读取栅格值并制作成训练集和样本集。本质其实就是通过仿射变换矩阵和循环波段读取到该点的值,如果大家有什么问题也可以留言交流。

标签:point,Python,RS,value,cell,train,ws,训练样本,ds
From: https://www.cnblogs.com/RSran/p/18343763

相关文章

  • 计算机毕业设计必看必学!! 85583 springboot高校网上选课系统,原创定制程序, java、PHP
                                                  摘要本论文主要论述了如何使用JAVA语言开发一个高校网上选课系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,......
  • Python异常处理机制
    编程错误编写程序时遇到的错误可大致分为2类,分别为语法错误和运行时错误。语法错误语法错误,也就是解析代码时出现的错误。当代码不符合Python语法规则时,Python解释器在解析时就会报出SyntaxError语法错误,与此同时还会明确指出最早探测到错误的语句。例如:print"Hello,World!......
  • Python函数
    函数定义函数需要用def关键字实现,具体的语法格式如下:def函数名(形参列表)://由零条到多条可执行语句组成的代码块[return[返回值]]其中,用[]括起来的为可选择部分,即可以使用,也可以省略。此格式中,各部分参数的含义如下:函数名:从语法角度来看,函数名只要是一个合法......
  • 16.python索引和切片
    (一)索引定义:索引也叫下标或角标作用:可以直接使用索引来访问序列中的元素,索引分为两种:正向索引和负向索引正向索引:从索引0开始负向索引:从-1开始(二)切片1、定义:切片象截是指对操作的截取其中一部分的操作,字符串,列表,元组都支持切片操作2、切片的语法:【开始索引:结束索引:步长】......
  • Python面向对象课程设计
    面向对象程序设计面向对象编程(Object-orientedProgramming,简称OOP),是一种封装代码的方法。面向对象中,常用术语包括:类:可以理解是一个模板,通过它可以创建出无数个具体实例。比如,前面编写的tortoise表示的只是乌龟这个物种,通过它可以创建出无数个实例来代表各种不同特征的乌龟(......
  • 【数值计算方法】2&3维高斯积分的python实现
    目录二维高斯积分三维高斯积分验证本文只给出pythont实现和例题,数学推导见【数值计算方法】数值积分&微分-python实现-FE-有限元鹰-博客园二维高斯积分python实现二维高斯积分:defInteg2dGuassLegendre(f,lowLimit:List[float]=[-1,-1],......
  • Python选择与循环
    条件语句Python中,选择(条件)语句可细分为3种形式,分别是if语句、ifelse语句和ifelifelse语句。标准格式:if表达式1:代码块1elif表达式2:代码块2elif表达式3:代码块3...//可以有零条或多条elif语句else:代码块n表达式可以是一个单纯的布尔值......
  • 【Python&GIS】Arcpy中常用出图函数详解
        出图是每个GISer都要经历的事,但有时候会有许多重复且多且无聊的出图任务,这个时候我们肯定想能不能自动化出图。ArcGIS中的模型创建就可以实现,但是我的数据大部分是在Python中处理的,所以就想能不能使用Python进行批量出图,正好今天跟大家分享一下。这里使用的mxd作为......
  • 使用Python 和 Selenium 抓取 酷狗 音乐专辑 附源码
    在这篇博客中,我将分享如何使用Python和Selenium抓取酷狗音乐网站上的歌曲信息。我们将使用BeautifulSoup解析HTML内容,并提取歌曲和专辑信息。依赖库requestsbeautifulsoup4selenium准备工作首先,我们需要安装一些必要的库:pipinstallrequestsbeautifulsoup4selenium......
  • 使用 Python和PyQt5 打造 你的专属文件查询工具! 附源码
    本文将介绍如何使用Python和PyQt5创建一个简单的文件查询工具。该工具允许用户选择一个目录,并在该目录中搜索特定的文件。依赖库首先,确保你已经安装了PyQt5库:pipinstallPyQt5步骤第一步:导入库我们需要导入必要的库,包括sys、os和PyQt5。importsysimportosfromP......