使用 OpenLayer3 显示标记、弹出窗口

2024-02-28

我试图了解如何使用 openlayers3 在 osm 地图上显示标记/弹出窗口,我在 ol3 网页上的示例中找到了示例,但是...

是否有更多使用 javascript 或 jquery 编码标记/弹出窗口的示例,最好是类似的this http://leafletjs.com/examples/custom-icons.html或类似的例子。

这个想法是标记一座建筑物,通过单击标记,它将弹出该建筑物的一些信息,此外,我想将城市的重要地点连接到这座建筑物(图书馆、餐馆、公交车站等)。我希望有人能解释我如何开始构建这个,并且我不想为此使用 bootstrap3 (我已经看到overlay http://openlayers.org/en/v3.12.1/examples/overlay.html例如),而不是想要纯 html5、css3、javascript/jquery)


您可以使用纯 HTML、CSS 和 JavaScript 创建弹出窗口,如下所示弹出示例 http://openlayers.org/en/v3.12.1/examples/popup.html。您想要的完整示例如下:http://jsfiddle.net/ahocevar/z86zc9fz/1/ http://jsfiddle.net/ahocevar/z86zc9fz/1/.

弹出窗口的 HTML 很简单:

<div id="popup" class="ol-popup">
  <a href="#" id="popup-closer" class="ol-popup-closer"></a>
  <div id="popup-content"></div>
</div>

CSS 涉及更多一些:

.ol-popup {
  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: 80px;
}
.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: "✖";
}

要制作弹出窗口,请使用ol.Overlay:

var container = document.getElementById('popup');
var overlay = new ol.Overlay({
  element: container,
  autoPan: true,
  autoPanAnimation: {
    duration: 250
  }
});
map.addOverlay(overlay);

var closer = document.getElementById('popup-closer');
closer.onclick = function() {
  overlay.setPosition(undefined);
  closer.blur();
  return false;
};

要使功能可点击,请使用

var content = document.getElementById('popup-content');
map.on('singleclick', function(evt) {
  var name = map.forEachFeatureAtPixel(evt.pixel, function(feature) {
    return feature.get('name');
  });
  var coordinate = evt.coordinate;
  content.innerHTML = name;
  overlay.setPosition(coordinate);
});

要获得当指针位于要素上方时的视觉反馈,请使用

map.on('pointermove', function(evt) {
  map.getTargetElement().style.cursor = map.hasFeatureAtPixel(evt.pixel) ? 'pointer' : '';
});

特征(即标记)来自矢量图层:

var markers = new ol.layer.Vector({
  source: new ol.source.Vector({
    features: [
      new ol.Feature({
        geometry: new ol.geom.Point(ol.proj.fromLonLat([16.37, 48.2])),
        name: 'Vienna',
        type: 'City'
      }),
      new ol.Feature({
        geometry: new ol.geom.Point(ol.proj.fromLonLat([-0.13, 51.51])),
        name: 'London',
        type: 'City'
      })
    ]
  }),
  style: new ol.style.Style({
    image: new ol.style.Icon({
      src: '//openlayers.org/en/v3.12.1/examples/data/icon.png',
      anchor: [0.5, 1]
    })
  })
});
map.addLayer(markers);

上面的代码片段使用固定样式,即所有类型的功能使用相同的图标。如果你有不同类型的特征,你可以定义一个样式函数而不是固定的样式:

var cityStyle = new ol.style.Style({
  image: new ol.style.Icon({
    src: '//openlayers.org/en/v3.12.1/examples/data/icon.png',
    anchor: [0.5, 1]
  })
});
var otherStyle = new ol.style.Style({
  image: new ol.style.Icon({
    src: '//openlayers.org/en/v3.12.1/examples/data/Butterfly.png'
  })
});
var markers = new ol.layer.Vector({
  // ...
  style: function(feature, resolution) {
    if (feature.get('type') == 'City' {
      return cityStyle;
    }
    return otherStyle;
  }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OpenLayer3 显示标记、弹出窗口 的相关文章