我正在使用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路径时,单击该映射会在调试控制台中触发同源策略错误。
答案 0 :(得分:0)
我找到了一些针对这个问题的不同潜在解决方案,但是其他人都没有,但他们都没有为我工作。最后,唯一有效的是:
OpenLayers.Layer.WMS
)必须与用于GetFeatureInfo构造函数的URL相同(在OpenLayers.Control.WMSGetFeatureInfo
)< / LI>
否则,地图图层将起作用,但GetFeatureInfo请求将失败。我不知道域名是否需要相同或完整的URL。
我对此并不特别高兴。这意味着我必须在我的服务器上创建一个充当代理的端点,并将GetMap请求路由到实际的远程地理服务器。我以前不需要这样做(为什么不 - 同源策略??)现在它会增加地图中出现的层的延迟(更不用说我的服务器受到GetMap请求的打击)。
这似乎是OpenLayers的一个问题(但我不确定)。如果有人知道解决方案,我会对听到解决方案非常感兴趣。