处理和可视化地理空间数据的Python库:EarthPy

文摘   2024-10-14 23:07   韩国  
地理空间技术是指使用地理信息系统(GIS)、遥感、全球定位系统(GPS)和其他地理空间数据和工具来捕捉、分析和可视化有关地球表面物理特征和特性的信息。地理空间技术的出现彻底改变了我们分析和解读地球表面的方式。另一方面,在地理空间数据日益丰富的背景下,开发高效且用户友好的数据分析工具的需求变得至关重要。

本文介绍能够简化处理和可视化空间栅格和矢量数据过程的Python包:EarthPy。EarthPy建立在Rasterio、GeoPandas和Matplotlib等成熟库之上,为地理空间数据操作提供了直观的接口。

EarthPy的主要功能

  • 数据处理与可视化:EarthPy简化了栅格和矢量数据的加载、处理和可视化。它提供了易于使用的函数,支持数据标准化、阴影计算和空间范围计算等常见任务,这些功能对于环境科学研究尤为重要。

  • 遥感数据分析:EarthPy允许用户查看遥感图像中单个波段的直方图和图形,以探索数据校准和质量问题。此外,它能够创建具有独特符号的底图、绘制带有颜色条的图像以及渲染多波段光谱遥感图像。

  • 教育与教学:EarthPy被广泛应用于教育领域,特别是在教授学生如何使用开源Python工具处理地球和环境数据时。它的**io**模块简化了教学数据的下载过程,支持课堂上工作流程的可重复性。

  • 空间分析:支持输入/输出、掩膜处理、绘图和空间分析等功能,使得用户能够高效地执行地理空间数据操作。提供了高效的平台,使研究人员能够快速进行空间数据探索和清理。集成了GeoPandas和Rasterio的功能,使得用户能够在一个包中处理矢量和栅格数据。


EarthPy的应用领域

EarthPy在环境科学、城市规划和地球观测等领域有广泛的应用。例如:
  • 生态学研究人员使用EarthPy进行栖息地制图和物种分布建模。

  • 在城市规划中,它有助于分析土地利用模式和基础设施发展。

  • 在地球观测领域,它在处理卫星图像方面发挥着关键作用,应用于灾害管理、资源勘探和气候变化研究等领域。

EarthPy的一个重要方面是它对不同编程水平的用户都很友好。该库简单明了的语法,加上详细的文档和教程等丰富的在线资源,大大降低了初学者的入门门槛。对于高级用户来说,EarthPy提供了强大和灵活性,使其成为复杂地理空间分析的有价值工具。EarthPy为环境科学、城市规划和地球观测等领域提供了强大的数据分析工具,支持研究人员更好地理解和分析地球系统。它的简单易用的接口和丰富的功能,使得这些领域的科研人员能够更高效地处理和可视化地理空间数据。

EarthPy的使用示例

EarthPy能够与数据科学工具如Pandas、NumPy和Scikit-learn无缝集成,这意味着用户可以将地理空间数据纳入更广泛的数据分析工作流程中。这种互操作性对于需要结合空间和非空间数据分析的多学科项目至关重要。

使用pip安装EarthPy:

pip install earthpy
1. 加载和可视化DEM数据

该示例展示EarthPy进行复杂的数据分析,包括处理多波段栅格数据、对栅格数据进行计算,以及与其他地理空间Python库集成以实现高级地理空间工作流程。

import osimport matplotlib.pyplot as pltimport earthpy as etimport earthpy.plot as epimport rioxarray
# Download sample datadata = et.data.get_data('colorado-flood')
# Set working directory to earthpy data directoryos.chdir(os.path.join(et.io.HOME, 'earth-analytics', 'data'))
# Define path to filedem_pre_path = os.path.join("colorado-flood", "spatial", "boulder-leehill-rd", "pre-flood", "lidar", "pre_DTM.tif")
# Read the data using rioxarraydem_pre = rioxarray.open_rasterio(dem_pre_path, masked=True).squeeze()
# Plot DEMfig, ax = plt.subplots(figsize=(10, 6))ep.plot_bands(dem_pre, cmap='terrain', title="Lidar Digital Elevation Model (DEM) \n Boulder Flood 2013", ax=ax)plt.show()

该脚本显示了美国科罗拉多州博尔德地区发生洪水前的激光雷达数字高程模型(DEM)地图。

2. 可视化LandSat8波段数据

Landsat8数据集有7个波段。本文使用EarthPy包中内置的plot_bands方法绘制这些波段。plot_bands方法支持根据自定义标题进行可视化绘制。可以通过使用“title=”参数传递一个包含每个图像唯一标题的列表来实现。

import earthpy as ep
ep.data.path = "."ep.data.get_data('colorado-flood'
im = epp.plot_bands(arr_st, cmap='RdYlGn', figsize=(12, 12))
plt.show()

输出结果如下图:

3. 绘制高光谱图像波段直方图

可视化高光谱图像数据集的波段有助于我们理解波段值的分布。本文使用earthpy.plot的hist方法绘制波段直方图,还可以修改每个直方图的列大小、标题和颜色。

import earthpy.plot as epp
data = ep.data.get_data('vignette-landsat') landsat_path = glob("vignette-landsat/LC08_L1TP_034032_20160621_20170221_01_T1_sr_band*_crop.tif")landsat_path.sort()
# Stacking Bandsarr_st, meta = es.stack(landsat_path, nodata=-9999)
colors = ['tomato', 'navy', 'MediumSpringGreen', 'lightblue', 'orange', 'maroon', 'yellow']
epp.hist(arr_st, colors = colors, title=[f'Band-{i}' for i in range(1, 8)], cols=3, alpha=0.5, figsize = (12, 10), )
plt.show()

4. 计算和分类归一化植被指数(NDVI)

归一化植被指数(NDVI)通过测量近红外光(植被强烈反射)与红光(植被吸收)的差异来量化植被。

# Landsat 8 red band is band 4 at [3]# Landsat 8 near-infrared band is band 5 at [4]
ndvi = es.normalized_diff(arr_st[4], arr_st[3])
titles = ["Landsat 8 - Normalized Difference Vegetation Index (NDVI)"]
epp.plot_bands(ndvi, cmap="RdYlGn", cols=1, title=titles, vmin=-1, vmax=1, figsize=(10, 10))
plt.show()

基于高光谱图像数据,NDVI的计算结果被划分为不同的类别。0以下的值将被归类为无植被。将为裸露区域和低、中、高植被区域创建其他类别。

ndvi_class_bins = [-np.inf, 0, 0.15, 0.23, 0.6, np.inf]

ndvi_landsat_class = np.digitize(ndvi, ndvi_class_bins)
# Apply the nodata mask to the newly classified NDVI datandvi_landsat_class = np.ma.masked_where(np.ma.getmask(ndvi), ndvi_landsat_class)
np.unique(ndvi_landsat_class)
nbr_colors = ["gray", "y", "yellowgreen", "g", "darkgreen"]nbr_cmap = ListedColormap(nbr_colors)
# Define class namesndvi_cat_names = [ "No Vegetation", "Bare Area", "Low Vegetation", "Moderate Vegetation", "High Vegetation",]
# Get list of classesclasses = np.unique(ndvi_landsat_class)
classes = classes.tolist()
# The mask returns a value of none in the classes. remove thatclasses = classes[0:5]
# Plot the datafig, ax = plt.subplots(figsize=(10, 10))
im = ax.imshow(ndvi_landsat_class, cmap=nbr_cmap)
epp.draw_legend(im_ax=im, classes=classes, titles=ndvi_cat_names)
ax.set_title( "Landsat 8 - Normalized Difference Vegetation Index (NDVI) Classes", fontsize=14,)
ax.set_axis_off()
# Auto adjust subplot to fit figure size
plt.tight_layout()

EarthPy在简化了使用Python进行地理空间数据分析的流程。它的易用性结合强大的数据处理和可视化能力,使其成为地理空间分析领域不可或缺的工具。随着地理空间数据的数量和种类不断增长,像EarthPy这样的工具将在地球观测和分析方面发挥关键作用。

  • 使用文档:https://earthpy.readthedocs.io/en/latest/

  • 代码:https://github.com/earthlab/earthpy

GEE遥感训练营
分享GEE遥感领域实用教程、最新科研成果及资讯,交流、合作等事宜请加V:GeeStudy_2020
 最新文章