0

我的问题

我们现在正在做一个项目,我们必须在 Web 应用程序中显示一个巨大的图像(包含化学化合物和元素,因此没有地理参考)作为地图(带有Leaflet)。图像本身是一个 Adob​​e Illustrator 文件,因此它实际上是一堆矢量图形。为方便起见,我们只是将其转换为一个大的 .png(27.000x19.000 像素),然后用于MapTiler为 Leaflet 创建所需的 MapRessources,轻松包含在TileLayer.

问题是:用户需要能够动态添加和删除地图的不同图层(== 过滤器)以显示图片中或多或少的信息。所以我们首先在 Illustrator-File 中创建了这些图层,然后将每个图层导出为自己的透明 .png-File,将其映射并包含为自己的 Leaflet-Layer。

现在,我们有 6 个过滤层和另外两个用于背景的基础层和一个叠加层。这意味着当所有过滤器都被激活(这是默认设置)时,我们有 8 个 Leaflet-Layers 一次堆叠在一起。可以想象,这会在浏览器中引起一些性能问题,因为 Leaflet 必须为每个缩放或拖动动作加载和渲染 8 个层及其所有 Tiles(取决于屏幕大小,一次最多 25 个)。它仍然处于无法承受的地步,但我们预计会有更多过滤器出现,因此希望在未来保持可扩展性。

这意味着我们将不得不以某种方式改变我们生成图层的方法。

到目前为止我的方法

由于我们实际上有一个基于矢量图形的地图,我认为必须有更好的选择。但似乎我们有一个罕见的需求案例,因为我的研究大多以死胡同结束,特别是因为大多数案例只涵盖真实的地理地图,但我们拥有的是栅格地图。我还考虑过以某种方式将地图放入 GeoJSON 或以某种方式直接使用 SVG 重新绘制它,但由于我们在地图上有很多单个元素(> 20k),我认为这不会表现得更好。

所以我有点需要保留位图,因此我的主要目标很简单:我想通过将当前激活的过滤器的图块合并到一个单个 .png 中来减少层数,然后将其传递到 ONE 层中的传单。我现在花了几个小时研究,但我总是遇到死胡同,因为似乎我们在这里有一个罕见的需求案例(特别是因为大多数人处理地理参考数据,而不是自定义栅格地图)。

所以现在,我可以想到 2 个不同的选项:

  1. 为每个过滤器组合创建一个图层。这意味着我们必须创建 2^n 层,所以这只适用于一定数量的过滤器(可能会增加) - 因此,我更喜欢另一种解决方案(这只是最后一种情况)
  2. 使用MapServer并以某种方式导入我的图层。Union Layer 然后我们可以在运行时将图层与查询合并(我在这里读到了),因此只将一个图层传递给传单。

我的问题

我完全没有经验,MapServer因此我什至不确定这是否是一个用例,或者它是否有能力这样做,更重要的是:如果它真的会给我们带来性能提升,因为它可能需要大量的逻辑服务器端.

在我开始再花几个小时尝试之前:MapServer如果这是一个好主意或者我MapServer完全误解了某些东西,已经与之合作过的人可以给我一些反馈吗?

另外,如果有人对我有其他选择或想法,非常欢迎您分享,我感谢每一个输入。:)

提前致谢!

4

1 回答 1

1

您可能想查看 OpenLayers,您可以在其中显示光栅和矢量图层的混合。另一种选择可能是 mapcache 一个 mapserver 项目的切片缓存引擎部分。这有能力做瓷砖的垂直组装。因此,如果您有 8 个图层,您可以要求 mapcache 将所有八个图块堆叠成一个图块。您可以给它一个要堆叠的层列表,它会为您处理它。您也可以使用地图服务器执行此操作。不同之处在于 mapcache 是一个轻量级的 apache 模块,仅适用于切片,并且可能更快一些。Mapserver 是一个 cgi-bin 进程,可以高效地渲染和组合栅格图层,但对于简单的切片组装可能不如 mapcache 快。

于 2014-03-21T01:06:38.497 回答