日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/19 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

場景

Openlayers中使用Cluster實現縮放地圖時圖層聚合與取消聚合:

Openlayers中使用Cluster實現縮放地圖時圖層聚合與取消聚合_BADAO_LIUMANG_QIZHI的博客-CSDN博客

上面實現縮放地圖時元素在指定距離內實現聚合效果。?

實際場景中點位是變化的,不是靜態的點位,當多個點位在動態更新的過程中如果出現了重合則自動實現聚合效果

注:

博客:
BADAO_LIUMANG_QIZHI的博客_霸道流氓氣質_CSDN博客-C#,SpringBoot,架構之路領域博主
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。

實現

1、首先模擬多個點位坐標的數據,實際場景可能是從后臺或其他地方獲取點位信息

??????? //定位數據源var positionData = [[{x: '-11561139.941628069',y: '5538515.7834814',carNumber: '霸道的程序猿'},{x: '-11552039.941628069',y: '5531515.7834814',carNumber: '公眾號'}],[{x: '-11560039.941628069',y: '5537515.7834814',carNumber: '霸道的程序猿'},{x: '-11553039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11559039.941628069',y: '5536515.7834814',carNumber: '霸道的程序猿'},{x: '-11554039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11558039.941628069',y: '5535515.7834814',carNumber: '霸道的程序猿'},{x: '-11557039.941628069',y: '5534515.7834814',carNumber: '公眾號'}],[{x: '-11557039.941628069',y: '5534515.7834814',carNumber: '霸道的程序猿'},{x: '-11556039.941628069',y: '5535515.7834814',carNumber: '公眾號'}],[{x: '-11556039.941628069',y: '5533515.7834814',carNumber: '霸道的程序猿'},{x: '-11557039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11555039.941628069',y: '5533515.7834814',carNumber: '霸道的程序猿'},{x: '-11558039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11554039.941628069',y: '5533515.7834814',carNumber: '霸道的程序猿'},{x: '-11559039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11553039.941628069',y: '5533515.7834814',carNumber: '霸道的程序猿'},{x: '-11560039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11552039.941628069',y: '5533515.7834814',carNumber: '霸道的程序猿'},{x: '-11561039.941628069',y: '5536515.7834814',carNumber: '公眾號'}]];

這里模擬兩組坐標的點位數據,會在中間某個時刻有距離特別相近的點位。

2、創建聚合圖層要素

??????? // 創建聚合圖層要素var clusterSource = new ol.source.Vector();

3、新建聚合圖層數據源

??????? // 聚合圖層數據源var clusterSourceForLayer = new ol.source.Cluster({source: clusterSource,distance: 50})

這里的distance就是指的聚合的距離。

實際上就是將原來的普通的new ol.source.Vector圖層數據源更換為ol.source.Cluster

4、新建聚合圖層

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

實際上實現聚合與不聚合效果的關鍵代碼就是這部分的style改為函數并且根據條件動態返回。

如果包含多個元素,則返回聚合的style效果,否則就是返回普通的style效果。

5、map上添加圖層

??????? var map = new ol.Map({layers: [layer],target: 'map',view: view});this.map.addLayer(this.clusterLayer);

其中layer是地圖圖層。

然后新建一個定時器模擬定時獲取點位數據

??????? //定時器循環模擬后臺獲取數據實現定位效果var index = 0;setInterval(() => {//坐標數據到頭了 就重新開始if (index > this.positionData.length - 2) {index = 0;}//根據索引獲取數據var item = this.positionData[index];//清除上次的數據源if (this.positonSource) {this.positonSource.clear();}if (item) {clusterSource.clear();for (var i = 0; i < item.length; ++i) {var feature = new ol.Feature({geometry: new ol.geom.Point([Number(item[i].x), Number(item[i].y)])})//數據源添加要素clusterSource.addFeature(feature);}}???//移到下個點index++;}, 1000);

在定時器中將聚合圖層的數據源先清理,然后再將坐標要素添加進聚合圖層數據源中。

其他相關代碼就是離線加載地圖顯示的功能,可以參考

Openlayers中實現地圖上打點并顯示圖標和文字:

Openlayers中實現地圖上打點并顯示圖標和文字_BADAO_LIUMANG_QIZHI的博客-CSDN博客_openlayers 打點

6、完整示例代碼

<!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;}</style> </head><body><div id="map"></div><script type="text/javascript" src="lib/ol65/ol.js"></script><script type="text/javascript">//定位數據源var positionData = [[{x: '-11561139.941628069',y: '5538515.7834814',carNumber: '霸道的程序猿'},{x: '-11552039.941628069',y: '5531515.7834814',carNumber: '公眾號'}],[{x: '-11560039.941628069',y: '5537515.7834814',carNumber: '霸道的程序猿'},{x: '-11553039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11559039.941628069',y: '5536515.7834814',carNumber: '霸道的程序猿'},{x: '-11554039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11558039.941628069',y: '5535515.7834814',carNumber: '霸道的程序猿'},{x: '-11557039.941628069',y: '5534515.7834814',carNumber: '公眾號'}],[{x: '-11557039.941628069',y: '5534515.7834814',carNumber: '霸道的程序猿'},{x: '-11556039.941628069',y: '5535515.7834814',carNumber: '公眾號'}],[{x: '-11556039.941628069',y: '5533515.7834814',carNumber: '霸道的程序猿'},{x: '-11557039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11555039.941628069',y: '5533515.7834814',carNumber: '霸道的程序猿'},{x: '-11558039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11554039.941628069',y: '5533515.7834814',carNumber: '霸道的程序猿'},{x: '-11559039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11553039.941628069',y: '5533515.7834814',carNumber: '霸道的程序猿'},{x: '-11560039.941628069',y: '5536515.7834814',carNumber: '公眾號'}],[{x: '-11552039.941628069',y: '5533515.7834814',carNumber: '霸道的程序猿'},{x: '-11561039.941628069',y: '5536515.7834814',carNumber: '公眾號'}]];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();// 聚合圖層數據源var clusterSourceForLayer = new ol.source.Cluster({source: clusterSource,distance: 50})// 聚合圖層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],target: 'map',view: view});this.map.addLayer(this.clusterLayer);//定時器循環模擬后臺獲取數據實現定位效果var index = 0;setInterval(() => {//坐標數據到頭了 就重新開始if (index > this.positionData.length - 2) {index = 0;}//根據索引獲取數據var item = this.positionData[index];//清除上次的數據源if (this.positonSource) {this.positonSource.clear();}if (item) {clusterSource.clear();for (var i = 0; i < item.length; ++i) {var feature = new ol.Feature({geometry: new ol.geom.Point([Number(item[i].x), Number(item[i].y)])})//數據源添加要素clusterSource.addFeature(feature);}}???//移到下個點index++;}, 1000);//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实现点位元素重合时动态聚合与取消聚合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美乱妇日本无乱码特黄大片 | xvideos成人免费视频 | 人妻丰满熟妇av无码区免 | 免费黄色小网站 | 国产一区二区免费 | 欧美日韩亚洲另类 | 亚洲天堂一二三 | 国产成人啪精品午夜在线观看 | 国产第一页在线播放 | 淫语视频 | 日韩精品在线网站 | 亚洲第一女人av | 日本人dh亚洲人ⅹxx | 曰韩精品| 国产美女精品视频国产 | 欧美中文字幕在线视频 | 国产成人精品一区二区三区 | 金鱼妻日剧免费观看完整版全集 | 亚洲国产欧美在线观看 | 精品免费一区二区 | 欧美大片在线看免费观看 | 岛国av免费在线观看 | 亚洲一区二区免费视频 | 91精品国产自产精品男人的天堂 | а√天堂资源官网在线资源 | 青草久久网 | 8x8x永久免费视频 | 欧美一区二区三区国产 | 9191在线视频 | 婷婷色吧 | 奇米精品一区二区三区在线观看 | 成年人av在线播放 | 丝袜天堂 | 成人午夜视频一区二区播放 | 亚洲三区av| 国产一区999 | 国产永久免费 | 黑料视频在线观看 | 国产精品免费一区二区三区 | 中文字幕高潮 | 少妇高清精品毛片在线视频 | 国产精品久久久久久影视 | 俺啪也 | 在线看网站 | 亚洲 欧美 综合 | 午夜精品99 | 国产www视频| 亚洲av无码不卡 | 天天夜夜人人 | 91av导航 | 成人在线观看视频网站 | 先锋资源中文字幕 | 韩日毛片| 99久久人妻无码精品系列 | 一级黄色视 | 青青操在线 | 国产又粗又大又硬 | 免费在线观看视频a | 国产欧美在线一区 | 成人欧美一区二区三区在线观看 | 樱花影院最新免费观看攻略 | 欧美成人精品在线观看 | 国产精品伦一区二区三级古装电影 | 国产999精品| 欧美大片www | 涩婷婷| 91大神视频在线播放 | 麻豆91茄子在线观看 | 美女一级黄色片 | 一区二区三区四区久久 | 经典杯子蛋糕日剧在线观看免费 | 97se亚洲国产综合在线 | 亚洲精品在线不卡 | 日本黄在线观看 | 天堂欧美城网站网址 | 九九热在线精品视频 | 国产精品成人免费精品自在线观看 | 毛片免费全部无码播放 | 成人毛片视频网站 | 午夜视频一区二区三区 | 伊人69| 欧美精品在线免费观看 | 成人免费看片入口 | 丰满少妇高潮在线观看 | 国产精品久久在线观看 | 女儿的朋友5中汉字晋通话 欧美成人免费高清视频 | 好吊妞一区二区三区 | 黄瓜视频在线免费看 | 久草青青视频 | 日韩不卡一区二区三区 | 亚洲爱情岛论坛永久 | 欧美高清x | 中文国语毛片高清视频 | 国产男男chinese网站 | 在线视频观看国产 | free性欧美69巨大 | 久久人人爽人人人人片 | 久久www视频 | 日日碰日日操 |