首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用 EarthPy 堆叠和裁剪tif栅格数据

使用 EarthPy 堆叠和裁剪tif栅格数据

作者头像
用户11172986
发布于 2024-06-20 11:17:34
发布于 2024-06-20 11:17:34
24600
代码可运行
举报
文章被收录于专栏:气python风雨气python风雨
运行总次数:0
代码可运行

使用 EarthPy 堆叠和裁剪tif栅格数据

温馨提示

本文镜像 :气象分析3.9

由于可视化代码过长隐藏,可点击以下链接运行Fork查看

使用 EarthPy 堆叠和裁剪tif栅格数据🔜🔜若没有成功加载可视化图,点击运行可以查看 ps:隐藏代码在【代码已被隐藏】所在行,点击所在行,可以看到该行的最右角,会出现个三角形,点击查看即可

使用 EarthPy 堆叠和裁剪tif栅格数据

注意

下面的示例将向您展示如何使用 ''es.stack()'' 和 EarthPy 中的 ''es.crop_image()'' 函数。

堆叠多波段影像

一些遥感数据集与每个波段一起存储在单独的文件中。然而 通常,您希望在分析中同时使用所有波段。例如 您需要将所有条带放在同一个文件或“堆栈”中才能绘制颜色 RGB图像。EarthPy 有一个 ''stack()'' 函数,可让您 获取一组“.tif”文件,这些文件都位于相同的空间范围、CRS 和分辨率中 并将它们一起导出为一个堆叠的“.tif”文件,或者在 Python 中使用它们 直接作为堆叠的 numpy 数组。

要开始使用 EarthPy ''stack()'' 函数,请导入所需的包 并创建一个要绘制的数组。下面使用颜色条将数据绘制为连续数据 使用 ''plot_bands()'' 函数

当然,小编手头没有卫星波段数据,只好拿之前的暴雨tif数据顶顶。

安装与导入库

我们将结合多个库堆叠与裁剪tif数据

In [ ]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!pip install earthpy -i https://pypi.mirrors.ustc.edu.cn/simple/
代码语言:javascript
代码运行次数:0
运行
复制

In [1]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
from glob import glob
import matplotlib.pyplot as plt
import rasterio as rio
from rasterio.plot import plotting_extent
import geopandas as gpd
import earthpy as et
import earthpy.spatial as es
import earthpy.plot as ep
代码语言:javascript
代码运行次数:0
运行
复制

注意

注意

如果您在 Windows 系统上运行此脚本,则有一个 此脚本中使用的“.to_crs()”的已知错误。如果出现错误 发生,您必须使用命令重置操作系统环境 ''os.environ[“PROJ_LIB”] = r“path-to-share-folder-in-environment”''.

合并多个文件

stack函数具有可选的输出参数,您可以在其中编写栅格 添加到文件夹中的 TIFF 文件。如果要使用此功能,请确保有 是要将 TIFF 文件写入的文件夹。 Stack 函数还返回两个对象,一个数组和一个 RasterIO 配置文件。做 肯定会在变量中同时捕获。

In [14]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Stack Landsat bands
import glob
paths = glob.glob('/home/mw/input/precip7227/RainStormChina/RainStormChina/*/StormPeak*.tif')

out_path = './stacked_rasters.tif'  # 假设我们要输出的文件名为stacked_rasters.tif
array, raster_prof = es.stack(paths, out_path=out_path)
代码语言:javascript
代码运行次数:0
运行
复制

文件列表

In [15]:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
paths
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['/home/mw/input/precip7227/RainStormChina/RainStormChina/2014/StormPeak2014.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2005/StormPeak2005.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2017/StormPeak2017.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2007/StormPeak2007.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2015/StormPeak2015.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2006/StormPeak2006.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2013/StormPeak2013.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2002/StormPeak2002.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2012/StormPeak2012.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2003/StormPeak2003.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2011/StormPeak2011.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2004/StormPeak2004.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2001/StormPeak2001.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2018/StormPeak2018.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2019/StormPeak2019.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2010/StormPeak2010.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2008/StormPeak2008.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2009/StormPeak2009.tif',
 '/home/mw/input/precip7227/RainStormChina/RainStormChina/2016/StormPeak2016.tif']

创建范围对象

要获取栅格范围,plotting_extent请使用 来自 ''es.stack()'' 和 Rasterio 配置文件或元数据对象的数组。函数 需要一个 Numpy 数组的层,这就是我们使用 ''arr[0]'' 的原因。该功能还 需要 Rasterio 对象的空间变换,可以通过访问 Rasterio 配置文件中的 ''“transform”'' 键。

In [16]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extent = plotting_extent(array[0], raster_prof["transform"])
代码语言:javascript
代码运行次数:0
运行
复制

绘制未裁剪的数据

您可以使用 ''ep.plot_rgb()'' 查看裁剪前的边界和栅格 请注意,数据似乎被洗掉了。

In [17]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fig, ax = plt.subplots(figsize=(12, 12))
ep.plot_rgb(
    array,
    ax=ax,
    stretch=True,
    extent=extent,
    str_clip=0.5,
    title="RGB Image of Un-cropped Raster",
)
plt.show()
代码语言:javascript
代码运行次数:0
运行
复制

探索数据中的值范围

您可以使用 EarthPy ''hist()'' 探索数据中找到的值范围 功能。您是否注意到任何可能影响拉伸的极端值 的图像?

In [18]:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ep.hist(array)
plt.show()

如何掩码

''es.stack()'' 可以处理栅格中的 ''nodata'' 值。要使用此内容,请执行此操作 参数,指定 ''nodata=''。这将遮罩包含的每个像素 指定的“nodata”值。输出将是一个 numpy 掩码数组。

In [19]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import glob
paths = glob.glob('/home/mw/input/precip7227/RainStormChina/RainStormChina/*/StormCount*.tif')

array_nodata, raster_prof_nodata = es.stack(paths, nodata=0)

# View hist of data with nodata values removed
ep.hist(
    array_nodata)
plt.show()

# Recreate extent object for the No Data array

extent_nodata = plotting_extent(
    array_nodata[0], raster_prof_nodata["transform"]
)
代码语言:javascript
代码运行次数:0
运行
复制

绘制未裁剪的数据(掩码后)

删除 nodata 值后,再次绘制数据。

In [20]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fig, ax = plt.subplots(figsize=(12, 12))
ep.plot_rgb(
    array_nodata,
    ax=ax,
    stretch=True,
    extent=extent,
    str_clip=0.5,
    title="RGB image of Un-cropped Raster, No Data Value Selected",
)
plt.show()
代码语言:javascript
代码运行次数:0
运行
复制

裁剪数据

有时,您拥有的数据大于研究区域。 在处理之前,先将数据裁剪到研究区域会更有效 它在 Python 中。最快、最有效的选择是裁剪每个文件 单独地将裁剪后的栅格写入新文件,然后堆叠 将新文件放在一起。为此,请确保您具有 ShapeFile 边界 以 GeoPandas 对象的形式,您可以用作裁剪对象。 然后,循环浏览您要裁剪的每个文件并裁剪图像,然后 将其写出到文件中。获取创建的栅格并将它们堆叠起来,就像 您在前面的示例中堆叠了条带。

临时制作一个天津市shp

In [28]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import geopandas as gpd
import matplotlib.pyplot as plt
# 读取全国地图数据
china_map = gpd.read_file('/home/mw/input/china1656/china_map/china_map/China_Province_2022.shp')
tj = china_map[china_map['省'] == '天津市']
tj = tj.rename(columns={'省': 'Province','省级码':'code','省类型':'type'})
tj.to_file('./tj.shp')
代码语言:javascript
代码运行次数:0
运行
复制

In [29]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
crop_bound = gpd.read_file(
    "/home/mw/project/tj.shp"
)
crop_bound
代码语言:javascript
代码运行次数:0
运行
复制

Province

code

type

ENG_NAME

VAR_NAME

FIRST_GID

FIRST_TYPE

year

geometry

0

???

120000

???

Tianjin

Ti?n J?n

120000

Municipality

2022

POLYGON ((117.56937 40.19153, 117.56744 40.189...

重新投影数据

注意

如果你使用的是 Windows,请确保在此处设置你的环境!

如果数据位于不同的坐标中,裁剪功能将无法正常工作 参考系统(CRS)。要解决此问题,请务必重新投影裁剪图层以匹配 栅格数据的 CRS。 要重投影数据,请先从栅格剖面中获取栅格的 CRS 对象。然后使用它使用 geopandas ''.to_crs'' 方法重新投影。

In [32]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
with rio.open(paths[0]) as raster_crs:
    crop_raster_profile = raster_crs.profile
    crop_bound_utm13N = crop_bound.to_crs(crop_raster_profile["crs"])
crop_raster_profile["crs"]
代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CRS.from_epsg(4326)

批量裁剪

当您需要裁剪和堆叠一组图像时,最有效的方法是先 裁剪每个图像,然后堆叠它。 ''es.crop_all()'' 是一种快速裁剪图像中所有波段的有效方法。 该函数会将裁剪的栅格写入 目录并返回文件路径列表,然后可以与 ''es.stack()''。

In [42]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
output_dir = './'
band_paths_list = es.crop_all(
    paths, output_dir, crop_bound_utm13N, overwrite=True
)
print(glob.glob('/home/mw/project/*'))
代码语言:javascript
代码运行次数:0
运行
复制

堆叠所有数据

裁剪数据后,您就可以创建新堆叠了。

In [46]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
band_paths_list = glob.glob('/home/mw/project/*crop.tif')
cropped_array, array_raster_profile = es.stack(band_paths_list, nodata=-9999)
crop_extent = plotting_extent(
    cropped_array[0], array_raster_profile["transform"]
)

# Plotting the cropped image
# sphinx_gallery_thumbnail_number = 5
fig, ax = plt.subplots(figsize=(12, 6))
crop_bound_utm13N.boundary.plot(ax=ax, color="red", zorder=10)
ep.plot_rgb(
    cropped_array,
    ax=ax,
    stretch=True,
    extent=crop_extent,
    title="Cropped Raster and Fire Boundary",
)
plt.show()
代码语言:javascript
代码运行次数:0
运行
复制

裁剪单波段

如果你只需要裁剪一个光栅图像,你可以使用 EarthPy 的 ''es.crop_image()'' 函数。 此函数获取 Rasterio 对象并将其裁剪为提供的 空间范围。

In [45]:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Open Landsat image as a Rasterio object in order to crop it
stack_band_paths = glob.glob('/home/mw/project/*crop.tif')
with rio.open(stack_band_paths[0]) as src:
    single_cropped_image, single_cropped_meta = es.crop_image(
        src, crop_bound_utm13N
    )

# Create the extent object
single_crop_extent = plotting_extent(
    single_cropped_image[0], single_cropped_meta["transform"]
)

# Plot the newly cropped image
fig, ax = plt.subplots(figsize=(12, 6))
crop_bound_utm13N.boundary.plot(ax=ax, color="red", zorder=10)
ep.plot_bands(
    single_cropped_image,
    ax=ax,
    extent=single_crop_extent,
    title="Single Cropped Raster and Fire Boundary",
)
plt.show()
代码语言:javascript
代码运行次数:0
运行
复制

小结

以上是基于earthpy的官方教程修改,因为官方的示例数据较难下载就改成自己的数据

看得出erathpy对于tif数据处理较为便利,堆叠和掩膜都比较简短

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CDN对直播平台开发有什么作用
在直播系统中加入CDN,是传输内容尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输速度更快、更稳定。通过在网络各处放置节点和服务器所构成的在现有的互联网基础上的一层智能虚拟网络,CDN系统能够实时根据网络流量和各节点的链接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务器节点上。目的就是使用户在最短时间内获取到所需信息,解决网络拥堵状况,提高用户访问网站的响应速度。
nicai123
2019/09/27
1.9K0
CDN对直播平台开发有什么作用
cdn是什么意思?cdn如何使用?
随着互联网行业的快速发展,人们的日常生活也渐渐离不开互联网的帮助,无论是吃喝玩乐还是外出旅行购物都会用到互联网,就拿现在的购物来说,以前是需要到实体店选购的,现在在手机或者电脑上就可以浏览各种商品,通过文字、图片或者视频的介绍就能了解到商品的具体信息。平时浏览网页的时候内容是越来越多的,这就会造成用户们打开网页速度过慢或者打不开的问题,相信很多人都是听说过cdn这个网页加速方式,那么cdn是什么意思?cdn如何使用?
用户8715145
2021/09/18
5.3K0
cdn是什么意思?cdn如何使用?
CDN服务器是什么
在使用服务器的时候很多企业都会考虑到为了方便用户快速便捷的访问,使用了CDN服务器,听说到最多的解释就是CDN加速,CDN缓存问题。今天我们来说下什么是CDN服务器,CDN加速服务器优势有哪些呢 CDN是内容分发网络,器功能是将网站内容发布到最接近用户的边缘节点,使网民可就近取得所需内容,提供网民访问的响应速度和成功率,同时能够保护源站。解决由于地域、带宽、运营商接入等问题带来的访问延迟高问题,有效帮助站点提升访问速度。
用户8771342
2021/12/01
4.4K0
关于CDN的原理、术语和应用场景那些事
关于CDN,想必你一定看过很多官方的解释。今天,将用一篇3844字的文章,来带你了解CDN的诞生、术语、原理、特征以及应用场景,看完这篇文章,相信你将会对CDN这项互联网基础设施有更加透彻的了解。
PHP开发工程师
2021/05/13
2.2K0
关于CDN的原理、术语和应用场景那些事
流媒体服务器音视频直播平台的开发为什么需要CDN?
我也不是第一天说直播行业的热门了,已经有不少的开发者咨询我相关的直播问题,还没有搭上这趟快车的伙伴们赶紧啊!错过了公众号的红利期,视频的红利期不能再错过了,可以随时找我咨询直播问题,只要你来找我,我就时刻在线!
EasyNVR
2020/05/20
1.3K0
作为一名程序员,你真正了解CDN技术吗?
将时光倒回到几年前,在那时候我的老家县城里,如果你从京东APP上购物下单,起码需要等上个几天时间,才能将商品送到你的手中。
Bug开发工程师
2019/11/18
1.3K0
CDN是个啥玩意?一文说个明白
在今日的世界中,互联网已经与人们的生活密不可分,诸如电商、门户网站、直播、游戏等互联网业务都有着广泛的受众。而在这些服务的背后,都离不开一个重要的角色:CDN。
西岸Alex
2022/10/31
3.1K0
CDN是个啥玩意?一文说个明白
WordPress使用腾讯云CDN配置教程(https)
本站域名,服务器,对象储存,CDN全部都用的腾讯云的,不要问为什么(joke还是个孩子)。 腾讯云的cdn使用还是比较简单的。joke主要是为了记录一下使用的过程,你们也可以参考一下。
陌涛
2020/06/11
16.8K4
WordPress使用腾讯云CDN配置教程(https)
学习什么是CDN
周六晚上七点多,我正在看书呢,突然女朋友跑过来问我她的IPAD去哪了,火急火燎的。
Java3y
2019/08/09
2.2K0
学习什么是CDN
美团二面:什么是 CDN ?CDN 工作原理是什么?
CDN 全称是 Content Delivery Network/Content Distribution Network,翻译过的意思是 内容分发网络 。
Guide哥
2022/11/07
1.9K0
美团二面:什么是 CDN ?CDN 工作原理是什么?
CDN是什么?
内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。CDN应用广泛,支持多种行业、多种场景内容加速,例如:图片小文件、大文件下载、视音频点播、直播流媒体、全站加速、安全加速。
德迅服务器抗D盾
2023/11/10
5540
CDN是什么?
什么是cdn服务器?cdn加速服务是什么?
没从事互联网工作的人,很少人会知道怎么解决网络卡顿问题,一般上网搜索都是下载某某加速器,然而这些加速器都是针对散户,而不是企业。那我一个企业网站想少花钱又要更快的网站打开速度,可能吗?答案是肯定的,那么接下来让我们一起了解下什么是cdn服务器?cdn加速服务是什么?别走开,答案在下文。
用户8715145
2021/09/18
13.7K0
什么是cdn服务器?cdn加速服务是什么?
CDN与项目应用测试
虽然很早听过CDN,但对其原理处于模糊的状态。如今国内访问量较高的网站、直播、视频平台,均使用CDN网络加速技术,小编所在项目有使用CDN技术,谨以此篇学习共勉。
用户5521279
2019/06/28
1.6K0
什么是CDN?它解决了什么难题?5分钟让你明明白白!
CDN这个词在我们技术圈中经常听到,什么CDN节点呀、CDN加速呀,当同事跟你谈到这些话题的时候,是不是大家都只顾着点头呢? CDN其实作用很大,我们每天都在享受CDN带来的福利,只是你感受不到。比如
网络技术联盟站
2021/01/25
75.7K1
网站如何配置CDN加速?网站域名接入CDN加速的步骤(附CDN防御常用配置方式)(cdn加速服务器 吃核心还是吃主频)
什么是CDN?CDN的全称是Content Delivery Network,即内容分发网络CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
雾海梦曦
2022/11/24
48.4K0
网站如何配置CDN加速?网站域名接入CDN加速的步骤(附CDN防御常用配置方式)(cdn加速服务器 吃核心还是吃主频)
高防cdn防护原理是什么,是否可以防护服务器吗
随着互联网业务的迅速发展,网络安全问题日益凸显。在这样的背景下,高防CDN作为一种有效的网络安全解决方案,受到了越来越多的关注。那么高防CDN的防护原理是什么呢?接下来就跟小德一起深入了解下吧!
德迅云安全--陈琦琦
2023/11/24
4830
高防cdn防护原理是什么,是否可以防护服务器吗
大家知道什么是CDN吗?对网站有什么帮助?
在当今互联网时代,网站的性能和用户体验是至关重要的。而CDN(内容分发网络)作为一种优化网站性能的技术,被广泛应用于网站开发和管理中。本文将解释什么是CDN以及它对网站的帮助。
海拥
2023/06/23
4910
2021-01-07:cdn加速是什么原理?
CDN(Content Delivery Network):内容分发网络是指一组在地理上分散的服务器,它们协同工作以提供互联网内容的快速交付,一般各种网页静态资源,例如HTML页面、javascript 文件、样式表、图像和视频,可以通过 CDN 进行转发,分布于世界各地的不同服务器上。
福大大架构师每日一题
2021/01/07
2.2K0
cdn怎么到源站获取数据?cdn具备哪些特点?
相信提起cdn这个词汇的时候,编程人员和网络技术人才都会感到熟悉,这是因为cdn是一种高端技术,它能够起到节省骨干网宽带的作用,cdn能够通过内容分发、负载均衡等多个功能模块,让网页打开速度变得更快,可以改善用户网上冲浪体验。cdn怎么到源站获取数据?cdn的特点是什么?
用户8715145
2021/09/24
2.4K0
【说站】CDN加速是什么?为什么要使用CDN?
CDN的英文全称是Content Delivery Network,翻译过来就是“内容分发网络”。
很酷的站长
2022/11/24
6K0
【说站】CDN加速是什么?为什么要使用CDN?
推荐阅读
相关推荐
CDN对直播平台开发有什么作用
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档