如何修改OpenLayers中标记(Feature)的外观样式?
把OpenLayers Feature改成Google Maps风格标记的方法
嘿,这事儿好办!要把你当前代码里默认的蓝色圆形标记换成类似Google Maps的图标样式,咱们只需要用OpenLayers的ol.style.Icon来定义自定义样式就行,下面给你一步步调整代码:
核心思路
OpenLayers的矢量Feature默认用圆形样式,咱们要替换成图标样式,只需要创建一个包含ol.style.Icon的ol.style.Style对象,然后把它应用到矢量图层上就行。
修改后的完整代码
我已经把你的代码调整好了,重点修改了样式定义和矢量图层的配置部分:
<!doctype html> <html> <head> <title>OpenLayers Overlays</title> <link rel="stylesheet" href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" type="text/css"> <script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script> <style type='text/css'> .ol-popup { font-family: 'Lucida Grande', Verdana, Geneva, Lucida, Arial, Helvetica, sans-serif !important; font-size: 12px; position: absolute; background-color: white; -webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2)); filter: drop-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: 100px; } .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:before { border-top-color: #cccccc; border-width: 11px; left: 48px; margin-left: -11px; } .ol-popup-closer { text-decoration: none; position: absolute; top: 2px; right: 8px; } .ol-popup-closer:after { content: "✖"; color: #c3c3c3; } </style> </head> <body> <div id="map" class="map"></div> <div id="popup" class="ol-popup"> <a href="#" id="popup-closer" class="ol-popup-closer"></a> <div id="popup-content"></div> </div> <div id="overlay" style="background-color: white; border-radius: 10px; border: 1px solid black; padding: 5px 10px;"> <script> var marker_data = [ {name: 'Tower Bridge', lat:51.5053591, lon:-0.0829981}, {name: 'Dover Castle', lat:51.120034, lon:1.2712337}, {name: 'Washington Monument', lat:38.8894541, lon:-77.0373655}, {name: 'Eiffel Tower', lat:48.8583701, lon:2.2922873}, {name: 'Statue of Liberty', lat:40.6892494, lon:-74.0466944} ]; var layer = new ol.layer.Tile({ source: new ol.source.OSM() }); var center = ol.proj.transform([-1.812, 52.443], 'EPSG:4326', 'EPSG:3857'); var popup = document.getElementById('popup-content'); var container = document.getElementById('popup'); var closer = document.getElementById('popup-closer'); var overlay = new ol.Overlay({ element: container, autoPan: true, autoPanAnimation: { duration: 250 } }); var view = new ol.View({ center: center, zoom: 6 }); var map = new ol.Map({ target: 'map', layers: [layer], view: view }); map.addOverlay(overlay); // --- 这里是修改的核心部分 --- // 定义Google Maps风格的图标样式 var googleStyleMarker = new ol.style.Style({ image: new ol.style.Icon({ anchor: [0.5, 1], // 锚点设置为图标底部中心,和Google标记对齐方式一致 scale: 0.8, // 可以调整图标大小 src: 'https://openlayers.org/en/latest/examples/data/icon.png' // 替换成你喜欢的标记图标URL }) }); // --- 修改结束 --- var vsource = new ol.source.Vector(); marker_data.forEach(function(data,index){ var marker = new ol.Feature({ type: 'icon', name:index, geometry: new ol.geom.Point(ol.proj.fromLonLat([data.lon, data.lat])) }); vsource.addFeature(marker); }); var animating = false; // 给矢量图层应用自定义图标样式 var vectorLayer = new ol.layer.Vector({ source: vsource, style: googleStyleMarker }); map.on('singleclick', function (event) { if (map.hasFeatureAtPixel(event.pixel) === true) { console.log(event); var coordinate = event.coordinate; var f = vsource.getClosestFeatureToCoordinate(coordinate); console.log(f); var fcoords = f.getGeometry().getCoordinates(); var index = f.get('name'); var marker_info = marker_data[index]; popup.innerHTML = '<b>'+marker_info['name']+'</b>'; overlay.setPosition(fcoords); } else { overlay.setPosition(undefined); closer.blur(); } }); map.addLayer(vectorLayer); </script> </body> </html>
关键细节说明
anchor: [0.5, 1]:这个参数是设置图标的锚点,[0.5,1]代表图标的水平中心、垂直底部和Feature的坐标点重合,这和Google Maps标记的对齐逻辑完全一致,标记的尖底部会精准落在坐标位置上。src:你可以把这个URL换成自己的红色标记图片,只要是公开可访问的图片链接就行,比如找一个和Google Maps标记一模一样的PNG图标。scale:用来调整图标的大小,根据你的需求缩放即可。
内容的提问来源于stack exchange,提问作者Jason S
相关产品推荐
相关产品推荐

