OpenLayer4實(shí)現(xiàn)自定義地圖聚類(lèi)圖層

前言:一直感覺(jué)不論OL還是arcgis 這個(gè)地圖聚類(lèi)是真的丑婿崭,實(shí)在讓人看不下去,反觀(guān)leaflet插件的的聚合效果那叫一個(gè)好看,個(gè)人感覺(jué)好看多了去了轮傍,那么把這個(gè)聚合效果用到OL上面去啊,這個(gè)是一個(gè)很好玩的事首装,本篇文章用到了自定義的聚類(lèi)的擴(kuò)展圖層创夜,感謝@牛老師源代碼啟發(fā),在此基礎(chǔ)上進(jìn)行進(jìn)一步的封裝仙逻。

先來(lái)張效果圖:

這張照片整的感覺(jué)都變形很多。其實(shí)一點(diǎn)沒(méi)變形

一、自定義擴(kuò)展圖層下載(github)

ol.layer.myClusterLayer =function(options){varself =this;self.styleFunc =function(feat){varattribute = feat.get("attribute");varcount = attribute.cluster.length;if(count <1) {varname = attribute.data.name;returnnewol.style.Style({image:newol.style.Icon(/** @type {olx.style.IconOptions} */({anchor: [0.5,60],anchorOrigin:'top-right',anchorXUnits:'fraction',anchorYUnits:'pixels',offsetOrigin:'top-right',offset: [0,1],//偏移量設(shè)置scale:0.7,//圖標(biāo)縮放比例opacity:0.75,//透明度src:'data/marker-icon.png'//圖標(biāo)的url})),text:newol.style.Text({text: name,fill:newol.style.Fill({color:'#000000'}),textAlign:"left",offsetX:5,textBaseline:"middle"})? ? ? ? })? ? }else{var_smallCorlor;var_bigCorlor;if(count <100) {if(count >50) {? ? ? ? ? ? ? ? _smallCorlor ="#f0cd41";? ? ? ? ? ? ? ? _bigCorlor ="#f5de8b";? ? ? ? ? ? }else{? ? ? ? ? ? ? ? _smallCorlor ="#94d769";? ? ? ? ? ? ? ? _bigCorlor ="#cde7b1";? ? ? ? ? ? }? ? ? ? }else{? ? ? ? ? ? _smallCorlor ='#f1964d';? ? ? ? ? ? _bigCorlor ="#f9bda2";? ? ? ? }? ? ? ? count++;? ? ? ? count = count.toString();varsmallRadius = count.length *10;? ? ? ? smallRadius = smallRadius <10?12: smallRadius ;varbigRadius = smallRadius +5;return[newol.style.Style({image:newol.style.Circle({radius: bigRadius,fill:newol.style.Fill({color: _bigCorlor? ? ? ? ? ? ? ? ? ? })? ? ? ? ? ? ? ? }),? ? ? ? ? ? }),newol.style.Style({image:newol.style.Circle({radius: smallRadius,fill:newol.style.Fill({color: _smallCorlor? ? ? ? ? ? ? ? ? ? })? ? ? ? ? ? ? ? }),text:newol.style.Text({text: count,fill:newol.style.Fill({color:'#620022'}),textAlign:"center",textBaseline:"middle"})? ? ? ? ? ? }),? ? ? ? ]? ? }}vardefaults = {map:null,clusterField:"",zooms: [2,4,8,12],distance:256,data: [],style: self.styleFunc,};//將default和options合并self.options = {map: options.map,clusterField: options.clusterField,zooms: (options.zooms.length >0? options.zooms : defaults.zooms),distance: (options.distance >0? options.distance : defaults.distance),data: options.data,style:(options.style!=null?options.style:defaults.style)}self.proj = self.options.map.getView().getProjection();self.vectorSource =newol.source.Vector({features: []});self.vectorLayer =newol.layer.Vector({source: self.vectorSource,style: self.options.style});self.clusterData = [];//判斷該點(diǎn)是否聚合self._clusterTest =function(data, dataCluster){var_flag =false;var_cField = self.options.clusterField;if(_cField !="") {? ? ? ? _flag = data[_cField] === dataCluster[_cField];? ? }else{//將地理坐標(biāo)轉(zhuǎn)換成屏幕坐標(biāo)税手,進(jìn)行距離判斷var_dataCoord = self._getCoordinate(data.lon, data.lat),? ? ? ? ? ? _cdataCoord = self._getCoordinate(dataCluster.lon, dataCluster.lat);var_dataScrCoord = self.options.map.getPixelFromCoordinate(_dataCoord),? ? ? ? ? ? _cdataScrCoord = self.options.map.getPixelFromCoordinate(_cdataCoord);var_distance =Math.sqrt(Math.pow((_dataScrCoord[0] - _cdataScrCoord[0]),2) +Math.pow((_dataScrCoord[1] - _cdataScrCoord[1]),2)? ? ? ? );? ? ? ? _flag = _distance <= self.options.distance;? ? }//如果超過(guò)最大的縮放級(jí)別殿怜,數(shù)據(jù)全部展示var_zoom = self.options.map.getView().getZoom(),? ? ? ? _maxZoom = self.options.zooms[self.options.zooms.length -1];if(_zoom > _maxZoom) _flag =false;return_flag;};//坐標(biāo)轉(zhuǎn)換self._getCoordinate =function(lon, lat){returnol.proj.transform([parseFloat(lon),parseFloat(lat)],"EPSG:4326",? ? ? ? self.proj? ? );};//添加數(shù)據(jù)到聚合圖self._add2CluserData =function(index, data){? ? self.clusterData[index].cluster.push(data);};self._clusterCreate =function(data){? ? self.clusterData.push({data: data,cluster: []? ? });};//展示數(shù)據(jù)self._showCluster =function(){? ? self.vectorSource.clear();var_features = [];for(vari =0, len = self.clusterData.length; i < len; i++) {var_cdata = self.clusterData[i];var_coord = self._getCoordinate(_cdata.data.lon, _cdata.data.lat);var_feature =newol.Feature({geometry:newol.geom.Point(_coord),attribute: _cdata? ? ? ? });//如果聚合點(diǎn)里面沒(méi)有數(shù)據(jù)就顯示該點(diǎn)數(shù)據(jù)if(_cdata.cluster.length ===0) _feature.attr = _feature.data;? ? ? ? _features.push(_feature);? ? }? ? self.vectorSource.addFeatures(_features);};self._clusterFeatures =function(){? ? self.clusterData = [];//可視域處理var_viewExtent = self.options.map.getView().calculateExtent();//聲明一個(gè)矩形,范圍就是屏幕的四至var_viewGeom =newol.geom.Polygon.fromExtent(_viewExtent);for(vari =0, ilen = self.options.data.length; i < ilen; i++) {var_data = self.options.data[i];var_coord = self._getCoordinate(_data.lon, _data.lat);if(_viewGeom.intersectsCoordinate(_coord)) {//當(dāng)前點(diǎn)是否聚合挡篓,默認(rèn)是falsevar_clustered =false;for(varj =0, jlen = self.clusterData.length; j < jlen; j++) {var_cdata = self.clusterData[j];if(self._clusterTest(_data, _cdata.data)) {? ? ? ? ? ? ? ? ? ? self._add2CluserData(j, _data);? ? ? ? ? ? ? ? ? ? _clustered =true;break;? ? ? ? ? ? ? ? }? ? ? ? ? ? }if(!_clustered) {? ? ? ? ? ? ? ? self._clusterCreate(_data);? ? ? ? ? ? }? ? ? ? }? ? }? ? self.vectorSource.clear();? ? self._showCluster();};self.init =function(){? ? self._clusterFeatures();? ? self.options.map.on("moveend",function(){? ? ? ? self._clusterFeatures();? ? });};self.init();returnself.vectorLayer;};ol.inherits(ol.layer.myClusterLayer, ol.layer.Vector);

下載地址:點(diǎn)我下載

二、demo示例

myClusterLayer圖層參數(shù)option

map是就當(dāng)前地圖容器

clusterField 該參數(shù)是,是否屬性聚合庄蹋,如果賦值僅需要賦屬性字段名即可

distance是聚合的距離(屏幕上距離)

data 是數(shù)據(jù)

style是樣式(不填就有默認(rèn)樣式)

{? ? ? ? ? ? ? ? ? ? map:map,? ? ? ? ? ? ? ? ? ? clusterField:"",? ? ? ? ? ? ? ? ? ? zooms:[12],? ? ? ? ? ? ? ? ? ? distance:100,? ? ? ? ? ? ? ? ? ? data:result,? ? ? ? ? ? ? ? ? ? style:null}

clusterbody,#map{border:0px;margin:0px;padding:0px;width:100%;height:100%;font-size:13px;overflow: hidden;? ? ? ? }varmap;functioninit(){varprojection =newol.proj.Projection({code:'EPSG:4326',units:'degrees'});functiongetNavmapLayer(){returnnewol.layer.Tile({source:newol.source.XYZ({url:'http://webrd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8'//7,8}),projection: projection? ? ? ? ? ? ? ? });? ? ? ? ? ? }varnavlayer = getNavmapLayer();? ? ? ? ? ? map =newol.Map({controls: ol.control.defaults({attribution:false}),target:'map',layers: [navlayer],view:newol.View({projection: projection,center: [116.456,40.251],zoom:4})? ? ? ? ? ? });? ? ? ? ? ? $.get("data/data.json",function(result){varmycluster =newol.layer.myClusterLayer({map: map,clusterField:"",zooms: [12],distance:100,data: result,style:null});? ? ? ? ? ? ? ? map.addLayer(mycluster);? ? ? ? ? ? })? ? ? ? }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市迷雪,隨后出現(xiàn)的幾起案子限书,更是在濱河造成了極大的恐慌,老刑警劉巖章咧,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倦西,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡赁严,警方通過(guò)查閱死者的電腦和手機(jī)扰柠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疼约,“玉大人卤档,你說(shuō)我怎么就攤上這事〕贪” “怎么了劝枣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)织鲸。 經(jīng)常有香客問(wèn)我舔腾,道長(zhǎng),這世上最難降的妖魔是什么搂擦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任稳诚,我火速辦了婚禮,結(jié)果婚禮上盾饮,老公的妹妹穿的比我還像新娘采桃。我一直安慰自己,他們只是感情好丘损,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布普办。 她就那樣靜靜地躺著,像睡著了一般徘钥。 火紅的嫁衣襯著肌膚如雪衔蹲。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音舆驶,去河邊找鬼橱健。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沙廉,可吹牛的內(nèi)容都是我干的拘荡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼撬陵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼珊皿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起巨税,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蟋定,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后草添,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體驶兜,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年远寸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抄淑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡而晒,死狀恐怖蝇狼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情倡怎,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布贱枣,位于F島的核電站监署,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏纽哥。R本人自食惡果不足惜钠乏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望春塌。 院中可真熱鬧晓避,春花似錦、人聲如沸只壳。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吼句。三九已至锅必,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惕艳,已是汗流浹背搞隐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工驹愚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人劣纲。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓逢捺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親癞季。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蒸甜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355