我有使用OpenLayers3和边界框策略从geoserver加载到矢量图层的功能的问题 . 我试图找到如何使用边界框策略加载多个图层,但没有成功 . 我发现的唯一例子是使用一个层并使用全局函数,在我的例子中它不适用(http://acanimal.github.io/thebookofopenlayers3/chapter03_08_loading_strategies.html) . 问题是加载响应的函数没有全局定义 - 如果是这样我将不得不为每个要加载的单个层创建这样的函数,对吧?这是用于请求功能的示例URL地址:
http://192.168.1.10/geoserver/wfs?service=WFS&version=1.1.0&request=GetFeature&typename=ubutrusty:places&outputFormat=text/javascript&format_options=callback:success&srsname=EPSG:32635&bbox=161473.81383919955,4698323.564696768,234672.52335922938,4767981.6354873795,EPSG:32635
您可以看到 format_options 参数设置为 callback:success 并且我在设置正确的回调函数时遇到了困难 . 我对javascript的了解并不是那么好,所以问题对我来说并不容易 .
这就是我试图创建一个新的矢量图层的方法:
var layer = {
name: 'ubutrusty:places',
title: 'Позиции',
source: createVectorLayer(layer),
type: 'operational',
visible: true,
style: new ol.style.Style({
stroke: new ol.style.Stroke({
color: '#800000',
width: 2
})
})
}
为我想要添加到 Map 的每个图层调用此函数 - 它返回ol.source.ServerVector对象:
MyApp.prototype.createVectorLayer = function(layerData){
var vectorSource = new ol.source.ServerVector({
format: new ol.format.GeoJSON(),
loader: function(extent, resolution, projection) {
extent = ol.proj.transformExtent(extent, projection.getCode(), ol.proj.get(layerData.srcEPSG).getCode());
var url = config.proxyUrl + layerData.url + '?service=WFS&' +
'version=1.1.0&request=GetFeature&typename=' + layerData.name + '&' + 'outputFormat=text/javascript' +
'&format_options=callback:success&srsname=' + layerData.srcEPSG + '&bbox=' + extent.join(',') + ',' + layerData.srcEPSG;
$.ajax({
url: url,
dataType: 'jsonp',
success: function(data) {
this.addFeatures(this.readFeatures(data));
},
error: function (e) {
var wtf = e.status;
}
});
},
strategy: ol.loadingstrategy.bbox,
projection: layerData.srcEPSG
})
return vectorSource;
}
MyApp.map.addLayer(new ol.layer.Vector(layer);
问题是,是否可以定义一个函数来从多个层加载特征,如果是,我该怎么做呢?如果我没有指定回调函数,则使用默认值(对于geoserver,它是 parseResponse ),它也没有定义 . 如果需要更多信息,我可以提供其他参数或代码示例 .
谢谢
1 回答
在您的URL中,您已经定义了回调函数的名称 . 它是
success
,由'&format_options=callback:success&srsname='
定义 . 如果要将createVectorLayer
函数用于多个图层,则需要将其更改为'&format_options=callback:success.' + layerData.name.replace(':', '_') + '&srsName='
. 然后,您可以在全局对象文字success
中创建一个函数注册表,您可以定义一次:然后,您可以将以下代码添加到
createVectorLayer
函数中,这将为您的每个图层创建一个回调函数: