Запросы OpenLayers GetFeatureInfo не запускаются

#javascript #openlayers #geoserver

#javascript #openlayers #геосервер

Вопрос:

Я создаю небольшую веб-страницу, содержащую карту, используя API Карт Google и библиотеку OpenLayers JS (версия 2.13). Базовым слоем карты являются Карты улиц Google, и это работает нормально, я могу перемещаться по карте, увеличивать масштаб и т. Д.

Я добавляю на карту несколько слоев, которые поступают из службы веб-картографии, размещенной на удаленном сервере, которым я не владею и к которому у меня нет доступа (я имею в виду код). И это тоже отлично работает, слои накладываются на карту Google просто отлично.

Проблема в том, что когда я нажимаю на объекты слоя на карте, элементы WMSGetFeatureInfo управления не работают. На указанный URL-адрес не отправляется запрос, функция обратного вызова не запускается, вообще ничего не происходит. Вот некоторый код:

 var remoteGeoServer = "https://www.remotegeoserver.com/geoserver/wms";
var options = {
    controls: [],
    maxExtent: new OpenLayers.Bounds(420000, 485000, 770000, 985000),
    projection: "EPSG:2157",
    units: 'm',
    scales: [5000000, 2500000, 1250000, 600000, 400000, 200000, 100000, 50000, 25000]
};
var map = new OpenLayers.Map('map-container', options);
// ... define styles, rules etc.

var overlayLayer = new OpenLayers.Layer.WMS("Overlayed Layer", remoteGeoServer, {<some_options>}); // other layers are created too...

var infoControls = {
    click: new OpenLayers.Control.WMSGetFeatureInfo({
        url: "/geoserver/wms",
        title: 'Identify features by clicking',
        layers: [overlayedLayer],
        infoFormat: 'text/plain',
        queryVisible: true
    })
};
var baseLayer = new OpenLayers.Layer.Google("Google Streets", {numZoomLevels: 20});
map.addLayers( [baseLayer, overlayLayer] );
map.setBaseLayer( baseLayer );

for (var i in infoControls) {
    infoControls[i].events.register("getfeatureinfo", this, showInfo);
    map.addControl(infoControls[i]);
}

// ... and later
function showInfo(evt) {
    console.log("Hurray!");
}

infoControls.click.activate();
 

Я должен объяснить, что, несмотря url на то, что in infoControls называется «/geoserver/wms», на моем сервере нет сервера веб-сопоставления. Я просто отправляю запрос GetFeatureInfo на удаленный сервер, на котором работает фактический геосервер. В противном случае срабатывает политика того же источника, и запросы GetFeatureInfo отклоняются.

Но ничего не происходит, моя конечная точка «/ geoserver / wms» никогда не вызывается. Я делаю что-то не так? Кроме того, и это не мой главный вопрос, но почему я могу успешно предоставить OpenLayers URL-адрес удаленного сервера при создании слоев (если политика того же источника не применяется — карта по-прежнему работает нормально, и запросы на получение изображений на удаленный сервер выполняются успешно).

Еще стоит отметить, что когда я заменяю локальный URL-адрес URL-адресом infoControls удаленного сервера, щелчок по карте вызывает ошибку политики того же происхождения в консоли отладки.

Комментарии:

1. Обновил ваш вопрос, включив infoControls.click.activate(); и удалил мой ответ. Если бы вы могли собрать jsfiddle вместе, используя общедоступный сервер, подобный тому, который приведен в предыдущем примере, openlayers.org/dev/examples/getfeatureinfo-control.html , это будет легче отлаживать.

2. Вы знаете, поддерживают ли уровни удаленного сервера запросы WMS GetFeatureInfo? это обязательно и может быть проверено с помощью запроса WMS GetCapabilities. Вы можете просмотреть XML в окне браузера, если у вас есть адрес, добавьте REQUEST=»GetCapabilities». Здесь будут перечислены слои и указано, поддерживают ли они GetFeatureInfo.

Ответ №1:

Я нашел несколько различных потенциальных решений этой проблемы, с которыми сталкивались другие люди, но ни одно из них не сработало для меня. В конце концов, единственное, что сработало, это:

  • URL-адрес, используемый в конструкторе (конструкторах) создания слоя (in OpenLayers.Layer.WMS ), ДОЛЖЕН совпадать с URL-адресом, используемым для конструктора (in OpenLayers.Control.WMSGetFeatureInfo ) GetFeatureInfo

В противном случае слои карты будут работать, но запросы GetFeatureInfo завершатся ошибкой. Я не знаю, должен ли быть одинаковым только домен или полный URL.

Я не особенно доволен этим. Это означает, что я должен создать конечную точку на своем сервере, которая действует как прокси и направляет запросы GetMap на фактический удаленный геосервер. Мне не нужно было делать это раньше (почему политика не того же происхождения ??) и теперь это увеличивает задержку для слоев, отображаемых на карте (не говоря уже о том, что мой сервер забит запросами GetMap).

Похоже, это проблема с OpenLayers (но я в этом не уверен). Мне было бы очень интересно услышать о решении, если кто-нибудь знает о нем.