您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何最優雅的操縱json地圖數據,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
知道最近在leaflet社區瀏覽案例的時候,發現大神已經提供了很好的json數據解析方案里,起碼有兩個(保守估計)以上的包可以完勝這個任務,而且是直接調用現成的函數,無需自己編寫方案。
以上所說的解決方案就是利用成熟的json接口(I/O)工具:
geojsonio包和rgdal包:
這兩個包可以在主流的空間格式數據之間進行無縫轉換。
下面以世界地圖為例,演示數據的轉換過程。
library("jsonlite")
library("ggplot2")
library(plyr)
library(dplyr)
library(geojsonio)
library(rgdal)
如果還是停留在使用jsonlite包手工提取數據時代,你可能需要經歷以下不可描述的代碼環節:
setwd("D:/R/mapdata/State")
###
world_data <- fromJSON("world.json")
world_city_data<-world_data$features$properties[,1:2]
world_city_data<-world_data$features$properties[,c("NAME","NAME_LONG","BRK_A3","POP_EST","GDP_MD_EST")]
world_data$features$geometry$coordinates[[1]][,,1]
world_data$features$geometry$coordinates[[1]][,,2]
###
而且以上代碼還不能保證每次都好用,可能每遇到一個新的素材,隨著josn內部層級嵌套結構的變化,你都需要隨之更改代碼,工作量那是杠杠的~
可是如果你掌握了以下兩個工具,那么josn數據操縱起來基本就沒煩惱了,就跟之前操縱shp數據一樣,這兩個工作就是將json直接導入成控件格式數據,方便使用者進一步提取內部信息。
world_Map1<-geojson_read("world.json",what="sp") #geojsonio包導入
world_Map2<-readOGR("world.json","OGRGeoJSON") #rgdal包導入
world_Mapdata1<-world_Map1@data%>%.[,c("NAME","NAME_LONG","BRK_A3","POP_EST","GDP_MD_EST")]%>%rename(region=NAME)
world_Mapdata1$id<-rownames(world_Mapdata1)
world_MapdataPloygon1<-fortify(world_Map1)%>%left_join(.,world_Mapdata1[,c(6,1,4)])
ggplot(world_Mapdata1,aes(map_id=region))+
geom_map(aes(fill=POP_EST),map=world_MapdataPloygon1)+
expand_limits(x=world_MapdataPloygon1$long,y=world_MapdataPloygon1$lat)+
scale_fill_gradient2(low="#33A15A",high="#BB0126",mid="#FCFFB7",midpoint=mean(world_Mapdata1$POP_EST))+
coord_map("ortho",orientation=c(0,120,0))+
scale_y_continuous(breaks=(-6:6)*15) +
scale_x_continuous(breaks=(-12:12)*15)+
theme_minimal()+
theme(axis.text=element_blank(),axis.title=element_blank())
一個案例應用(來自plotly官網社區,本來是用于展示plot_ly函數應用,這里借用一下)
air <- read.csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_us_airport_traffic.csv')
flights <- read.csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_aa_flight_paths.csv')
flights$id <- seq_len(nrow(flights))
CairoPNG("D:/world_map.png",1000,900)
showtext.begin()
ggplot()+
geom_polygon(data=world_MapdataPloygon1,aes(x=long,y=lat,group=group),fill="grey95",col="grey")+
geom_segment(data=flights,aes(x=start_lon,y=start_lat,xend=end_lon,yend=end_lat),col="red",size=.2)+
geom_point(data=air,aes(x=long,y=lat,size=cnt),shape=21,fill="#D73434",col="grey",alpha = 0.5)+
scale_y_continuous(breaks=(-6:6)*15) +
scale_x_continuous(breaks=(-12:12)*15)+
scale_size_area(max_size=15)+
coord_map("ortho",orientation=c(25,-100,0))+
theme_minimal()+
theme(axis.text=element_blank(),axis.title=element_blank())
showtext.end()
dev.off()
最新版的ggplot2中已經出現了一個新的圖層函數——geom_sf,專門用于處理空間數據格式,這樣算起來,ggplot系統中已經有至少三個可以處理空間數據的函數了,geom_polygon\geom_map\geom_sf(如果不算ggmap這種外接函數的話)。
以上就是如何最優雅的操縱json地圖數據,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。