Как выбрать элемент на слое 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. На самом деле у него нет никаких методов:

http://dev.openlayers.org/releases/OpenLayers-2.12/doc/apidocs/files/OpenLayers/Control/GetFeature-js.html

Я думаю, что элемент управления 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. Та же проблема объясняется здесь:

http://osgeo-org.1560.x6.nabble.com/Problems-with-WFS-GetFeature-Bounding-Box-low-accuracy-td3799986.html

Другие вопросы по тегам