【问题标题】:Display Markers, Popups with OpenLayer3使用 OpenLayer3 显示标记、弹出窗口
【发布时间】:2016-01-11 21:10:14
【问题描述】:

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

是否有更多使用 javascript 或 jquery 编码标记/弹出窗口的示例,最好是 this 或类似示例。

这个想法是标记一座建筑物,通过点击标记它会弹出一些建筑物的信息,此外,我想将城市的重要地点连接到这座建筑物(图书馆、餐馆、公共汽车站等) .我希望有人可以解释我如何开始构建它,并且我不想为此使用 bootstrap3(我见过 overlay 示例),而是想要纯 html5、css3、javascript/jquery)

【问题讨论】:

    标签: javascript jquery html openstreetmap openlayers-3


    【解决方案1】:

    您可以使用纯 HTML、CSS 和 JavaScript 创建弹出窗口,如 popup example 所示。你想要的一个完整的例子在这里: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);
    

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

    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;
      }
    });
    

    【讨论】:

    • 太好了,太完美了,谢谢你的例子,从你的例子中学到了很多。
    • 非常感谢你的好例子!工作得很好,尤其是在小提琴的帮助下。乌韦
    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 2022-12-14
    • 2021-02-03
    • 1970-01-01
    相关资源
    最近更新 更多