Как выбрать элемент на слое WMS или Vector
У меня есть векторный слой, настроенный на слое WMS, на котором мне нужно выбрать объекты и выделить их на карте не нажатием на карту, а нажатием кнопки или чего-то внешнего по отношению к карте. Вот код:
regioni = new OpenLayers.Layer.WMS(
"regioni",
"http://localhost:8080/geoserver/mmasgis/wms",
{layers: 'mmasgis:reg2011_g', format: 'image/gif'}
);
select = new OpenLayers.Layer.Vector("Selection", {styleMap:
new OpenLayers.Style(OpenLayers.Feature.Vector.style["select"])
});
map.addLayers([regioni, select]);
selectionControl = new OpenLayers.Control.GetFeature({
protocol: OpenLayers.Protocol.WFS.fromWMSLayer(regioni),
box: true,
hover: true,
multipleKey: "shiftKey",
toggleKey: "ctrlKey"
});
selectionControl.events.register("featureselected", this, function(e) {
select.addFeatures([e.feature]);
});
selectionControl.events.register("featureunselected", this, function(e) {
select.removeFeatures([e.feature]);
});
map.addControl(selectionControl);
selectionControl.activate();
С помощью этого кода я могу выбрать объекты, нажав на карту без проблем, но мне нужно выбрать объекты, нажав на что-то внешнее по отношению к моей карте. Основная проблема заключается в том, что я должен пройти OpenLayers.Feature
объект для метода selectionControl.addFeatures, но у меня нет этого объекта, но только fid
или некоторая информация, содержащаяся на уровне WMS.
Я работаю с Geoserver & Openlayers на tomcat7. Есть идеи?
1 ответ
Я пытался сделать то же самое, и я не мог этого сделать. Я не уверен, что ваш selectionControl имеет метод / функцию addFeatures. На самом деле у него нет никаких методов:
Я думаю, что элемент управления GetFeature - это черный ящик, и мы не можем добавлять новые выбранные функции программно. Вы можете изменить исходный код, если хотите.
Я собираюсь сделать это следующим образом: - перехватить событие onclick - получить lon / lat от мыши x и y - использовать функцию GetFeature WMS, чтобы получить функции из GeoServer - добавить их в слой выбора
Я еще не закончил. Пример кода для получения функции по идентификатору из WMS:
function preSelect(fID) {
var processResponse = function (resp) {
console.log(resp);
console.log(resp.error);
var data = resp.responseText;
var geojson_format = new OpenLayers.Format.GeoJSON();
var features = geojson_format.read(data,null,null);
select.addFeatures(features);
};
OpenLayers.Request.issue({
url: 'http://localhost:8080/geoserver/wfs',
method: 'GET',
params: {
service: 'WFS',
version: '2.0.0',
request: 'GetFeature',
typeName: 'ESD:LLSOA',
outputFormat:'json',
featureID: fID,
},
callback: processResponse
});
}
Я думаю, что вы можете заменить featureID на параметр bbox. Кроме того, WMS имеет аналогичную функцию GetFeatureInfo, которая принимает x и y. В обоих случаях координаты должны быть в той же проекции, что и ваш базовый слой.
Также у меня были проблемы с точностью метода WFS GetFeature. Та же проблема объясняется здесь: