Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
让openlayers从visible=false的层加载数据_Openlayers_Openlayers 5 - Fatal编程技术网

让openlayers从visible=false的层加载数据

让openlayers从visible=false的层加载数据,openlayers,openlayers-5,Openlayers,Openlayers 5,我有一个带有矢量源的矢量层,它的加载成本非常高,但渲染成本不高。我在GUI中有一个按钮,用于切换图层的可见性。 问题是,第一次将可见性设置为true时,加载需要很长时间。 我希望在加载其余数据(从所有可见层)的同时,提前加载层的数据,以便在可见性设置为true时,只需渲染它。 这在Openlayers中可能吗 我尝试了各种方法,比如在“precompose”中将可见性设置为true,然后在发送HTTP请求后将其设置为false(使用自定义的“loadend”事件),但我无法使其正常工作;我再也无

我有一个带有矢量源的矢量层,它的加载成本非常高,但渲染成本不高。我在GUI中有一个按钮,用于切换图层的可见性。 问题是,第一次将可见性设置为true时,加载需要很长时间。 我希望在加载其余数据(从所有可见层)的同时,提前加载层的数据,以便在可见性设置为true时,只需渲染它。 这在Openlayers中可能吗

我尝试了各种方法,比如在“precompose”中将可见性设置为true,然后在发送HTTP请求后将其设置为false(使用自定义的“loadend”事件),但我无法使其正常工作;我再也无法关闭图层了。我想这是因为在第一次加载之后,它缓存了数据,所以我的自定义“loadend”事件不再触发。 无论如何,我赞成一个更优雅的解决方案

编辑:
我不能像s的回答那样提前发送请求,因为没有请求。请求取决于范围和投影,因此在矢量源的
加载程序
功能中发出。

如果数据不改变,可以在创建图层时预加载

这是一个没有预加载的示例。打开地图5秒后,三个数据层可见。只有这样,才能从矢量源中指定的URL请求数据,然后才能看到数据以不同的速度加载,因为其中一个层必须下载40mb KML文件

var raster\u OSM=新建ol.layer.Tile({
来源:new ol.source.OSM()
});
var resolutions=ol.tilegrid.createXYZ().getResolutions();
var style\u Cnty=新的ol.style.style({
笔划:新的ol风格笔划({
颜色:“#3399CC”,
宽度:1.25
})
});
var vector\u Cnty=新的ol.layer.vector({
来源:新ol.source.Vector({
网址:'https://raw.githubusercontent.com/tanhe03/kml/master/gz_2010_us_050_00_500k.kml',
格式:new ol.format.KML({extractStyles:false})
}),
maxResolution:决议[3],
样式:功能(特征、分辨率){
变量样式=[style_Cnty];
如果(决议<决议[8]){
var geom=feature.getGeometry();
推(
新ol风格({
几何图形:geom.getInteriorPoints?geom.getInteriorPoints():geom.getInteriorPoint(),
文本:新的ol.style.text({
字体:“粗体16px无衬线”,
填充:新的ol.style.fill({
颜色:“#3399CC”
}),
背景填充:新的ol.style.Fill({
颜色:“rgba(255255,0.5)”
}),                            
text:feature.get('Name')
})
})
)
}
返回样式;
},
可见:假
});
var vector_State=新ol.layer.vector({
来源:新ol.source.Vector({
网址:'https://raw.githubusercontent.com/tanhe03/kml/master/gz_2010_us_040_00_500k.kml',
格式:new ol.format.KML({extractStyles:false})
}),
maxResolution:决议[1],
风格:新的ol风格({
笔划:新的ol风格笔划({
颜色:'紫色',
宽度:1.25
}) 
}),
可见:假
});
var vector_US=新的ol.layer.vector({
来源:新ol.source.Vector({
网址:'https://raw.githubusercontent.com/tanhe03/kml/master/gz_2010_us_outline_500k.kml',
格式:new ol.format.KML({extractStyles:false})
}),
风格:新的ol风格({
笔划:新的ol风格笔划({
颜色:“#3399CC”,
宽度:1.25
}) 
}),
可见:假
});
var map=新ol.map({
图层:[光栅、矢量、矢量状态、矢量状态],
目标:“地图”,
视图:新ol.view({
中心:ol.proj.transform([-96,38],'EPSG:4326','EPSG:3857'),
缩放:4
})
});
setTimeout(函数(){
向量_Cnty.setVisible(真);
向量_State.setVisible(真);
向量_US.setVisible(真);
}, 5000);
html,body,.map{
保证金:0;
填充:0;
宽度:100%;
身高:100%;
}

如果数据不会更改,可以在创建图层时预加载数据

这是一个没有预加载的示例。打开地图5秒后,三个数据层可见。只有这样,才能从矢量源中指定的URL请求数据,然后才能看到数据以不同的速度加载,因为其中一个层必须下载40mb KML文件

var raster\u OSM=新建ol.layer.Tile({
来源:new ol.source.OSM()
});
var resolutions=ol.tilegrid.createXYZ().getResolutions();
var style\u Cnty=新的ol.style.style({
笔划:新的ol风格笔划({
颜色:“#3399CC”,
宽度:1.25
})
});
var vector\u Cnty=新的ol.layer.vector({
来源:新ol.source.Vector({
网址:'https://raw.githubusercontent.com/tanhe03/kml/master/gz_2010_us_050_00_500k.kml',
格式:new ol.format.KML({extractStyles:false})
}),
maxResolution:决议[3],
样式:功能(特征、分辨率){
变量样式=[style_Cnty];
如果(决议<决议[8]){
var geom=feature.getGeometry();
推(
新ol风格({
几何图形:geom.getInteriorPoints?geom.getInteriorPoints():geom.getInteriorPoint(),
文本:新的ol.style.text({
字体:“粗体16px无衬线”,
填充:新的ol.style.fill({
颜色:“#3399CC”
}),
背景填充:新的ol.style.Fill({
颜色:'rgba(255255