R语言在线地图神器:Leaflet for R包(五) GeoJson文件的使用
来源:互联网 发布:腾讯网络主播欣儿照片 编辑:程序博客网 时间:2024/05/22 04:57
七、使用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)
结果如下:
可以看见,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)
当然,还有同学问,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总量")
下面是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(万元)")
最后,提出几点注意事项:
1、GeoJson需要开销大量的内存,对比同等的空间对象来,它耗的内存,大约在5-8倍左右。所以如果你的节点特别多,那么geojson就会开销非常非常大,带来的结果就是非常非常慢……
2、GeoJson绘制在地图的时候,无法使用弹出窗。
总之一句话……如果你是做GIS的,有shapefile的应用能力(包括制作、编辑等技术能力),那么就别用geoJson吧。
- R语言在线地图神器:Leaflet for R包(五) GeoJson文件的使用
- R语言在线地图神器:Leaflet for R包(一)
- R语言在线地图神器:Leaflet for R包(二)基础底图
- R语言在线地图神器:Leaflet for R包(三) 符号标记
- R语言在线地图神器:Leaflet for R包(四) 弹出窗口和几何要素
- R语言在线地图神器:Leaflet for R包(六,完结篇)栅格、颜色和图例设置
- R语言:leaflet包做地图展示
- R语言神器
- R语言神器
- R语言 WDI包的使用
- R语言 tm包的使用
- R语言RMySQL包的使用注意事项
- R语言igraph包的使用
- R语言getopt包的使用
- R语言data.table包的使用
- R语言百度地图接口包
- R语言学习笔记︱Echarts与R的可视化包——地区地图
- R+大地图时代︱ leaflet/leafletCN 动态、交互式绘制地图(遍地代码图)
- d3.js学习4----做一个简单的图表
- 手把手入门神经网络系列(2)_74行代码实现手写数字识别
- 剑指offer:树的子结构
- poj 1990 MooFest(树状数组)
- hdu1789_Doing Homework again
- R语言在线地图神器:Leaflet for R包(五) GeoJson文件的使用
- IAP Cannot connect to iTunes Store
- 编译原理 - 课程设计(简易词法分析器)
- 【leetcode】416. Partition Equal Subset Sum
- px、em和rem
- 07-多种链表作业
- XList , simple your list
- Hadoop中dataNode启动不了
- Java 集合深入理解(10):Deque 双端队列