#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-адресом, используемым для конструктора (inOpenLayers.Control.WMSGetFeatureInfo
) GetFeatureInfo
В противном случае слои карты будут работать, но запросы GetFeatureInfo завершатся ошибкой. Я не знаю, должен ли быть одинаковым только домен или полный URL.
Я не особенно доволен этим. Это означает, что я должен создать конечную точку на своем сервере, которая действует как прокси и направляет запросы GetMap на фактический удаленный геосервер. Мне не нужно было делать это раньше (почему политика не того же происхождения ??) и теперь это увеличивает задержку для слоев, отображаемых на карте (не говоря уже о том, что мой сервер забит запросами GetMap).
Похоже, это проблема с OpenLayers (но я в этом не уверен). Мне было бы очень интересно услышать о решении, если кто-нибудь знает о нем.