一个神奇语言包!让你绘制精美2D、3D地图

今天给大家介绍的是“Rayshader”软件包。该软件包使用户能够使用高程数据创建 2d 和 3d 可视化。通过“光线追踪、球面纹理映射、叠加和环境遮挡”的巧妙组合,用户可以制作出令人惊叹的拓扑图和动画。

如果您对R或Python不太熟悉,可以使用Rayshader软件包完成以下3D图的制作。

9174f8c706275c8f98dc405f11dce662.png02ec19047e446b3ea4bc363eaafdd0be.png284d727d791ef050eabd86da6716764a.png11274c616c389bcbf058583298a6cd2d.jpeg

来自:https://twitter.com/researchremora

 0afe808e3e011903d712f4527db9345f.png360a43c1af30b8613bb72576a712aebe.png5ac32d5ca058497ea11d5212d3eb6831.png

a455ab1a5b6bbc38e4b97d3725d86d18.jpeg

来自:https://twitter.com/researchremora

5c7b0bf1c5adc7fdd0aba7d35b504959.jpeg

来自:https://twitter.com/researchremora

72a75c23491dab3109a98c01490252cd.jpeg

来自:https://twitter.com/CSVerdel

b380e62c613e1a351f6f1882913a0edb.jpeg

来自:https://twitter.com/CSVerdel

rayshader 示例

https://www.rayshader.com/

8e94ba502ffa563ae0400b10c40e2e94.gif

官网文档说明、教程: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)

96c5f46bf8e5875227645fdbaebdea0b.png

GPXZ 的光线阴影

GPXZ是用于高分辨率高程数据的 API。我们不断进行实验以提高数据质量,并使用 rayshader(通过 python!)可视化结果。

GPXZ(通过 LINZ 1m 激光雷达)

4b056fbf23f8fcedb0a399b555a966a2.jpeg

最后,注意事项

rayshader 制作的3D地图的光影效果肯定是不如专业的3D软件,如 C4D 和 Blender,但它胜在快捷、高扩展性,还有 R 语言的加持。

- END -

对于Python学习,还是推荐《Python学习手册》,内容细致入微,包含了Python基础以及高级知识的方方面面。

猜你喜欢

转载自blog.csdn.net/qq_35918970/article/details/131099043