来自:https://twitter.com/researchremora今天给大家介绍的是“Rayshader”软件包。该软件包使用户能够使用高程数据创建 2d 和 3d 可视化。通过“光线追踪、球面纹理映射、叠加和环境遮挡”的巧妙组合,用户可以制作出令人惊叹的拓扑图和动画。
如果您对R或Python不太熟悉,可以使用Rayshader软件包完成以下3D图的制作。
来自:https://twitter.com/researchremora 来自:https://twitter.com/researchremora 来自:https://twitter.com/CSVerdel 来自:https://twitter.com/CSVerdel
rayshader 示例
https://www.rayshader.com/
官网文档说明、教程:https://www.rayshader.com/
Python 如何使用 rayshader?
原文地址:https://www.gpxz.io/blog/rayshading-in-python
你需要安装 rpy2
pip install rpy2
并且还需要rayshader
在 R 中安装
install.packages("devtools")
devtools::install_github("tylermorganwall/rayshader")
我们需要导入一些标准的 python 地理空间包,导入 rpy2,并激活 rpy2 的 numpy 转换层。
import tempfile
import matplotlib.pyplot as plt
import numpy as np
import rasterio as rio
import rpy2.robjects as ro
import rpy2.robjects.numpy2ri
import rpy2.robjects.packages as rpackages
rpy2.robjects.numpy2ri.activate()
zip_url = '/vsizip//vsicurl/https://tylermw.com/data/dem_01.tif.zip/dem_01.tif'
with rio.open(zip_url) as f:
z = f.read(1)
plt.imshow(z)
生成的热图显示了海拔剖面图,但不是非常直观。这就是光线着色器介入的地方。
rpy2 有许多不同的接口,但最简单的是将所有变量加载到 r 命名空间,然后将 R 代码作为字符串调用。
def rayshade(z, img_path=None, zscale=10, fov=0, theta=135, zoom=0.75, phi=45, windowsize=(1000, 1000)):
# Output path.
if not img_path:
img_path = tempfile.NamedTemporaryFile(suffix='.png').name
# Import needed packages.
rayshader = rpackages.importr('rayshader')
# Convert array to matrix.
z = np.asarray(z)
rows, cols = z.shape
z_mat = ro.r.matrix(z, nrow=rows, ncol=cols)
ro.globalenv['elmat'] = z_mat
# Save python state to r.
ro.globalenv['img_path'] = img_path
ro.globalenv['zscale'] = zscale
ro.globalenv['fov'] = fov
ro.globalenv['theta'] = theta
ro.globalenv['zoom'] = zoom
ro.globalenv['phi'] = phi
ro.globalenv['windowsize'] = ro.IntVector(windowsize)
# Do the render.
ro.r('''
elmat %>%
sphere_shade(texture = "desert") %>%
add_water(detect_water(elmat), color = "desert") %>%
add_shadow(ray_shade(elmat, zscale = 3), 0.5) %>%
add_shadow(ambient_shade(elmat), 0) %>%
plot_3d(elmat, zscale = zscale, fov = fov, theta = theta, zoom = zoom, phi = phi, windowsize = windowsize)
Sys.sleep(0.2)
render_snapshot(img_path)
''')
# Return path.
return img_path
此函数返回渲染的 3D png 的路径。您可以从那里复制文件或在 jupyter notebook 中显示它。
img_path = rayshade(z)
from IPython.display import Image
Image(filename=img_path)
GPXZ 的光线阴影
GPXZ是用于高分辨率高程数据的 API。我们不断进行实验以提高数据质量,并使用 rayshader(通过 python!)可视化结果。
GPXZ(通过 LINZ 1m 激光雷达)
最后,注意事项
rayshader 制作的3D地图的光影效果肯定是不如专业的3D软件,如 C4D 和 Blender,但它胜在快捷、高扩展性,还有 R 语言的加持。
- END -
对于Python学习,还是推荐《Python学习手册》,内容细致入微,包含了Python基础以及高级知识的方方面面。