OpenLayers之信息窗体

数字逸云
• 阅读 179

看过之前的文章,对于OpenLayers会有一个大致的了解。下面我们继续讲解 OpenLayer如何创建信息窗口。
下面示例是以 OpenLayersV8.2.0版本 作为依赖包

信息窗体

在Openlayer中,信息窗体属于覆盖物(Overlay),和高德地图的信息窗体类似。Web端,信息窗体与点标记的区别是:前者是通过DOM节点构成,后者是矢量图形。
我们也可以通过覆盖物(Overlay)来创建点标记,不过这个要看开发场景,如果数据量巨大,推荐使用矢量点标记,反之覆盖物点标记也可以。

Overlay

ol.Overlay是覆盖物API,主要用途就是在地图之上覆盖DOM元素,作为弹窗、提示窗、标注信息等,通过给定的经纬度,它会固定在对应的点位上,移动地图或拖动地图,覆盖物(Overlay)与地图的相对位置不变。

  • ol.Overlay:显示在地图上并附加到单个地图位置的元素。与Control一样,套印格式也是可见的小部件。与“控件”不同,它们不在屏幕上的固定位置,而是与地理坐标绑定,因此平移地图将移动“覆盖”。

    const popup = new Overlay({
    element: document.getElementById('popup'),
    autoPan: true,
    positioning: 'bottom-center',
    stopEvent: false,
    offset: [0, 0],
    autoPanAnimation: { duration: 250 }
    // ...更多属性
    });
    popup.setPosition(coordinate);
    map.addOverlay(popup);

    关于ol.OverlayAPI更多属性配置,可以查看官方文档:ol.Overlay

    示例

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="UTF-8">
      <title>点聚合 Map</title>
      <link rel="stylesheet" href="./8.2.0/theme/ol.css">
      <script src="./8.2.0/en/latest/ol/dist/ol.js"></script>
      <!-- <script src="https://cdn.jsdelivr.net/npm/ol@v8.2.0/dist/ol.js"></script>
      <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ol@v8.2.0/ol.css"> -->
      <style>
          #infowindow {
              background: rgba(0, 0, 0, 0.66);
              border-radius: 5px;
              padding: 5px;
              color: #fff;
          }
      </style>
    </head>
    
    <body>
      <div id="map" style="height: 95vh; border: 6px solid;"></div>
      <div id="infowindow"></div>
    
      <script>
          const url = 'https://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer/tile/{z}/{y}/{x}'
          let map = new ol.Map({
              target: 'map',
              layers: [
                  new ol.layer.Tile({
                      source: new ol.source.XYZ({
                          url: url
                      })
                  })
              ],
              view: new ol.View({
                  center: [116.39, 39.91],
                  zoom: 11,
                  projection: 'EPSG:4326'
              })
          });
          // 地图点击事件
          map.on('click', (e) => {
              console.log(e);
          })
    
    
          const element = document.getElementById('infowindow');
          let infowindow = null;
          const coordinate = [
              [
                  116.28288330078125,
                  39.91595224314723
              ],
              [
                  116.49848999023439,
                  39.881633003379434
              ]
          ]
    
          // 以下是点标记代码
          // 创建Style样式
          const iconStyle = new ol.style.Style({
              image: new ol.style.Icon({
                  anchor: [0.5, 0.5],
                  color: 'blue',
                  src: './img/point.png',
                  width: 30
              }),
              text: new ol.style.Text({
                  text: '点标记',
                  offsetY: -25,
                  fill: new ol.style.Fill({ color: 'blue' })
              })
          })
          // 创建Feature要素
          const features = coordinate.map((item) => {
              const Feature = new ol.Feature({
                  // 创建geometry
                  geometry: new ol.geom.Point(item),
                  name: 'Marker'
              })
              Feature.positon = item;
              return Feature;
          })
          // 创建Vector图层
          const vectorLayer = new ol.layer.Vector({
              source: new ol.source.Vector(),
              style: iconStyle
          })
          features.forEach((item) => vectorLayer.getSource().addFeature(item))
          map.addLayer(vectorLayer);
          // 点标注点击
          map.on('click', (evt) => {
              const Feature = map.forEachFeatureAtPixel(evt.pixel, (feature) => {
                  return feature
              })
              if (Feature && Feature.get('name') === 'Marker') {
                  console.log('Marker点标注', Feature);
                  const positon = Feature.positon;
                  if (!infowindow) {
                      addInfoWindow(positon);
                  } else {
                      element.innerHTML = positon.toString();
                      infowindow.setPosition(positon);
                  }
    
              }
          })
          // 以上是点标记代码
    
          // 创建覆盖物
          function addInfoWindow(positon) {
              infowindow = new ol.Overlay({
                  element: element,
                  autoPan: true,
                  positioning: 'bottom-center',
                  stopEvent: false,
                  offset: [0, -32],
                  autoPanAnimation: { duration: 250 }
              })
              map.addOverlay(infowindow);
              element.innerHTML = positon.toString();
              infowindow.setPosition(positon);
          }
      </script>
    </body>
    
    </html>

    当点击点标记,信息窗体即会展示。来预览下覆盖物(Overlay)上图的效果吧!
    OpenLayers之信息窗体

    总结

  • 在openlayer中,信息窗体属于覆盖物(Overlay);
  • 覆盖物(Overlay)的主体是DOM元素节点,移动地图或拖动地图,主体会伴随相对位置不变;
  • ol.Overlay覆盖物(Overlay)也可用来创建点标记、文本等;
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
ES6 新增的数组的方法
给定一个数组letlist\//wu:武力zhi:智力{id:1,name:'张飞',wu:97,zhi:10},{id:2,name:'诸葛亮',wu:55,zhi:99},{id:3,name:'赵云',wu:97,zhi:66},{id:4,na
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这