Lexcube 的地理空间大数据 3D 可视化!(Python)
原文:
towardsdatascience.com/3d-visualization-of-geospatial-big-data-by-lexcube-python-a57512cabd69
目录
-
🌟 简介
-
🌐 Lexcube
-
📰 数据
-
📂 包含随机数的立方数据
-
🗂️ 包含气候数据的立方数据
-
🔄 栅格层到 Xarray
-
🌍 Lexcube 的 Xarray 3D 可视化
-
📦 Lexcube 还能做什么
-
📝 结论
-
📚 参考文献
🌟 简介
在三个维度(纬度、经度和时间)中进行数据可视化非常吸引人,不是吗?作为一名地理空间数据科学家,我一直想知道合并数百个栅格层创建的立方数据集的最简单绘图方法。在阅读我的 LinkedIn 动态时,我发现了一个名为 Lexcube 的优秀的 Python 库,它最近对 Jupyter Notebook 开放。有关 Lexcube 的更多信息,请参阅此***文章和/或查看Lexcube 在 GitHub***。
首先,我要感谢 Miguel Mahecha 在 LinkedIn 上分享那篇帖子,也要感谢 Maximilian Söchting 及其团队为地理空间数据社区开发了一个有价值的工具。其次,这里有一个实际操作练习,帮助你使用这个包来在 3D 图表中可视化你的立方数据。所有步骤都已用 Python 在 Google Colab 中编码,到这篇文章结束时,你将学会如何将你的栅格层转换为 Xarray 格式,然后使用 Lexcube 创建你数据的 3D 图表。
如果你像我一样,在寻找用于数据 3D 可视化的包,这个故事就是为你准备的。我与 Lexcube 没有任何关联,只是想通过写这篇博客来分享我的经验。
🌐 Lexcube
柏林大学地球数据立方体探索者,或 Lexcube,是由 Maximilian Söchting 在 Gerik Scheuermann 和 Miguel Mahecha 的指导下作为博士项目开发的交互式数据可视化工具。该工具旨在处理大型地球数据立方体。该项目得到了多个机构和机构的资助,包括欧洲航天局(ESA)。2022 年 5 月,该工具的网页版成为可用,最近,开源的 Jupyter Notebook 已向社区发布,使用户能够完全控制时间、空间和变量域中的大型数据立方体的可视化。
📰 数据
对于这个练习,我们将使用两个不同的数据集。第一个是为那些想快速测试 Lexcube 的人生成的,在任意纬度、经度和时间范围内使用随机数生成的数组。第二个是从 1981 年到 2020 年美国长期空气温度层的 Xarray。我们将学习如何将保存在单独文件中的 GeoTIFF 文件合并成 Xarray 格式,这与 Lexcube 兼容。
📂 随机数数据立方体
要创建一个包含随机数的三维数据集,我们将导入 numpy、xarray、zarr 和 pandas 库。我们将生成从-90 到+90 的 720 个纬度,从-180 到+180 的 1440 个经度,以及从 2023-01-01 到 2023-12-31 的 365 天。接下来,我们将创建一个范围从-20 到 30 的随机数的三维数组,并设置时间、纬度和经度。之后,我们将数组转换为 Xarray,以 Zarr 格式保存,并将数据标记为“空气温度”。以下代码行为您执行这些步骤:
import numpy as np
import xarray as xr
import zarr
import pandas as pd
# Set dimensions
lat = np.linspace(-90, 90, 720)
lon = np.linspace(-180, 180, 1440)
time = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
# Create 3D array with random numbers
data = np.random.uniform(low=-20, high=30, size=(len(time), len(lat), len(lon)))
# Create xarray DataArray with coordinate labels
data_array = xr.DataArray(data, coords={"time": time, "lat": lat, "lon": lon}, dims=["time", "lat", "lon"])
# Save DataArray as Zarr file
data_array.to_dataset(name="air_temperature").to_zarr("random_data.zarr", mode="w")
您可以使用以下代码打开此数据立方体:
ds = xr.open_dataset("random_data.zarr", chunks={}, engine="zarr")
da = ds["air_temperature"][:,:,:]
da
如果数据立方体创建正确,您将看到变量名(在这种情况下,为空气温度)以及时间(365)、纬度(720)和经度(1440)的维度。
三维随机数 Xarray(纬度、经度、时间),图片由作者提供
在下一节中,我们将使用这个数据立方体用 Lexcube 进行绘图。但在那之前,让我们创建一个包含气候数据的数据立方体。
🗂️ 气候数据数据立方体
要创建包含气候数据的数据立方体,我们将使用本帖中生成的 GeoTIFF 文件(参考章节 📥 下载气候数据和 🔄 将气候数据转换为 GeoTIFF)。
如果您遵循该帖子中的步骤,您的内容文件夹中应该有 1981 年到 2020 年 7 月美国平均空气温度的 GeoTIFF 格式文件。在这里,我们将获取这些 GeoTIFF 文件的路径列表以在循环中读取:
import os
import glob
directory = '/content/'
extension = '.tif'
# Get a list of all GeoTIFF files in the directory
geotiff_files = glob.glob(os.path.join(directory, '*' + extension))
geotiff_files.sort()
# Print the list of GeoTIFF files
print(geotiff_files)
在循环中读取栅格文件之前,我们需要为这些 GeoTIFF 文件创建一个日期范围列表,因为这些 GeoTIFF 文件覆盖了 1981 年 7 月到 2020 年的整个时间段。接下来,我们将使用 rasterio 包读取每个栅格文件,将栅格文件转换为包含从每个文件中提取的纬度和经度的 Xarray,并通过附加每个栅格文件的二维数据创建数据立方体。最后,我们将根据我们生成的日期范围在数据立方体中设置时间,并将其保存为 Zarr 文件:
import rasterio
import xarray as xr
import zarr
# Create a time list
time = pd.date_range(start='1981-07-01', end='2021-07-01', freq='Y')
# Read raster files and create a list of xarray DataArrays
data_arrays = []
for file in geotiff_files:
with rasterio.open(file) as src:
data = src.read(1) # Read the first band
height, width = src.shape
y_values = np.arange(height) * src.transform[4] + src.transform[5]
x_values = np.arange(width) * src.transform[0] + src.transform[2]
da = xr.DataArray(data, dims=("y", "x"), coords={"y": y_values, "x": x_values}, name="air_temperature")
data_arrays.append(da)
# Combine DataArrays into a single xarray Dataset
ds = xr.concat(data_arrays, dim="time")
ds["time"] = ("time", time) # Assign month numbers as time coordinates
# Save the xarray Dataset as a zarr file
ds.to_zarr("climate.zarr", mode="w")
与上一节类似,我们可以使用以下代码读取保存的 Zarr 文件:
ds = xr.open_dataset("climate.zarr", chunks={}, engine="zarr")
da = ds["air_temperature"][:,:,:]
da
如果文件保存正确,您应该看到 Xarray 的详细信息(时间 40 层,x 轴 1405 个网格,y 轴 621 个网格):
气候数据在三个维度(纬度、经度、时间)的 Xarray,图片由作者提供
🌍 Lexcube 的 3D Xarray 可视化
现在我们有了两个 Zarr 文件(一个基于随机数,另一个基于气候数据),我们准备绘制这两个数据立方体的 3D 可视化。我们将首先安装 Lexcube 库:
pip install lexcube
如果您在 Google Colab(像我一样)中工作,您需要通过运行以下命令来激活小部件:
from google.colab import output
output.enable_custom_widget_manager()
在设置好 Google Colab 环境后,您可以用 6 行代码绘制您的数据。让我们从第一个数据立方体(随机数)开始:
import xarray as xr
import lexcube
ds = xr.open_dataset("random_data.zarr", chunks={}, engine="zarr")
da = ds["air_temperature"][:,:,:]
w = lexcube.Cube3DWidget(da,cmap="thermal_r", vmin=-20, vmax=30)
w
输出结果将是:
Lexcube 展示第一个数据立方体(随机数)的 3D 可视化
由于第一个数据立方体是基于随机数生成的,您将在三个维度上看到完全的噪声图像。然而,将任何数据立方体转换为 Xarray 以在 Lexcube 中使用是一个很好的练习。为了获得更好、更有意义的 3D 图表,让我们可视化第二个数据立方体(气候数据)。我们将使用相同的行,但使用新的 Zarr 文件名,即‘climate.zarr’:
ds = xr.open_dataset("climate.zarr", chunks={}, engine="zarr")
da = ds["air_temperature"][:,:,:]
w = lexcube.Cube3DWidget(da,cmap="RdYlBu_r", vmin=0, vmax=30)
w
输出结果将是:
Lexcube 展示美国西部气候数据库的空气温度的 3D 可视化
让我们放大查看加利福尼亚州的中央谷地:
Lexcube 展示中央谷地气候数据库的空气温度的 3D 可视化
您可以看到顶部层显示的 2020 年 7 月的平均空气温度。此外,通过将鼠标悬停在纬度和经度轴上,您可以看到不同年份的空气温度。哪一年是最热的?在哪个坐标上?
📦 Lexcube 还能做什么
假设您想剪裁这个图表以适应特定的位置(纬度和经度)和特定的时间。而不是手动在每个轴上放大和缩小,这并不方便,您可以通过运行以下命令来激活滑块:
w.show_sliders()
通过这个滑块,您可以剪裁您的图表以适应任何位置和时间范围:
带滑块的 Lexcube
最后但同样重要的是,如果您想将图表保存在本地文件夹中,可以通过运行以下命令实现:
w.savefig(fname="climate.png", include_ui=True, dpi_scale=2.0)
PNG 文件将保存在您的文件夹中:
下载的 PNG 文件
如果你想要更改颜色渐变,Lexcube 支持许多可以在参考文献部分提到的 GitHub 仓库中找到的颜色图。此外,如果你想要使用 Lexcube 绘制其他地理空间数据集,请查看以下帖子,了解如何在不编写任何代码的情况下下载特定地点和时间的卫星和地理空间数据库:
📝 结论
数据可视化现在是种非常棒的能力,它能帮助我们讲述故事并在报告中高效地展示结果。Lexcube 是这个领域中的一个库,它帮助我们快速并以视觉吸引人的方式可视化数据立方体,特别是 3D 地理空间数据库。在这篇文章中,我们介绍了如何为这个库准备你的数据集,以及如何使用它进行数据可视化项目。具体来说,我们创建了两个数据集:一个基于完全随机的数字,另一个基于气候数据库报告的空气温度。如果你想要为任何地点和时间创建数据立方体,还可以提供额外的资源。希望你会喜欢阅读,欢迎在评论区提问。
📚 参考文献
M. Söchting, M. D. Mahecha, D. Montero, G. Scheuermann, Lexcube: Interactive Visualization of Large Earth System Data Cubes (2023). IEEE Computer Graphics and Applications. doi:10.1109/MCG.2023.3321989.
pubmed.ncbi.nlm.nih.gov/37812545/
Miguel Mahecha 在 LinkedIn 上的 Lexcube 活动
PRISM 气候小组,俄勒冈州立大学,prism.oregonstate.edu, 创建日期 1981-2022,访问日期 2024 年 12 月 19 日。
📱 在其他平台上与我联系,获取更多吸引人的内容!LinkedIn,ResearchGate,Github,和***Twitter。
通过以下链接可以找到相关帖子:
更多推荐



所有评论(0)