Openlayers 3 OpenLayers3更改图层源URL(或替换从其他URL加载的功能)

Openlayers 3 OpenLayers3更改图层源URL(或替换从其他URL加载的功能),openlayers-3,Openlayers 3,我有一张带有矢量层的地图,其中包含来自GeoJSON源的特征: var map = new ol.Map({ layers: [new ol.layer.Tile({ source: new ol.source.OSM() }), new ol.layer.Vector({ source: new ol.source.Vector({

我有一张带有矢量层的地图,其中包含来自GeoJSON源的特征:

var map = new ol.Map({
    layers: [new ol.layer.Tile({
                 source: new ol.source.OSM()
             }),
             new ol.layer.Vector({
                 source: new ol.source.Vector({
                     url: 'http://example.com:5000/geo/data/zones/1',
                     format: new ol.format.GeoJSON()
                 }),
             })],
    renderer: 'canvas',
    target: 'map',
    view: new ol.View({
        center: [737514.438475665, 5864533.629390752],
        zoom: 13
    })
});
我有多个返回s GeoJSON字符串的URL:

  • http://example.com:5000/geo/data/zones/1
  • http://example.com:5000/geo/data/zones/2
  • http://example.com:5000/geo/data/zones/n
我需要能够切换图层源的URL(或从其他URL获取和显示功能)。

我已尝试在ol.Layer.Vector实例上查找“url”属性:

l=m.getLayers().getArray()[1]
l.getProperties()
s = l.getSource()
s.getProperties()
在ol.source.Vector实例上:

l=m.getLayers().getArray()[1]
l.getProperties()
s = l.getSource()
s.getProperties()
但是我还没有找到关于“url”属性的任何信息


你能提供一种方法吗

  • 是否可以简单地更新源URL(并自动刷新图层功能)
  • 我是否应该删除现有功能,使用自己的逻辑加载新功能并添加加载的功能
  • 我要删除整个层,重新创建它,然后重新添加它吗
  • 是否可以简单地更新源URL(并自动刷新图层功能)
您可以创建一个新的源,并使用在目标层上设置它

如果两个图层都可见,地图将自动刷新特征

  • 我是否应该删除现有功能,使用自己的逻辑加载新功能并添加加载的功能
可以使用以下方法在矢量图层上添加或删除要素:

另见:和

  • 我要删除整个层,重新创建它,然后重新添加它吗
你可以用和来做

最终答案

上面列出的所有选项都将切换图层的URL。每个选项都会触发自己的一组事件,并使用不同的参数和对象。根据我个人的理解,我建议:

  • 如果加载的新图层具有与旧图层相同的特性,但具有新数据,请使用选项1

  • 如果您对矢量图层上的某些特征几乎没有更改,请使用选项2

  • 如果您有一个全新的图层,其特性与上一个图层不同,请使用选项3


a怎么样?我的回答对您有帮助吗,还是您需要进一步解释?我不确定,但我可能对答案有点含糊不清。我喜欢你的答案。我还担心每个选项可能出现的性能/泄漏,因为我正在向量层上绘制5000-20000多个特征。然而,我相信ol3团队非常关心垃圾收集,我建议首先让它工作,然后在需要时进行优化。在过去,我在性能方面遇到了巨大的问题(OpenLayers),我使用了第三个选项(目前),尽管我认为该层具有相同的属性。我写了一篇小祈祷,作为评论,要求正确销毁功能。
// m is your map variable
v = new ol.layer.Vector(cfg);
m.addLayer(v);
m.removeLayer(v);