天天看點

R語言線上地圖神器:Leaflet for R包(五) GeoJson檔案的使用

七、使用GeoJson和TopoJson繪制地圖:

GeoJSON是一種對各種地理資料結構進行編碼的格式,基于Javascript對象表示法的地理空間資訊資料交換格式。GeoJSON對象可以表示幾何、特征或者特征集合。GeoJSON支援下面幾何類型:點、線、面、多點、多線、多面和幾何集合。GeoJSON裡的特征包含一個幾何對象和其他屬性,特征集合表示一系列特征。——百度百科

因為json天然的html特性,很容易加載到各種JS架構的應用中,比如百度的echart加載的地圖,就是geojson的,而作為原生态的leaflet架構,自然也能提供對geojson的支援。

另外一種格式就所謂的TopoJson,這種格式是geojson的一種更新版本,号稱可以比geojson節省更多的存儲空間和節點,leaflet for R提供兩種方法來支援這兩種格式,分别是:

addGeoJSON()

addTopoJSON()

下面來看如何使用:

我這裡有一份geojson的資料,是中國的行政區劃,叫做chain.json

geoData <- readLines("e:/china.json",warn=FALSE) %>%

  paste(collapse = "\n")%>%fromJSON(simplifyVector = FALSE)

geoData$style = list(

  weight = 1,

  color ="red",

  fillColor="green",

  opacity = 1,

  fill = TRUE,

  fillOpacity = 0.6

)

leaflet() %>% setView(lng = 98.583, lat = 39.833, zoom = 3) %>%

  addProviderTiles("Esri.WorldTopoMap")%>%addGeoJSON(geoData)

結果如下:

R語言線上地圖神器:Leaflet for R包(五) GeoJson檔案的使用

可以看見,json的方式加載地圖,還可以采用$style屬性的方式設定各種屬性,當然,也可以采用直接解除安裝addGeoJSON方法裡面來實作。

如果要設定每個面采用獨立的顔色,如何設定了,還是采用style的方法,如下:

下面用是全局變量和lapply方法,相應的說明,請參考R語言的相關教程。

geoData$style = list(

  weight = 1,

  color ="gray",

  opacity = 1,

  fill = TRUE,

  fillOpacity = 0.6

)

pal <- substr(rainbow(34),1,7)

i<-0

geoData$features <- lapply(geoData$features, function(feat) {

  i<<-i+1

  feat$properties$style <- list(

    fillColor = pal[i]

  )

  feat

})

leaflet() %>% setView(lng = 98.583, lat = 39.833, zoom = 3) %>%

  addProviderTiles("Esri.WorldTopoMap")%>%addGeoJSON(geoData)

R語言線上地圖神器:Leaflet for R包(五) GeoJson檔案的使用

當然,還有同學問,geoJson檔案去那裡找?這個網絡上有很多,但是網絡上的geojson檔案都是沒有屬性的,如果你需要有屬性的json檔案,可以自己做,我一般通過Python提供的geojson包自己來實作,回頭有時間可以寫一篇文章來介紹如何使用Python語言來制作geojson檔案。

下面我是我自己做的一個中國的geojson檔案裡面出了有中國的行政區劃以外,還有2009的gdp和2009年的人口。下面我來使用這個檔案來對地圖進行渲染:

library(jsonlite)

geoData2 <- readLines("e:/china_pop_gdp.json",warn=FALSE) %>%

  paste(collapse = "\n")%>%fromJSON(simplifyVector = FALSE)

geoData2$style = list(

  weight = 2,

  color ="gray",

  opacity = 1,

  fill = TRUE,

  fillOpacity = 0.9

)

GDP_2009 <- sapply(geoData2$features, function(feat) {

  feat$properties$GDP_2009

})

pal <- colorNumeric(c("blue", "white", "darkgreen", "yellow", "orangered"), GDP_2009)

geoData2$features <- lapply(geoData2$features, function(feat) {

  feat$properties$style <- list(

    fillColor = pal(feat$properties$GDP_2009)

  )

  feat

})

leaflet() %>% setView(lng = 98.583, lat = 39.833, zoom = 3) %>%

  addProviderTiles("Esri.WorldTopoMap")%>%addGeoJSON(geoData2)%>%

  addLegend("bottomright", pal = pal, values = GDP_2009,title = "2009年GDP總量")

R語言線上地圖神器:Leaflet for R包(五) GeoJson檔案的使用

下面是2009年的人均GDP專題圖:

geoData2 <- readLines("e:/china_pop_gdp.json",warn=FALSE) %>%

  paste(collapse = "\n")%>%fromJSON(simplifyVector = FALSE)

geoData2$style = list(

  weight = 2,

  color ="gray",

  opacity = 1,

  fill = TRUE,

  fillOpacity = 0.9

)

GDP_2009 <- sapply(geoData2$features, function(feat) {

  feat$properties$GDP_2009

})

POP_2009 <- sapply(geoData2$features, function(feat) {

  feat$properties$Pop_2009

})

#人均GDP專題圖

pal <- colorNumeric("Greens", (GDP_2009*10000)/max(1,POP_2009))

geoData2$features <- lapply(geoData2$features, function(feat) {

  feat$properties$style <- list(

    fillColor = pal((feat$properties$GDP_2009*10000)/max(1,feat$properties$Pop_2009))

  )

  feat

})

leaflet() %>% setView(lng = 98.583, lat = 39.833, zoom = 3) %>%

  addProviderTiles("Esri.WorldTopoMap")%>%addGeoJSON(geoData2)%>%

  addLegend("bottomright", pal = pal,value =(GDP_2009*10000)/(max(1,POP_2009)), title = "2009年人均GDP(萬元)")

R語言線上地圖神器:Leaflet for R包(五) GeoJson檔案的使用

最後,提出幾點注意事項:

1、GeoJson需要開銷大量的記憶體,對比同等的空間對象來,它耗的記憶體,大約在5-8倍左右。是以如果你的節點特别多,那麼geojson就會開銷非常非常大,帶來的結果就是非常非常慢……

繼續閱讀