OpenLayers GetFeatureInfo请求未被触发

时间:2014-06-28 18:27:47

标签: javascript openlayers geoserver

我正在使用Google Maps API和OpenLayers JS库(v2.13)创建一个包含地图的小网页。地图的基础层是谷歌街道地图,工作正常,我可以在地图上平移,放大等。

我在地图中添加了许多图层,这些图层来自托管在我不拥有或无法访问的远程服务器上的Web制图服务(我的意思是代码)。这也很好,这些图层很好地覆盖在谷歌地图上。

问题是,当我点击地图上的图层要素时,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中的infoControls被称为“/ geoserver / wms”,我的服务器上也没有运行Web地图服务器。我只是将GetFeatureInfo请求转发给运行实际地理服务器的远程服务器。否则,同源策略将启动并拒绝GetFeatureInfo请求。

但没有任何反应,我的“/ geoserver / wms”端点永远不会被调用。难道我做错了什么?此外,这不是我的主要问题,但为什么我能够在创建图层时成功地为OpenLayers提供远程服务器URL(同源策略不应用 - 虽然地图仍然正常,但GET图像请求远程服务器成功)。

还有一点需要注意的是,当我用infoControls替换远程服务器url中的本地url路径时,单击该映射会在调试控制台中触发同源策略错误。

1 个答案:

答案 0 :(得分:0)

我找到了一些针对这个问题的不同潜在解决方案,但是其他人都没有,但他们都没有为我工作。最后,唯一有效的是:

  • 图层创建构造函数中使用的URL(在OpenLayers.Layer.WMS必须与用于GetFeatureInfo构造函数的URL相同(在OpenLayers.Control.WMSGetFeatureInfo)< / LI>

否则,地图图层将起作用,但GetFeatureInfo请求将失败。我不知道域名是否需要相同或完整的URL。

我对此并不特别高兴。这意味着我必须在我的服务器上创建一个充当代理的端点,并将GetMap请求路由到实际的远程地理服务器。我以前不需要这样做(为什么不 - 同源策略??)现在它会增加地图中出现的层的延迟(更不用说我的服务器受到GetMap请求的打击)。

这似乎是OpenLayers的一个问题(但我不确定)。如果有人知道解决方案,我会对听到解决方案非常感兴趣。