如何借助PopupInfo示例在OpenLayers 3中实现地图点击获取要素信息?
基于OpenLayers 3实现点击地图获取要素信息(参考PopupInfo示例)
嘿,我看你已经搭好了基础的地图图层框架,不过代码还不完整,我帮你补全并整理成可运行的版本,完美实现点击WMS图层获取要素信息的弹窗功能:
完整可运行代码
// 加载OpenStreetMap底图层 var mmi = new ol.layer.Tile({ source: new ol.source.OSM() }); // 加载GeoServer发布的WMS图层(cite:abc) var one = new ol.layer.Image({ source: new ol.source.ImageWMS({ url: 'http://localhost:8080/geoserver/wms', params: {'LAYERS': 'cite:abc'}, ratio: 1, serverType: 'geoserver' }) }); // 初始化地图实例 var map = new ol.Map({ layers: [mmi, one], target: 'map', view: new ol.View({ center: ol.proj.fromLonLat([116.397, 39.908]), // 替换成你需要的中心点经纬度 zoom: 10 // 初始缩放级别,可按需调整 }) }); // 创建弹窗Overlay(用于展示要素信息) var popup = new ol.Overlay({ element: document.getElementById('popup'), autoPan: true, // 自动平移地图让弹窗可见 autoPanAnimation: { duration: 250 // 平移动画时长 } }); map.addOverlay(popup); // 绑定地图点击事件,触发要素查询 map.on('singleclick', function(evt) { var coordinate = evt.coordinate; var viewResolution = map.getView().getResolution(); // 构造WMS GetFeatureInfo请求URL var url = one.getSource().getGetFeatureInfoUrl( coordinate, viewResolution, 'EPSG:3857', {'INFO_FORMAT': 'application/json'} // 指定返回格式为JSON ); if (url) { // 发送请求获取要素详情 fetch(url) .then(response => response.json()) .then(data => { var content = '<h3>要素详情</h3>'; if (data.features.length > 0) { // 遍历要素属性,生成展示内容 var properties = data.features[0].properties; for (var key in properties) { content += `<p><strong>${key}:</strong> ${properties[key]}</p>`; } } else { content += '<p>未查询到任何要素信息</p>'; } // 更新弹窗内容并定位到点击位置 var element = popup.getElement(); element.innerHTML = content; popup.setPosition(coordinate); }); } });
配套HTML结构
你需要在页面中添加地图容器和弹窗的DOM元素:
<div id="map" style="width: 100%; height: 600px;"></div> <div id="popup" class="ol-popup"> <a href="#" id="popup-closer" class="ol-popup-closer"></a> <div id="popup-content"></div> </div>
关键细节提醒
- 你之前代码里给
ImageWMS配置format: new ol.format.GeoJSON()是错误的哦!ImageWMS的format参数是指定返回的图片格式(比如image/png),GetFeatureInfo的返回格式我们单独在请求参数INFO_FORMAT里设置就好。 - 给弹窗加个CSS样式会更美观,参考如下:
.ol-popup { position: absolute; background-color: white; box-shadow: 0 1px 4px rgba(0,0,0,0.2); padding: 15px; border-radius: 10px; border: 1px solid #cccccc; bottom: 12px; left: -50px; min-width: 280px; } .ol-popup:after, .ol-popup:before { top: 100%; border: solid transparent; content: " "; height: 0; width: 0; position: absolute; pointer-events: none; } .ol-popup:after { border-top-color: white; border-width: 10px; left: 48px; margin-left: -10px; } .ol-popup-closer { text-decoration: none; position: absolute; top: 2px; right: 8px; } .ol-popup-closer:after { content: "✖"; }
内容的提问来源于stack exchange,提问作者vaibhav Dhiman
相关产品推荐
相关产品推荐

