Javascript 未触发OpenLayers GetFeatureInfo请求

Javascript 未触发OpenLayers GetFeatureInfo请求,javascript,openlayers,geoserver,Javascript,Openlayers,Geoserver,我正在使用Google Maps API和OpenLayers JS library v2.13创建一个包含地图的小网页。地图的底层是谷歌街道地图,效果很好,我可以在地图周围平移,放大等等 我在地图上添加了许多层,这些层来自于托管在远程服务器上的Web地图服务,我的意思是,我不拥有或无权访问这些代码。这也很好,图层覆盖在谷歌地图上也很好 问题是,当我单击地图上的图层要素时,WMSGetFeatureInfo控件不起作用。不会向指定的URL发送请求,不会触发回调函数,不会发生任何事情。下面是一些代

我正在使用Google Maps API和OpenLayers JS library 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();
我应该解释一下,即使infoControls中的url名为/geoserver/wms,我的服务器上也没有运行web映射服务器。我只是将GetFeatureInfo请求转发到运行实际geoserver的远程服务器。否则,同源策略将生效,GetFeatureInfo请求将被拒绝

但什么也没发生,my/geoserver/wms端点永远不会被调用。我做错什么了吗?此外,这不是我的主要问题,但为什么我能够在创建层时成功地为OpenLayers提供远程服务器URL(如果不应用同源策略)——虽然映射仍然可以正常工作,但对远程服务器的GET image请求是成功的


另外值得注意的是,当我用远程服务器url替换infoControls中的本地url路径时,单击映射会在调试控制台中触发同源策略错误

对于这个问题,我找到了一些其他人都有的可能的解决方案,但没有一个对我有效。最后,唯一起作用的是:

OpenLayers.layer.WMS中的层创建构造函数中使用的URL必须与OpenLayers.Control.WMSGetFeatureInfo中的GetFeatureInfo构造函数中使用的URL相同 否则,贴图层将工作,但GetFeatureInfo请求将失败。我不知道是只是域需要相同,还是完整的URL

我对此不是特别高兴。这意味着我必须在服务器上创建一个充当代理的端点,并将GetMap请求路由到实际的远程geoserver。我以前不需要这样做,为什么不-同一原产地政策??现在它提高了地图中显示的层的延迟,更不用说我的服务器受到GetMap请求的影响了


这似乎是OpenLayers的一个问题,但我不确定。如果有人知道某个解决方案,我很想听听。

更新了您的问题,将infoControls包括在内。单击。激活;删除了我的答案。如果您可以使用公开可用的服务器(如OL示例中的服务器)将JSFIDLE组合在一起,那么调试就会更容易。您知道远程服务器层是否支持WMS GetFeatureInfo请求吗?这是必需的,可以使用WMS GetCapabilities请求进行验证。如果您有地址addrequest=GetCapabilities,则可以在浏览器窗口中查看XML。这将列出图层以及它们是否支持GetFeatureInfo。