是否正在使用MapServer在运行时合并多个MapLayers以与Leaflet一起使用?

时间:2014-03-20 10:16:16

标签: leaflet mapserver

我的问题

我们现在正在做一个项目,我们必须在Web应用程序(Leaflet)中显示一个巨大的图像(包含化学化合物和元素,因此不是地理参考)。图像本身是Adobe Illustrator-File,因此它实际上是一堆矢量图形。为了简单起见,我们只是将它转换为一个大的.png(27.000x19.000像素),然后使用MapTiler为Leaflet创建所需的MapRessources,很容易包含在TileLayer中。

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

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

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

我的方法远远不够

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

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

所以现在,我可以想到两个不同的选择:

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

    我绝对没有使用MapServer的经验,因此我甚至不确定这是否是一个用例,或者它是否能够做到这一点,更重要的是:如果它真的会给我们带来性能提升,那么它可能需要很多逻辑ServerSide。

    在我开始花费另外几个小时试试这个之前: 已经与MapServer合作的人可以给我一些反馈,如果这是一个好主意,或者我是否完全误解了MapServer的内容?

    此外,如果有人为我提供另一种选择或想法,欢迎您分享,我对每一个输入感激不尽。 :)

    提前致谢!

1 个答案:

答案 0 :(得分:1)

您可能希望查看可以显示栅格和矢量图层混合的OpenLayers。另一个选项可能是mapcache mapserver项目的tile缓存引擎部分。这能够进行瓷砖的垂直组装。因此,如果你有8层的情况,你可以要求mapcache将所有8个瓷砖堆叠成一个瓷砖。你可以给它一个堆栈列表,它会为你处理它。您也可以使用mapserver执行此操作。区别在于mapcache是​​一个轻量级的apache模块,只适用于tile,可能会快一点。 Mapserver是一个cgi-bin过程,可以有效地渲染和组合栅格图层,但对于简单的图块组合,可能没有mapcache那么快。