Leaflet使用中經(jīng)驗(yàn)總結(jié)

Leaflet使用中經(jīng)驗(yàn)總結(jié)

標(biāo)簽:leaflet

1.Leaflet中使用復(fù)選框控制圖層顯示

? Leaflet本身有圖層控制的支持,但最近用Leaflet做臺風(fēng)的小項(xiàng)目劫侧,其中一個(gè)細(xì)節(jié)是使用復(fù)選框控制圖層顯示與否宠纯,解決方法作如下記錄刃跛。在表格中的"選擇”列是對應(yīng)一個(gè)臺風(fēng)圖層的復(fù)選框俭尖,通過勾選來展示和隱藏本圖層盆昙。Leaflet中的圖層有其所屬的leaflet_id幽勒,是為了保證圖層的唯一性缰泡,但要選中復(fù)選框來操作對應(yīng)的圖層,顯然leaflet_id幫不上什么忙了代嗤。

? 于是棘钞,在繪制圖層時(shí)給圖層綁定一個(gè)自定義的layerId

var id = 202002;
var lyr_point = L.circle(……);
var lyr_polyline = L.polyline(……);
var lyr = L.featureGroup([lyr_point,lyr_polyline]);
lyr.options.layerId = id; // 給圖層(組)lyr綁定自定義id,在options參數(shù)里添加
批注 2020-07-14 154759.png

? js創(chuàng)建復(fù)選框時(shí)干毅,給每一個(gè)復(fù)選框綁定id宜猜,值即為對應(yīng)臺風(fēng)的id。要展示圖層時(shí)硝逢,查看當(dāng)前選中復(fù)選框是否選中姨拥,若選中則根據(jù)id構(gòu)造url繪制;要隱藏圖層時(shí)渠鸽,遍歷圖層組叫乌,若傳入的id與某一個(gè)圖層的layerId匹配,則隱藏該圖層徽缚。復(fù)選框綁定的函數(shù)框架如下憨奸,這樣就可以實(shí)現(xiàn)使用復(fù)選框控制圖層了。

function showPath(id){
    if(document.getElementById(id.toString()).checked){
        //這里使用id構(gòu)造url凿试,利用返回的數(shù)據(jù)繪制圖層
    }else{
        lyrGroup.eachLayer(function (layer){
            if(id == layer.options.LayersID){
                lyr.removeLayer(layer);
            }
        }
    }
}

[圖片上傳失敗...(image-fac0aa-1594712751210)]

2.臺風(fēng)風(fēng)圈的繪制

? Leaflet中繪制臺風(fēng)風(fēng)圈排宰,網(wǎng)上有 一篇博客 實(shí)現(xiàn)的比較完整,具體思路是擴(kuò)展L.Polygon類那婉,使用SVG的path繪制板甘。但我這里調(diào)用這個(gè)擴(kuò)展類繪制的風(fēng)圈不穩(wěn)定,在地圖縮放详炬、拖動盐类,窗口大小的改變都會是風(fēng)圈圖層消失。在瀏覽器中查看呛谜,發(fā)現(xiàn)上述操作是SVG的path里的d屬性清零了在跳,百思不得其解,于是乎放棄這個(gè)方法呻率,改使用turf.js繪制風(fēng)圈硬毕。

? turf.js是瀏覽器和Node.js環(huán)境下的高級地理空間分析的js庫,里面實(shí)現(xiàn)了很多常見的空間分析礼仗,比如緩沖區(qū)吐咳、點(diǎn)在多邊形內(nèi)等逻悠。我這里用lineArc函數(shù),指定中心點(diǎn)韭脊、半徑童谒、起始和終止角度后,它可以繪制一段圓弧沪羔,注意這里的圓弧是由計(jì)算出來的很多點(diǎn)擬合而成的饥伊,并不是真正的繪制了一條圓弧。其中options參數(shù)中的step默認(rèn)為64蔫饰,如果想要展示效果更順滑一點(diǎn)琅豆,可以選擇擬合點(diǎn)數(shù)。

? 分別指定東北篓吁,東南茫因,西南,西北四個(gè)方向上的半徑長度杖剪,單位默認(rèn)是kilometer冻押,生成四段圓弧,再把四段圓弧的坐標(biāo)都push進(jìn)一個(gè)數(shù)組盛嘿,利用lineString函數(shù)生成線要素洛巢,再利用lineToPolygon函數(shù)轉(zhuǎn)換為多邊形。

? 最后次兆,使用L.geoJSON將風(fēng)圈圖層添加到地圖上稿茉。實(shí)現(xiàn)函數(shù)貼在下方。

// p--中心點(diǎn)(包含四個(gè)方向的半徑),lyr--風(fēng)圈圖層所添加進(jìn)的圖層組
function drawTyphoonCircle(p,lyr){
    var center = turf.point([p.longitude, p.latitude]);
    var r_ne,r_se,r_sw,r_nw;
    if(p.radius7_quad && p.radius7){    
        r_ne = p.radius7_quad.ne;
        r_se = p.radius7_quad.se;
        r_sw = p.radius7_quad.sw;
        r_nw = p.radius7_quad.nw;
    }else{
        return;
    }
    var options = {number:2048};
    var arc_ne = turf.lineArc(center, r_ne, 0, 89.9,options);
    var arc_se = turf.lineArc(center, r_se, 90, 179.9,options);
    var arc_sw = turf.lineArc(center, r_sw, 180, 269.9,options);
    var arc_nw = turf.lineArc(center, r_nw, 270, 360.1,options);

    var arcs = [];
    arcs.push(arc_ne,arc_se,arc_sw,arc_nw);

    var myStyle = {
        "color": "#ccffcc",
        "weight": 2,
        "fillColor":"#ccffcc"
    };

    var typhoonCircleCoords = [];
    for(var i=0;i<arcs.length;i++){
        var rawCoords1 = arcs[i].geometry.coordinates;

        for(var j=0;j<rawCoords1.length;j++){
            typhoonCircleCoords.push(rawCoords1[j]);
        }
    }

    var lineAll = turf.lineString(typhoonCircleCoords);
    var typhoonCirclePolygon = turf.lineToPolygon(lineAll);

    L.geoJSON(typhoonCirclePolygon,{style:myStyle}).addTo(lyr);
}

3.給表格添加滾動條类垦,設(shè)置后無效

overflow-y設(shè)置為true后狈邑,要設(shè)置height為一個(gè)固定的值城须,比如600px蚤认。

4.Leaflet中加載Mapbox自定義地圖

使用L.tileLayer創(chuàng)建,url template中的username是Mapbox的注冊賬戶的用戶名糕伐。在https://studio.mapbox.com/中自定義圖層的分享按鈕處點(diǎn)擊砰琢,即可看到style_id和Access Token。

var mymap = L.map('map').setView([20.557212,126.402354],3.5);

L.tileLayer('https://api.mapbox.com/styles/v1/{username}/{style_id}/tiles/512/{z}/{x}/{y}?access_token={accessToken}',{
    username:'whitedreamer',
    style_id:'cjn64ahui0ycg2rq72fer5a3r',
    accessToken:'pk.eyJ1Ijoid2hpdGVkcmVhbWVyIiwiYSI6ImNqbjN4azFjcDAwbG0zcG52aGc3M2x0M2sifQ.CYsl1oXDVr1PWgx4z6lSeg'
}).addTo(mymap);

5.單擊表格行等同于單擊行內(nèi)的復(fù)選框良瞧,選中圖層

這個(gè)功能是問題1的改進(jìn)版陪汽,需要修改原有的代碼邏輯。首先褥蚯,刪除復(fù)選框的onclick綁定的事件挚冤,然后改寫showPath函數(shù):根據(jù)圖層id(等同于checkbox的id)繪制臺風(fēng)路徑,增加hidePath函數(shù):根據(jù)圖層id隱藏臺風(fēng)路徑赞庶;最后训挡,編寫selectARow函數(shù)澳骤,獲取所點(diǎn)擊表格行中的復(fù)選框id,根據(jù)id判斷圖層是否已繪制澜薄,若未繪制則繪制該圖層为肮,若已繪制則取消繪制。

注意:selectARow函數(shù)根據(jù)id判斷復(fù)選框是否被選中來判斷圖層是否已繪制肤京,存在邏輯矛盾颊艳,因?yàn)辄c(diǎn)擊復(fù)選框是點(diǎn)擊就繪制,取消就取消繪制忘分;而點(diǎn)擊表格行是若未選中則選中后繪制棋枕,若選中了則取消選中然后取消繪制。這兩個(gè)邏輯相反妒峦,無法調(diào)和戒悠,故采取上述邏輯。

function showPath(id){
    lyr_num += 1;//lyr_num是圖層數(shù)量
        if(lyr_num > 4){
            alert('Layers More Than 4.');
        }

        var url = 'https://www.readearth.com/typhoon/'+id.toString().slice(0,4)+'/'+id+'.json';
        draw(url,id);
        $('.badge')[0].innerHTML=lyr_num;//bootstrap徽標(biāo)舟山,顯示在按鈕上绸狐,展示當(dāng)前選中的圖層數(shù)量
        ids.push(id);
}

function hidePath(id){
    lyr.eachLayer(function (layer){
        if(id == layer.options.LayersID){
            lyr.removeLayer(layer);
            lyr_num -= 1;
            $('.badge')[0].innerHTML=lyr_num;//更新當(dāng)前顯示的圖層數(shù)量
        }
    });

    ids.forEach(function(item, index) {
        if(item == id) {
            ids.splice(index, 1);//刪除id數(shù)組中的對應(yīng)項(xiàng)
        }
    });
}

function selectARow(){
    $('.table').on('click','tr',function(){
        var td_checkbox = $(this)[0].children[3];//獲取checkbox所在td
        var checkbox = td_checkbox.children[0];//獲取checkox
        var id = parseInt(checkbox.id);//獲取checkbox的id

        // flag標(biāo)志行對應(yīng)的圖層是否已繪制,若已繪制則移除累盗,若未繪制則繪制寒矿,默認(rèn)未繪制
        var layers = lyr.getLayers();
        var flag = 0;
        if(layers.length){
            lyr.eachLayer(function(layer){
                if(id == layer.options.LayersID){
                    flag = 1;
                }
            })
        }
        if(flag){
            checkbox.checked = false;
            hidePath(id);  
        }else{
            checkbox.checked = true;
            showPath(id);
        }      
    })
}

6.一個(gè)div浮在一個(gè)div之上

假設(shè)div1在底下,div2浮在上方若债,則css應(yīng)該這么寫符相。注意:div1與div2之間是平行關(guān)系,不是嵌套關(guān)系蠢琳,但div1定義要在div2之上啊终。

#div1{
    position:absolute;
}

#div2{
    positon:relative;
    z-index:1/*div2的z-index大于div1的z-index即可,默認(rèn)div1的z-index為0*/
}

7.Echarts繪制圖表的依賴

從Echarts官網(wǎng)下載的官方案例會引入很多文件傲须,一般的圖表蓝牲,像餅圖、條形圖泰讽、折線圖等等例衍,只需要引入一個(gè)文件,即:

 <!-- 引入echarts.js -->
<script type='text/javascript' src='https://cdn.bootcss.com/echarts/4.2.1-rc1/echarts.min.js'></script>

推薦下載下來本地引用已卸,在線引用速度略慢佛玄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市累澡,隨后出現(xiàn)的幾起案子梦抢,更是在濱河造成了極大的恐慌,老刑警劉巖愧哟,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奥吩,死亡現(xiàn)場離奇詭異具伍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)圈驼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門人芽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绩脆,你說我怎么就攤上這事萤厅。” “怎么了靴迫?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵惕味,是天一觀的道長。 經(jīng)常有香客問我玉锌,道長名挥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任主守,我火速辦了婚禮禀倔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘参淫。我一直安慰自己救湖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布涎才。 她就那樣靜靜地躺著鞋既,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耍铜。 梳的紋絲不亂的頭發(fā)上邑闺,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機(jī)與錄音棕兼,去河邊找鬼陡舅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛程储,可吹牛的內(nèi)容都是我干的蹭沛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼章鲤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咆贬?” 一聲冷哼從身側(cè)響起败徊,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掏缎,沒想到半個(gè)月后皱蹦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煤杀,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年沪哺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沈自。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辜妓,死狀恐怖枯途,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情籍滴,我是刑警寧澤酪夷,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站孽惰,受9級特大地震影響晚岭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜勋功,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一坦报、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧狂鞋,春花似錦燎竖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至疏咐,卻和暖如春纤掸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浑塞。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工借跪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酌壕。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓掏愁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親卵牍。 傳聞我的和親對象是個(gè)殘疾皇子果港,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354