post - 如何使用 OpenLayers 提高大型可编辑图层的加载速度?
问题描述
我面临着快速加载图层的性能问题。我正在使用 OpenLayers 5.3、GeoServer 2.10 和 Oracle 12 数据库。我有一些(3-4)个用于信息和背景的 WMS 图层,以及一个可以编辑的 WFS 图层。最后一个有超过 30000 条折线,加载速度很慢。
所以我一直在寻找一些解决方案,我想要一些建议:
- 首先,我尝试在平铺版本中更改我的 WFS 图层,但我无法使其工作,或者我发现的样本不够准确
- 然后,我尝试在 WMS 平铺版本中更改我的 WFS 层。我能够让它工作,但我注意到这种图层的加载速度并不快,而且标签会在每个生成的图块中复制。我找到的解决方案说我应该使用一个简单的 WMS 层来绕过这个问题......嗯,好的。
- 我开始使用 WMTS 进行一些测试,但意识到我的图层会经常更改,因此我无法使用已经生成的图块。
最后,我认为更好的方法是使用简单的 WMS 图层,当我必须编辑它们时,只在 WFS 图层的要素中切换所需的折线。但是,我必须过滤 WMS 层的数据。我发现可以在参数中使用 CQL 过滤器。它可以工作,但是由于 GET 请求,过滤器的大小受到限制。所以我找到了在 POST 上更改请求的示例。它再次起作用,但是这次我注意到根据我的 WHERE 子句“ID in (1,2,3,4...999,1000,1001 ...)”中的项目数,图层生成变得非常缓慢.
这就是我现在所处的位置,我期待:我的“问题”的最佳方法是什么?
现在,我想通过在层中添加更多列来简化 CQL 过滤器,以构建比简单的“ID in (...)”更好的过滤器,并以这种方式继续:用 WMS 替换我的 WFS 层并添加一些自定义代码以我想要的方式管理它。
如果有人对我的情况有更好的建议,我会全神贯注:-)
此致。
解决方案
我认为看看如何实例化地图会很有用。我在一个有 1000 个标记的图层上遇到了类似的问题,加载问题是由于实例化造成的。
假设我有我的一系列功能markers
var markers = [];
如果我创建传递特征的标记层,加载地图真的很慢。
var vectorSource = new ol.source.Vector({
features: markers
});
var vectorLayer = new ol.layer.Vector({
source: vectorSource
});
否则,如果我创建图层然后动态地将每个功能添加到图层,加载时间会很好。
var vectorSource = new ol.source.Vector();
var vectorLayer = new ol.layer.Vector({
source: vectorSource
});
// Add each marker individually
markers.forEach(function (feature) {
vectorSource.addFeature(feature);
});
也许您可以应用类似的解决方案,但使用折线而不是点。
推荐阅读
- jquery - 从 Ajax Django 请求中的表单获取数据的值
- c++ - 这是对关联的合法使用吗?
- django - 如何在与 Django 项目的其余部分不同的域上提供 Django 应用程序
- ruby - 为什么 ruby 类中不允许私有类方法?
- vue.js - 如何在 vue 3 中对用户进行身份验证?
- c++ - 将文本打印到屏幕中间
- c# - 如何确定 CancellationTokenSource 范围?
- testing - Pytest BDD - 选择存根或实时 API 调用
- c - 在 C 中使用内存池(嵌入式系统)
- azure - 通过 Powershell 检查 Docker 容器是否在 Azure VM 上运行