Python常用遥感模块Rasterio与Rioxarray的安装与使用

news2024/11/25 11:24:40

1. Rasterio与Rioxarray安装

Rasterio 是一个很多模块是基于 GDAL 的 Python 包,可用于处理地理空间栅格数据,例如 GeoTIFF 文件。为此,可以使用许多模块和函数,例如,处理来自卫星的原始数据、读取栅格数据、检索地理元数据、转换坐标、裁剪图像、合并多个图像以及以其他格式保存数据。大量的功能和易于实施使 Rasterio 成为卫星数据分析的标准工具。

首先安装 Rasterio 模块,(本人使用 conda 安装时遇到过报错 ImportError: cannot import name 'CRS' from 'pyproj' (unknown location),是由于 pyproj 模块安装不全,因此建议采用后面的离线安装方式或者之后遇到问题时删除 pyproj 模块后再离线安装该模块):

conda install gdal
conda install rasterio

如果安装失败可以采用离线安装的方式,Rasterio 依赖很多第三方库,所以比较麻烦,按下面的顺序依次安装即可,可以尝试使用 pip 安装或者下载 .whl 文件离线安装(注意对上 Python 版本):

pyproj
Shapely
GDAL
Fiona
rasterio

在这里插入图片描述

在这里插入图片描述

各个模块的链接:Pyproj、Shapely、GDAL、Fiona、Rasterio。

离线安装指令:

pip install E:\GDAL-1.2.10-cp310-cp310-win_amd64.whl

在 Python 中使用 Anaconda 安装 rioxarray 包时,首先需要安装 GDALrasterio,然后再安装 rioxarray

pip install rioxarray

2. 使用教程

(1)使用 Rioxarray 读取并展示图像:

import rasterio
import rioxarray
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

img_path = '../images/tiff_img.tif'

img = rioxarray.open_rasterio(img_path)
print(img.shape)  # (22, 488, 480),第一维为通道数
print(type(img))  # <class 'xarray.core.dataarray.DataArray'>
print(type(img.values))  # <class 'numpy.ndarray'>

fig, axes = plt.subplots(1, 2, figsize=(10, 6))
for ax in axes.flat:
    ax_img = ax.imshow(img[0], cmap='viridis')
for ax, title in zip(axes.flat, ['img1', 'img2']):
    ax.set_title(title)
fig.colorbar(mappable=ax_img, label='FSC', orientation='horizontal', ax=axes, fraction=0.04)  # 图例,fraction可调整大小

plt.show()

在这里插入图片描述

也可以用另一种形式展示(注意如果使用 Rasterio 读取图像则无法使用该方式展示图像):

plt.figure(dpi=300, figsize=(15, 5))
plt.subplots_adjust(hspace=0.2, wspace=0.5)
plt.subplot(1, 2, 1)
img[0].plot(cmap='terrain')  # getting the first band
plt.subplot(1, 2, 2)
img[1].plot(cmap='terrain')
# plt.savefig('1.png', dpi=300, bbox_inches='tight', pad_inches=0)
plt.show()

在这里插入图片描述

(2)使用 Rasterio 读取图像:

img = rasterio.open(img_path).read()
print(img.shape)  # (22, 488, 480)
print(type(img))  # <class 'numpy.ndarray'>

(3)转换为 Tensor 类型:

import torch
import numpy as np

img_torch = torch.tensor(np.array(img.values), dtype=torch.float32)  # Rioxarray转Tensor
print(img_torch.shape)  # torch.Size([22, 488, 480])

img_torch = torch.tensor(img, dtype=torch.float32)  # Rasterio转Tensor
print(img_torch.shape)  # torch.Size([22, 488, 480])

(4)将 TIFF 图像逐像素提取出数据构建 CSV 文件:

import os
import tqdm
import pandas as pd
from sklearn.model_selection import train_test_split

def read_image(img_path):
    img = rasterio.open(img_path).read()
    band, height, width = np.shape(img)

    img_data_list = []
    for x in tqdm.trange(height):
        for y in range(width):
            temp = img[::, x, y]
            if np.array(np.isnan(temp), dtype=np.int8).sum() > 0:  # 过滤nan值
                continue
            else:
                img_data_list.append(temp.tolist())

    img_arr = np.array(img_data_list)
    img_arr = np.around(img_arr, 6)  # 将数据四舍五入保留6位小数
    labels = img_arr[:, 0]  # 第一个特征为标签
    dataset = img_arr[:, 1:]  # 之后的特征为训练数据
    print(os.path.basename(img_path), '读取成功!')

    # return dataset, labels
    return img_arr

total_dataset = np.zeros((1, 22), dtype=np.float32)
img_data = read_image(img_path)
total_dataset = np.append(total_dataset, img_data, axis=0)
total_dataset = np.delete(total_dataset, obj=0, axis=0)  # 按行(axis=0)删除第一行(obj=0)元素
print(total_dataset, '\n', np.shape(total_dataset))
# [[0.570768 0.14354  0.159068 ... 0.458602 1.       0.4     ]
#  [0.307365 0.14354  0.159068 ... 0.458602 1.       0.4     ]
#  [0.005285 0.14354  0.159068 ... 0.428406 1.       0.4     ]
#  ...
#  [0.993229 0.393478 0.370807 ... 0.243081 1.       0.8     ]
#  [0.967867 0.370807 0.356894 ... 0.243081 1.       0.8     ]
#  [0.945627 0.321429 0.305714 ... 0.243081 1.       0.8     ]]
#  (116082, 22)

# 一张影像22个波段,每一波段为一种特征,特征名如下,其中FSC既是模型训练时的标签数据也是模型输出数据
feature_name = ['FSC', 'SR1', 'SR2', 'SR3', 'SR4', 'SR5', 'SR6', 'SR7', 'NDVI', 'NDSI',
                'NDFSI', 'SensorZenith', 'SensorAzimuth', 'SolarZenith', 'SolarAzimuth',
                'Dem', 'Slope', 'Aspect', 'LST', 'A2T', 'SC', 'LCT']
df = pd.DataFrame(total_dataset, columns=feature_name)
df.to_csv('../data/MODIS_total_data.csv', index=False)
print(df)
#              FSC       SR1       SR2       SR3  ...       LST       A2T   SC  LCT
# 0       0.570768  0.143540  0.159068  0.165776  ...  0.447205  0.458602  1.0  0.4
# 1       0.307365  0.143540  0.159068  0.165776  ...  0.447205  0.458602  1.0  0.4
# ...          ...       ...       ...       ...  ...       ...       ...  ...  ...
# 116080  0.967867  0.370807  0.356894  0.384162  ...  0.252946  0.243081  1.0  0.8
# 116081  0.945627  0.321429  0.305714  0.327329  ...  0.252946  0.243081  1.0  0.8
# [116082 rows x 22 columns]

train_data, valid_data = train_test_split(df, test_size=0.3, random_state=1)  # 按7:3的比例划分train_data与valid_data
train_data.to_csv('../data/MODIS_train_data.csv', index=False)
valid_data.to_csv('../data/MODIS_valid_data.csv', index=False)
print(train_data)
print(valid_data)
#             FSC       SR1       SR2  ...       A2T        SC  LCT
# 65463  1.000000  0.868261  0.860124  ...  0.306415  0.954102  0.4
# 71636  0.000000  0.074969  0.090683  ...  0.492837  0.021780  0.4
# ...         ...       ...       ...  ...       ...       ...  ...
# 77708  0.836359  0.252298  0.268199  ...  0.400243  1.000000  0.4
# 98539  0.004958  0.048758  0.073168  ...  0.547051  0.000000  0.4
# [81257 rows x 22 columns]
#              FSC       SR1       SR2  ...       A2T        SC  LCT
# 24035   0.907556  0.579814  0.588075  ...  0.332088  1.000000  0.8
# 26625   0.988592  0.708696  0.702981  ...  0.334435  0.999297  0.4
# ...          ...       ...       ...  ...       ...       ...  ...
# 22745   0.000000  0.054348  0.127143  ...  0.494257  0.532436  0.4
# 31068   0.994422  0.562795  0.532174  ...  0.384267  1.000000  0.4
# [34825 rows x 22 columns]

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

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

相关文章

什么是API接口,API接口类型有哪些?

随着互联网技术的不断发展&#xff0c;全球网络数据呈现爆炸式增长&#xff0c;如何从这些数据中挖掘出有价值的信息变得愈发重要。API接口作为一种重要的数据获取方式&#xff0c;逐渐引起了人们的关注。 API&#xff08;Application Programming Interface&#xff09;是软件…

pip安装软件包报错: error subprocess-exited-with-error问题记录

问题修复 执行pip install dlib 在执行pip3 install virtualenvwrapper也会报同样的错误 问题修复 我们需要执行如下命令&#xff1a; pip install --upgrade setuptoolspip install --upgrade setuptools 命令用于升级 setuptools 库的版本。setuptools 是 Python 的一个开…

python+selenium做ui自动化测试用法必会

一、前言 大家都知道&#xff0c;基于Web端的测试的基础框架是需要Selenium做主要支撑的&#xff0c;这里边给大家介绍下Web测试核心之基于 Python 的 Selenium Selenium 是用于测试 Web 应用程序用户界面 (UI) 的常用框架。它是一款用于运行端到端功能测试的超强工具。您可以…

已签名驱动程序安装后提示“Windows无法验证此设备所需驱动程序数字签名”的原因和解决方法

在Windows 64位系统上&#xff0c;正常开启数字签名认证时&#xff0c;驱动程序软件需要经过微软数字签名的才允许被使用。否则在设备管理器下&#xff0c;安装完硬件驱动后设备上会有“黄色感叹号”标识&#xff0c;右键该设备属性提示&#xff1a;“Windows 无法验证此设备所…

项目管理的49个过程的数据流向

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 过程组主要数据流 启动过程组 规划过程组 执行过程组 监控过程组 收尾过程组 4、项目整合管理 4.1制定项目章程 4.2制定项目管理计划 4.3指导与管理项目工作 4.4…

【28】核心易中期刊推荐——医学影像识别及应用

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

容器与虚拟机有啥区别?常见的容器技术有哪些?

传统的虚拟机技术通过在物理硬件上运行虚拟化层&#xff08;Hypervisor&#xff09;&#xff0c;将物理资源&#xff08;如处理器、内存、存储等&#xff09;虚拟化为多个独立的虚拟机。每个虚拟机都有自己的操作系统和应用程序&#xff0c;它们在各自的虚拟环境中运行&#xf…

解决Edge总是闪退的方法

问题描述 最近在使用Edge的时候总是会闪退&#xff0c;太不方便了。所以去网上搜了一下解决办法。参考文章&#xff1a;http://www.65ly.com/a/20211110/163655036712573.html 解决办法 1. 使用管理员身份打开命令提示符 2. 修复系统 先后输入如下两条命令&#xff1a; DI…

旋转设备轴承故障,有哪些常见原因及监测手段?

在各种旋转设备中&#xff0c;轴承是关键的构件之一。轴承的正常运行对于设备的稳定性、寿命和效率至关重要。然而&#xff0c;轴承也是容易出现故障的部件之一。为了及时发现轴承故障并采取维修措施&#xff0c;监测轴承状态变得至关重要。本文将介绍旋转设备轴承常见的故障问…

psd文件丢失了怎么恢复?分享原因及对应恢复方法

PSD文件在设计行业中非常重要。但是&#xff0c;不幸的是&#xff0c;有时这些文件可能会因多种原因而丢失。那么在未备份PSD文件的情况下&#xff0c;PSD文件丢失了怎么恢复呢&#xff1f;如果您遇到了这种问题&#xff0c;不要惊慌&#xff0c;在本篇文章中&#xff0c;我们将…

调用华为API实现情感分析

作者介绍 王新华&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向&#xff1a;人工智能与模式识别 电子邮件&#xff1a;996514274qq.com 魏小双&#xff0c;女&#xff0c;西安工程大学电子信息学院&#xff0c;2022级研究生 研究方向…

Web安全:PHP反序列化漏洞的 测试(向服务器写入一句话.)

Web安全&#xff1a;PHP反序列化漏洞的 测试 程序员在写代码时&#xff0c;没有对用户输入的序列化字符串做一个严格检测&#xff0c;导致恶意的用户可以控制反序列化的一个过程&#xff0c;因此导致XSS漏洞&#xff0c;代码执行&#xff0c;SQT注入&#xff0c;目录遍历等不可…

Shader Graph19-位置函数

一、打开Unreal&#xff0c;新建Material命名为DemoPosition&#xff0c;双击打开 因为中心点为物体中心&#xff0c;所以将坐标值连接到Base Color上是上面的效果&#xff0c;然后在场景中添加一个球体&#xff0c;将材质应用在该球体上&#xff0c;按下w我们可以在场景中改变…

Alibaba官方「SpringCloudAlibaba全彩学习手册」限时开源!

最近我在知乎上看过的一个热门回答&#xff1a; 初级 Java 开发面临的最大瓶颈在于&#xff0c;脱离不出自身业务带来的局限。日常工作中大部分时间在增删改查、写写接口、改改 bug&#xff0c;久而久之就会发现&#xff0c;自己的技术水平跟刚工作时相比没什么进步。 所以我们…

Linux压缩和归档命令的速查表

在Linux系统中&#xff0c;有多种命令可用于压缩和归档文件和目录。这些命令使我们能够将文件和目录打包成单个文件&#xff0c;并可以选择压缩以节省存储空间。本文将提供一个Linux压缩和归档命令的速查表&#xff0c;帮助您快速查找和了解各种常用命令及其用法。 压缩文件和目…

creator-热更

title: creator-热更 categories: Cocos2dx tags: [creator, 热更] date: 2023-04-20 10:42:26 comments: false mathjax: true toc: true creator-热更 前篇 热更新管理器 AssetsManager - https://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update-manager.htm…

实验篇(7.2) 04. 映射服务器到公网IP 远程访问 ❀ Fortinet网络安全专家 NSE4

【简介】由于服务器的IP是内网地址&#xff0c;所以无法从公网直接访问服务器。要想远程访问服务器&#xff0c;最简单的办法就是将服务器映射到公网IP&#xff0c;然后通过公网IP加端口号的方式进行访问。 实验要求与环境 OldMei集团深圳总部部署了一台服务器&#xff0c;用来…

Vue学习-知识点总结

&#xff08;一&#xff09;基础知识 1、简单使用 <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title></title><!--第一步&#xff1a;导入vue--><script src"js/vue-2.6.10.js"></script…

深度学习相关知识--池化

池化 概念 池化分为最大池化&#xff08;用的多一些&#xff09;和平均池化 最大池化是选出区域内最大值作为池化后的值&#xff0c;如下图所示&#xff1a; 平均池化是选择区域内平均值作为池化后的值&#xff0c;如下图所示&#xff1a; 概念很浅显&#xff0c;但是对于刚…

【C++初阶】10. vector的使用及模拟实现

1. vector的介绍 vector的文档介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的…