4

我正在开发一个应用程序,我想在一张易滑的地图上呈现不同水体的水深可视化。本质上,这些是基于插值 DEM 数据的地理包含的地形可视化。我追求的结果是:

在此处输入图像描述

我已经编写了代码来从深度样本中插入 DEM,并有一个概念证明,我将它们存储在 PostGIS 中的非平铺栅格中(每个水体一个栅格),效果相当好。

但是我确实相信我将不得不用某种基于图块的解决方案来替换这个概念,因为水体几乎可以是任意大小,并且视觉方面可能应该根据缩放级别等进行调整。

如果仅此而已,我可能只是模仿在各个地方描述的常规高程栅格生成概念,通常基于 Mapnik。然而,这里是乐趣开始的地方..

理想情况下,我不想呈现栅格数据,而是呈现矢量(或者可能是两者的组合)。我希望我的地图比栅格数据通常更具交互性(除非栅格数据被撕开并使用例如 D3 进行分析 - 稍后会详细介绍)。我希望有可能根据用户交互动态更改等距离(轮廓线的距离和值)。

关于如何安排这个堆栈,我很想有一些聪明的意见。我想通风的一些想法:

1. 仅栅格切片 高程 DEM 栅格是基于经典的 256x256 墨卡托概念生成的。这些由客户端浏览器动态下载并按原样显示,或使用画布/D3 进行颜色映射。最重要的是,我使用 canvas API 使用 D3 提取矢量轮廓。这将是一个相当干净的解决方案,但我怀疑它会变慢(图像检查部分)。

2. 栅格切片与矢量切片 高程 DEM 栅格仍然会生成,因为它们构成了表示和存储插值数据的好方法。栅格图块仍可能构成地图上的图形叠加层,但本质上,高程等值线由单独获取的矢量图块组成(基于 GeoJSON 或 TopoJSON)。这些瓦片是根据光栅规则生成的。

由于我希望能够即时更改等距,因此我必须能够统一和组合矢量,例如使用 D3。我看了一下 d3.geom.contour 插件,但它似乎有点受限,例如似乎没有局部峰,而是像金字塔一样的拓扑。

最后但并非最不重要的一点是,为了美观,我想执行轻型客户端线插值(或类似的东西)。即测深图的分辨率可能较低(因为更高的分辨率确实没有价值),但在这个分辨率下,轮廓通常会变得笨拙。也许这是 TopoJSON 的一个论点,它的简化可能性?这是我使用 D3 制作的示例(使用服务器端生成的非切片 GeoJSON):

在此处输入图像描述 欢迎任何建议!

4

1 回答 1

3

做到这一点的最佳方式很大程度上取决于您最终希望拥有多少灵活性。这是一个建议,至少可以为您提供一定程度的灵活性。

在初始屏幕中,显示一个“合理的默认值”,即看起来不错且不需要加载太多数据的东西。我在这里做了一些类似的事情,尽管如果我今天再做一次,我可能会使用 TopoJSON。

然后对于每个用户交互,根据需要加载新数据。基本上有两种。

  • 用户缩放/平移,您想要显示更详细的内容。如果您使用矢量,分辨率应该不是问题,但您可能想做一些事情,例如显示中间轮廓线。为此,您可以简单地从 JSON 加载其他等高线。
  • 用户选择不同的高度间隔/等。同样,您可以简单地加载新数据。这意味着您不允许随意更改这些内容,而只能使用一定数量的离散级别来预先计算数据。使浏览器和编程变得更加容易。

为了使其与矢量一起工作,您可能必须简化初始加载的几何图形——同样,您可以在用户放大时动态加载更详细的路径。

如果我理解您要正确执行的操作,我不会推荐光栅图块。它们基本上没有为您提供任何灵活性,也不需要。数据量(除非您想显示非常大的区域)应该是可管理的,尤其是当您只根据需要加载更详细的数据时。

于 2013-09-09T09:49:00.610 回答