openlayers5使用GeoJSON數(shù)據(jù)渲染熱力圖

GIS開發(fā)中會遇到需要使用熱力圖Heatmap的時候虹茶,openlayers5官方示例給出的是kml文件描述的熱力圖數(shù)據(jù),開發(fā)中接觸更多的還是GeoJSON格式峰搪,本文就使用GeoJSON格式來實現(xiàn)一個熱力圖。


地震熱力圖

一、實現(xiàn)思路

https://openlayers.org/en/latest/examples/heatmap-earthquakes.html
官方例子是從一個kml文件解析出生成的熱力圖赖捌,那么我們先分析一下生成一個熱力圖需要哪些數(shù)據(jù):

  • 地點
  • 坐標(biāo)
  • 震級
    基本上我們有了這三個數(shù)據(jù)就可以描述一個地點的地震情況了。
    接下來我們看一下官方例子里使用了哪些技術(shù)矮烹,核心代碼:
//前面省略了import語句等越庇,詳見官方的Demo
    var vector = new HeatmapLayer({
        source: new VectorSource({
          url: 'data/kml/2012_Earthquakes_Mag5.kml',
          format: new KML({
            extractStyles: false
          })
        }),
        blur: parseInt(blur.value, 10),
        radius: parseInt(radius.value, 10)
      });

      vector.getSource().on('addfeature', function(event) {
           var name = event.feature.get('name');
        var magnitude = parseFloat(name.substr(2));
        event.feature.set('weight', magnitude - 5);
      });

openlayers5有一個 ol/layer/heatmap 類,用來渲染熱力圖奉狈,那么稍微研究一下初始化該類型對象的代碼:

 var vector = new HeatmapLayer({
        source: new VectorSource({
          url: 'data/kml/2012_Earthquakes_Mag5.kml',
          //實際上我們只需要把這里的source對象換成GeoJSON對象就可以使用GeoJSON描述的數(shù)據(jù)源了
            format: new KML({
            extractStyles: false
          })
        }),
        blur: parseInt(blur.value, 10),
        radius: parseInt(radius.value, 10)
      });

可以看到初始化source的時候卤唉,format初始化為一個KML對象,那么我們一會試試把它換成GeoJSON對象仁期。

下面一段代碼是在這個熱力圖圖層添加要素的時候觸發(fā)的addfeatrue事件上面綁定一個回調(diào)函數(shù)桑驱,是做什么的呢?我們先看一下kml文件跛蛋,重點關(guān)注Placemark字段:

<Placemark id="2012 Jan 15 13:40:16.40 UTC">
                <name>M 5.9 - 2012 Jan 15, SOUTH SHETLAND ISLANDS</name>
                <magnitude>5.9</magnitude>
                <Point>
                    <coordinates>-56.072,-60.975,0</coordinates>
                </Point>
            </Placemark>

然后對照回調(diào)函數(shù)的代碼看一下:

  vector.getSource().on('addfeature', function(event) {
          //從name字段取得字符串: M 5.9 - 2012 Jan 15, SOUTH SHETLAND ISLANDS
           var name = event.feature.get('name');
        //從子串中取得浮點數(shù):5.9
        var magnitude = parseFloat(name.substr(2));
        //設(shè)定feature的權(quán)重weight為:5.9-5=0.9
        event.feature.set('weight', magnitude - 5);
      });

分析完這一段代碼之后熬的,我們就可以自己動手了。

二赊级、實現(xiàn)步驟

首先我們得搞一些GeoJSON描述的地震數(shù)據(jù):
https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojson
為了調(diào)試方便我下載到了本地保存為earthquake.json押框。

首先改造heatmap初始化過程:

  let heatMapLayer = new HeatmapLayer({
    source: new VectorSource({
      //我們使用json數(shù)據(jù)
      url: './earthquake.json',
      format: new GeoJSON()
    }),
    //這里可以根據(jù)自己項目的實際,綁定頁面的控件動態(tài)調(diào)整
    blur: 5,
    radius: 5
  });

然后我們看一下GeoJSON格式理逊,每一個地震點的信息就是這樣來表示的:

{
            "type": "Feature",
            "properties": {
                "mag": 1.36,
                "place": "6km W of Cobb, CA",
                "time": 1554968762010,
                "updated": 1554969663578,
                "tz": -480,
                "url": "https://earthquake.usgs.gov/earthquakes/eventpage/nc73163930",
                "detail": "https://earthquake.usgs.gov/earthquakes/feed/v1.0/detail/nc73163930.geojson",
                "felt": null,
                "cdi": null,
                "mmi": null,
                "alert": null,
                "status": "automatic",
                "tsunami": 0,
                "sig": 28,
                "net": "nc",
                "code": "73163930",
                "ids": ",nc73163930,",
                "sources": ",nc,",
                "types": ",geoserve,nearby-cities,origin,phase-data,scitech-link,",
                "nst": 25,
                "dmin": 0.01216,
                "rms": 0.04,
                "gap": 32,
                "magType": "md",
                "type": "earthquake",
                "title": "M 1.4 - 6km W of Cobb, CA"
            },
            "geometry": {
                "type": "Point",
                "coordinates": [-122.7946701, 38.8251648, 2.4]
            },
            "id": "nc73163930"
        },
……

顯而易見橡伞,mag字段就是地震的震級盒揉,是我們需要的,place是發(fā)生的地點兑徘,geometry的信息就是這個feature的形態(tài)预烙。

  • 地點√
  • 坐標(biāo)√
  • 震級√

似乎萬事俱備了。
最后我們需要實現(xiàn)的就是回調(diào)函數(shù):

 heatMapLayer.getSource().on('addfeature', function(event) {
    var place = event.feature.get('place');
    var magnitude = event.feature.get('mag');
    //設(shè)定權(quán)重減去的數(shù)字是為了過濾地震等級道媚,比如只想顯示3級以上地震扁掸,那就減去3
    event.feature.set('weight', magnitude-3);  
  });

效果圖:


效果圖
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市最域,隨后出現(xiàn)的幾起案子谴分,更是在濱河造成了極大的恐慌,老刑警劉巖镀脂,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牺蹄,死亡現(xiàn)場離奇詭異,居然都是意外死亡薄翅,警方通過查閱死者的電腦和手機沙兰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翘魄,“玉大人鼎天,你說我怎么就攤上這事∈罹梗” “怎么了斋射?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長但荤。 經(jīng)常有香客問我罗岖,道長,這世上最難降的妖魔是什么腹躁? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任桑包,我火速辦了婚禮,結(jié)果婚禮上纺非,老公的妹妹穿的比我還像新娘哑了。我一直安慰自己,他們只是感情好铐炫,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布垒手。 她就那樣靜靜地躺著蒜焊,像睡著了一般倒信。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泳梆,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天鳖悠,我揣著相機與錄音榜掌,去河邊找鬼。 笑死乘综,一個胖子當(dāng)著我的面吹牛憎账,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卡辰,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胞皱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了九妈?” 一聲冷哼從身側(cè)響起反砌,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎萌朱,沒想到半個月后宴树,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡晶疼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年酒贬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翠霍。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锭吨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寒匙,到底是詐尸還是另有隱情耐齐,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布蒋情,位于F島的核電站埠况,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏棵癣。R本人自食惡果不足惜辕翰,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望狈谊。 院中可真熱鬧喜命,春花似錦、人聲如沸河劝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赎瞎。三九已至牌里,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牡辽。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工喳篇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人态辛。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓麸澜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親奏黑。 傳聞我的和親對象是個殘疾皇子炊邦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容