场景

Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合:

Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合_BADAO_LIUMANG_QIZHI的博客-CSDN博客

在上面实现聚合效果之后,如果要实现点击聚合要素与单个要素时弹出不同的弹窗。

注:

博客:
BADAO_LIUMANG_QIZHI的博客_霸道流氓气质_CSDN博客-C#,SpringBoot,架构之路领域博主
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

1、首先实现点击要素弹窗的实现

可以参考如下

Vue+Openlayer使用overlay实现弹窗弹出显示与关闭:

Vue+Openlayer使用overlay实现弹窗弹出显示与关闭_BADAO_LIUMANG_QIZHI的博客-CSDN博客

2、关键就是监听地图的单击事件并根据要素的个数分别弹窗显示不同的内容

        map.on('singleclick', function (evt) {if (feature) { //捕捉到要素if (feature.values_.features && feature.values_.features.length == 1) { //只有一个要素console.log("进入单元素聚合");} else { //有多个要素                                                  console.log("有多个要素");}} else {console.log("没有元素");}});

3、添加弹窗的标签

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

4、设置窗体的样式

    <style>html,body,#map {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}.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;}.popup-content {width: 400px;}.ol-popup-closer {text-decoration: none;position: absolute;top: 2px;right: 8px;}</style>

5、获取到弹窗的节点DOM

        // 获取到弹框的节点DOMvar container = document.getElementById("popup");var content = document.getElementById("popup-content");var closer = document.getElementById("popup-closer");

6、弹窗关闭事件

        //弹窗关闭事件closer.onclick = function () {_that.overlay.setPosition(undefined);closer.blur();return false;};

7、创建overlay对象并添加到地图

        // 创建一个弹窗 Overlay 对象var overlay = new ol.Overlay({element: container, //绑定 Overlay 对象和 DOM 对象的autoPan: true, // 定义弹出窗口在边缘点击时候可能不完整 设置自动平移效果autoPanAnimation: {duration: 250 //自动平移效果的动画时间 9毫秒}});map.addOverlay(overlay);

8、其他都是加载离线瓦片地图的代码,完整示例代码

<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><title>缩放地图实现聚合与取消聚合-动态弹窗显示</title><link rel="stylesheet" href="lib/ol65/ol.css" type="text/css"><style>html,body,#map {padding: 0;margin: 0;width: 100%;height: 100%;overflow: hidden;}.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;}.popup-content {width: 400px;}.ol-popup-closer {text-decoration: none;position: absolute;top: 2px;right: 8px;}</style>
</head><body><div id="map"></div><div id="popup" class="ol-popup"><a href="#" id="popup-closer" class="ol-popup-closer">X</a><div id="popup-content" class="popup-content"></div></div><script type="text/javascript" src="lib/ol65/ol.js"></script><script type="text/javascript">var source = new ol.source.XYZ({tileUrlFunction: function (xyz, obj1, obj2) {if (!xyz)return "";var z = xyz[0];var x = Math.abs(xyz[1]);var y = Math.abs(xyz[2]);var xyz_convert = self.convert_(z, x, y);x = xyz_convert[0];y = xyz_convert[1];z = xyz_convert[2];var shift = z / 2;var half = 2 << shift;var digits = 1;if (half > 10)digits = parseInt(Math.log(half) / Math.log(10)) + 1;var halfx = parseInt(x / half);var halfy = parseInt(y / half);x = parseInt(x);y = parseInt(y) - 1;var url = "./images/EPSG_900913" + "_" + self.padLeft_(2, z) + "/" + self.padLeft_(digits,halfx) + "_" + self.padLeft_(digits, halfy) + "/" + self.padLeft_(2 * digits, x) +"_" + self.padLeft_(2 * digits, y) + "." + 'png';return url;}});//projections投影坐标系转换相关的操作var projection = new ol.proj.Projection({code: 'EPSG:900913',units: 'm',axisOrientation: 'neu'});//Layers 图层管理类,用来管理图层信息。主要包括Tile,Image,Vector,VectorTile等图层。var layer = new ol.layer.Tile({source: source});// 随机创建要素var clusterSource = new ol.source.Vector();for (var i = 1; i <= 10; i++) {var coordinates = [-11551949.709486058 + Math.random(), 5533080.7247905275 + Math.random()];var feature = new ol.Feature(new ol.geom.Point(coordinates));clusterSource.addFeature(feature);}for (var i = 1; i <= 20; i++) {var coordinates = [-11553949.709486058 + Math.random(), 5527080.7247905275 + Math.random()];var feature = new ol.Feature(new ol.geom.Point(coordinates));clusterSource.addFeature(feature);}// 聚合图层数据源var clusterSourceForLayer = new ol.source.Cluster({source: clusterSource,distance: 100})// 聚合图层var clusterLayer = new ol.layer.Vector({source: clusterSourceForLayer,style: function (feature, resolution) {var size = feature.get('features').length;if (size == 1) {return new ol.style.Style({image: new ol.style.Icon({scale: 0.8,src: './icon/house.png',anchor: [0.48, 0.52]}),text: new ol.style.Text({font: 'normal 12px 黑体',// // 对其方式textAlign: 'center',// 基准线textBaseline: 'middle',offsetY: -35,offsetX: 0,backgroundFill: new ol.style.Stroke({color: 'rgba(0,0,255,0.7)',}),// 文本填充样式fill: new ol.style.Fill({color: 'rgba(236,218,20,1)'}),padding: [5, 5, 5, 5],text: `霸道的程序猿`,})});} else {return new ol.style.Style({image: new ol.style.Circle({radius: 30,stroke: new ol.style.Stroke({color: 'white'}),fill: new ol.style.Fill({color: 'blue'})}),text: new ol.style.Text({text: size.toString(),fill: new ol.style.Fill({color: 'white'})})});}}});//View 视图管理器,主要用来管理地图视图,分辨率或旋转,中心、投影、分辨率、缩放级别等。var view = new ol.View({//中心点center: [-11549894, 5533433],//缩放等级zoom: 11,//投影坐标系projection: projection,//边界extent: [-20037508.34, -20037508.34, 20037508.34, 20037508.34]});//Map Openlayers的核心组件,包含图层、交互事件、UI控制元素等。var map = new ol.Map({layers: [layer, clusterLayer],target: 'map',view: view});// 获取到弹框的节点DOMvar container = document.getElementById("popup");var content = document.getElementById("popup-content");var closer = document.getElementById("popup-closer");//弹窗关闭事件closer.onclick = function () {_that.overlay.setPosition(undefined);closer.blur();return false;};// 创建一个弹窗 Overlay 对象var overlay = new ol.Overlay({element: container, //绑定 Overlay 对象和 DOM 对象的autoPan: true, // 定义弹出窗口在边缘点击时候可能不完整 设置自动平移效果autoPanAnimation: {duration: 250 //自动平移效果的动画时间 9毫秒}});map.addOverlay(overlay);let _that = this;map.on('singleclick', function (evt) {let coordinate = evt.coordinate// 点击尺 (这里是尺(米),并不是经纬度);var feature = map.forEachFeatureAtPixel(evt.pixel, (feature) => {return feature;});if (feature) { //捕捉到要素if (feature.values_.features && feature.values_.features.length == 1) { //只有一个要素content.innerHTML = `<p>只有一个要素的弹窗:</p><p>坐标:</p>X:${coordinate[0]} &nbsp;&nbsp; Y: ${coordinate[1]}`;_that.overlay.setPosition(coordinate); //把 overlay 显示到指定的 x,y坐标console.log("进入单元素聚合");} else { //有多个要素                                                  content.innerHTML = `<p>有多个要素的弹窗:</p><p>坐标:</p>X:${coordinate[0]} &nbsp;&nbsp; Y: ${coordinate[1]}`;_that.overlay.setPosition(coordinate); //把 overlay 显示到指定的 x,y坐标console.log("有多个要素");}} else {console.log("没有元素");}});//xy行列转换function convert_(zoomLevel, x, y) {var extent = Math.pow(2, zoomLevel);if (x < 0 || x > extent - 1) {console.log("The X coordinate is not sane: " + x);return;}if (y < 0 || y > extent - 1) {console.log("The Y coordinate is not sane: " + y);return;}// openlayers 6.0版本var gridLoc = [x, extent - y, zoomLevel];// openlayers 4.5版本// var gridLoc = [x, extent - y + 1, zoomLevel];return gridLoc;}//字符截取function padLeft_(num, val) {return (new Array(num).join('0') + val).slice(-num);}</script>
</body></html>

Openlayers中使用Cluster+Overlay实现点击单个要素和聚合要素时显示不同弹窗相关推荐

  1. Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合

    场景 Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合: Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合_BADAO_LIUMANG_QIZHI的博客 ...

  2. Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合

    场景 Openlayers中实现地图上打点并显示图标和文字: Openlayers中实现地图上打点并显示图标和文字_BADAO_LIUMANG_QIZHI的博客-CSDN博客_openlayers 打 ...

  3. C#——设计一个简单的窗体程序,在文本框中输入两个点的坐标值,单击“确定”按钮时显示两点之间的距离。

    要求定义一个Point类,包括 (1)两个私有字段表示两个坐标值. (2)一个构造函数通过传入的参数对坐标值初始化 (3)两个只读属性对坐标值的读取 (4)一个方法包含一个Point类对象作为参数对象 ...

  4. Openlayers中使用Overlay实现点击要素显示html内容弹窗并且动态更改弹窗内容

    场景 Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动: Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动_BADAO_LIUMANG_QIZHI的博客 ...

  5. Openlayers中使用Overlay实现点击要素弹窗并且弹窗随之移动

    场景 Vue+Openlayer使用overlay实现弹窗弹出显示与关闭: Vue+Openlayer使用overlay实现弹窗弹出显示与关闭_BADAO_LIUMANG_QIZHI的博客-CSDN博 ...

  6. 开源GIS(七)——openlayers中单击获取要素(深度好文)

    目录 一.引言 二.前台方法 1.interaction中select方法 2.map中forEachFeatureAtPixel方法 三.gis server方法 1.wms中getfeaturei ...

  7. Openlayers中多边形的聚合

    关于OpenLayers的Cluster ol.source.Cluster ol利用这个js对象实现对地图上feature进行聚合展示的控制,所有的features需要被放在一个feature数组中 ...

  8. Openlayers中使用animate实现车辆定位导航效果(以当前车辆为中心移动)

    场景 Openlayers中加载Geoserver切割的EPSG:900913离线瓦片地图并显示: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...

  9. 开源GIS(九)——openlayers中简单要素的添加与geojson数据修改添加

    目录 一.引言 二.简单要素点线面的添加 1.创建feature 2.创建style,添加source.style到layer 3.添加layer到map 三.WFS获取geojson数据并修改 四. ...

最新文章

  1. Web API 接口-JavaScript全部api接口文档
  2. 指针 混用 迭代器_对比 C++ 和 Python,谈谈指针与引用
  3. 新兴经济体助力BCH长足发展
  4. 关于Linux下kernel.shmmax的设置问题
  5. Haskell语言实现求解一个整数所有因子的代码及运行结果
  6. Abstract Factory抽象工厂模式
  7. 房价集体上扬?最新房价数据分析看房价走势
  8. python官网32位下载_python32位下载-Python for Windows 32位下载 v3.8.0官方版--pc6下载站...
  9. c语言指针输出两个数的最大值和最小值,并求和,有些不清楚这样写为什么不行。
  10. 浅谈分布式存储中的网络通信
  11. Django单表,连表查询
  12. 【原】PSD图标素材的全自动切图方法,适用于IOS、安卓、web前端等领域
  13. python怎么注释掉一段代码_爬取出来的网页代码都被注释掉怎么解决?
  14. CI框架全局登录控制
  15. iphone 6 设置自定义铃声(未越狱)
  16. python倒数切片_python的切片操作
  17. ShareX加七牛云免费搭建快速博客图床
  18. 故障分析 | 使用--force批量导入数据导致部分数据丢失的问题
  19. 计算机能破坏光盘中的系统吗,Windows 10中的“光盘映像文件已损坏”怎么办?...
  20. STM32 RTC应用 内部唤醒中断 (Internal Wakeup)

热门文章

  1. java填空题答案_JAVA求填空题答案
  2. qt可视化数据展板_Qt 2D数据可视化之QCharts
  3. 怎么查看kudu的版本_KUDU 1.7.0-CDH5.15.1-0 版本中 客户端kudu 命令缺少rebalance 子命令....
  4. 传输层端口号的范围是多少?被分为哪两部分_青岛家用电器检测费用多少
  5. 做折线图坐标轴数字_你做的柱状图太丑了,这些美化技巧教给你(收藏)
  6. html5 div css 页签,div css 实现tabs标签的思路及示例代码
  7. html里的value什么含义,HTML input value属性表示什么
  8. 倾斜模型精细化处理_推荐一款好用的倾斜摄影精细化单体建模软件——OSketch...
  9. python判断是否是小写字母_python判断字符串是字母 数字 大小写(转载)
  10. ajax返回的是流如何转换为pdf,如何在AJAX请求成功响应中返回PDF文件