我正面临着快速加载图层的性能问题。我正在使用OpenLayers 5.3,GeoServer 2.10和Oracle 12数据库。我有一些(3-4)WMS图层用于信息和背景,以及一个可以编辑的WFS图层。最后一条折线超过30000条,加载速度慢。
所以我一直在寻找一些解决方案,我想要一些建议:
最后,我认为更好的方法是使用简单的WMS图层,并且在我必须编辑WFS图层时,仅在WFS图层中的要素中切换所需的折线。但是,我必须过滤WMS层的数据。我发现在参数中可以使用CQL过滤器。它有效,但由于GET请求,过滤器的大小有限。所以我找到了在POST上更改请求的示例。它再次起作用,但这次我注意到,根据我的WHERE子句“ID in(1,2,3,4 ... 999,1000,1001 ...)”中的项目数量,图层生成变得非常慢。 。
这就是我现在的位置,我期待着:对于我的“问题”,最好的方法是什么?
现在,我想通过在层中添加更多列来构建过滤器来简化CQL过滤器,而不是简单的“ID in(...)”,并以这种方式继续:用WMS替换我的WFS层并添加一些自定义代码以我想要的方式管理它。
如果有人对我的情况有更好的建议,我全都耳朵:-)
最好的祝福。
我以前做的是显示WMS图块,当用户点击“线”时,将相关信息检索到浏览器,将检索到的几何图形绘制为叠加层,并编辑所需的任何内容。
唯一的缺点是,当你悬停鼠标时,你不能改变-all-线的颜色,但从用户的角度来看,它可以非常流畅和快速。
除此之外,Geoserver的WMS渲染选项比OpenLayers内置的功能强大得多。
更新底层WMS之间当然会有延迟,因为您将向服务器发送更新,并且只有在您获得确认后,才能开始刷新WMS层(否则您的更改可能尚未处理,和刷新只会给你旧的状态)。因此,在发送更新后,您可能需要考虑向用户指示可视更新处于待处理状态。
我认为看看如何实例化地图会很有用。我有一个带有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);
});
也许您可以应用类似的解决方案,但使用折线而不是点。