openlayers - 03 点位标注功能

14 篇文章 0 订阅
3 篇文章 0 订阅

本例实现对地图中的部分点位进行标注,点击标注可以显示基本信息,缩放后会适当对点位进行聚合

1.实现

1.将获取到的所有点位的坐标数组传入以下函数,根据数据创建点位要素(feature);
2.设置聚合参数(Cluster);
3.创建新的图层,将要素加入图层并配置相关样式;
4.提前定义好详情显示的popover弹窗,创建覆盖物(Overlay),将popover弹窗设置到覆盖物内;
5.监听点击事件获取点击要素的坐标,设置popover覆盖物显示的位置到该座标的位置;
6.将覆盖物添加到地图;

  // 实现标注聚合
  polymerization(dataSource: any[]) {
    var features = new Array(dataSource.length);
    for (var i = 0; i < dataSource.length; i++) {
      var coordinate = [dataSource[i][0], dataSource[i][1]].map(parseFloat);

      var attr = {
        userName: "测试",
        info: "测试点位显示信息",
        coordinate: fromLonLat(coordinate, "EPSG:4326"),
        type: "marker",
      };
      features[i] = new Feature({
        geometry: new Point(coordinate),
        attribute: attr,
      });
    }

    var source = new VectorSource({
      features: features,
    });
    var clusterSource = new Cluster({
      distance: 30, // 超过多少开始聚合
      source: source,
    });

    //加载聚合标注的矢量图层
    var styleCache = {} as any;
    var layerVetor = new VectorLayer({
      source: clusterSource,
      style: function (feature) {
        var size = feature.get("features").length;
        var style = styleCache[size];
        if (!style) {
          style = [
            new Style({
              image: new Icon(
                /** @type {olx.style.IconOptions} */ {
                  anchor: [0.5, 10],
                  anchorOrigin: "top-right",
                  anchorXUnits: "fraction",
                  anchorYUnits: "pixels",
                  offsetOrigin: "top-right",
                  offset: [0, 1], //偏移量设置
                  scale: 1.2, //图标缩放比例
                  opacity: 1, //透明度
                  src: new URL(
                    "../../assets/position-icon.png",
                    import.meta.url
                  ).href, //图标的url
                }
              ),
              text: new Text({
                font: "12px Calibri,sans-serif",
                text: size > 1 ? size.toString() : "",
                fill: new Fill({
                  color: "#eee",
                }),
              }),
            }),
          ];
          styleCache[size] = style;
        }
        return style;
      },
    });

    this.map.addLayer(layerVetor);

    const _this = this;
    var content = document.getElementById("popup-content");
    var title = document.getElementById("popup-title");
    var container: any = document.getElementById("pup-container");
    var position: any = document.getElementById("popup-position");
    var overlay = new Overlay({
      element: container,
      autoPan: true,
      positioning: "bottom-center",
    });
    this.map.on("click", function (evt) {
      title!.innerHTML = ``;
      content!.innerHTML = ``;
      position!.innerHTML = ``;
      // 捕捉feature,用于判断是否点击的是标注点
      let feature = _this.map.forEachFeatureAtPixel(
        evt.pixel,
        function (feature, layerVetor) {
          return feature;
        }
      );

      if (feature) {
        if (!feature.getProperties().features) return;
        var attribute = feature.getProperties().features[0].values_.attribute;
        if (attribute.type !== "marker") return;
        let pLen = feature.getProperties().features.length;
        if (pLen === 1) {
          container.style.display = "block";
          var pixel = _this.map.getEventPixel(evt.originalEvent);
          _this.map.forEachFeatureAtPixel(pixel, function (feature) {
            title!.innerHTML = `<p>项目名称: ${attribute.userName}</p>`;
            content!.innerHTML = `<p>项目描述: ${attribute.info}</p>`;
            position!.innerHTML = `<p>项目坐标: ${attribute.coordinate}</p>`;
            overlay.setPosition(attribute.coordinate);
            _this.map.addOverlay(overlay);
          });
        } else {
          container.style.display = "block";
          var pixel = _this.map.getEventPixel(evt.originalEvent);
          _this.map.forEachFeatureAtPixel(pixel, function (feature) {
            content!.innerHTML = `<p>点位聚合个数: ${pLen}</p>`;
            overlay.setPosition(attribute.coordinate);
            _this.map.addOverlay(overlay);
          });
        }
      } else {
        container.style.display = "none";
      }
    });

注:地图实例化代码见本专题前两章
2.实现效果
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenLayers API 是一个用于构建交互式地图应用的 JavaScript 库。它提供了各种功能,帮助开发者在网页中呈现地图、标记和空间数据。 OpenLayers API 可以用来加载多种地图图层,包括常见的切片地图、矢量地图和栅格地图。通过加载不同的地图图层,用户可以在应用中自由切换底图,查看不同地域和不同尺度下的地理信息。 除了地图图层,OpenLayers API 还提供了一系列的控件,用于增强用户交互体验。例如,缩放控件可用于放大或缩小地图视图,导航控件可用于移动地图视图,定位控件可用于定位用户当前位置等。这些控件可以定制,以满足特定应用的需求。 OpenLayers API 还支持标记和绘制。开发者可以在地图上添加标记,以突出显示感兴趣的位置。此外,还可以使用绘制工具在地图上绘制各种几何图形,如点、线和多边形。 除了基本的地图操作,OpenLayers API 还提供了一些高级功能。例如,它支持地图投影的转换和地理坐标系的转换,以便在不同投影和坐标系之间进行数据转换。此外,还支持地图视图的动画效果,以平滑地过渡视图位置和缩放级别。 总之,OpenLayers API 是一个功能强大、易于使用的 JavaScript 库,提供了丰富的地图功能和交互体验。无论是开发网页地图应用还是地理信息系统,OpenLayers API 都是一个值得尝试的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大兵的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值