减少 shp 地图等值线的处理时间

Posted

技术标签:

【中文标题】减少 shp 地图等值线的处理时间【英文标题】:Decreasing processing time for shp map choropleth 【发布时间】:2016-05-30 04:42:20 【问题描述】:

我正在制作一张来自阿根廷的等值线地图,我将在其中绘制一些数据。

我可以毫无问题地放置地图,并在其上绘制一些数据。比如这样:

问题是我认为 R 渲染地图的质量太高(我不需要)并且处理时间很长。 (约 3 分钟)显示该等值线。这是我正在使用的代码。

arg_shp <- readOGR("ARG_adm_shp/ARG_adm1.shp", "ARG_adm1")


puntos <- read.csv("puntos.csv", sep = ",", header = T)

arg_pv <- fortify(arg_shp, region = "NAME_1")

gg <- ggplot() 
gg <- gg + geom_map(data=arg_pv, map=arg_pv, 
                    aes(long, lat, map_id=id),
                    color="#2b2b2b", size=0.15, fill=NA)
gg <- gg + coord_map()
gg <- gg + ggthemes::theme_map()



gg + geom_map(data = puntos, aes(map_id = Provincia, fill = Puntos), 
              map = arg_pv)

或者我也尝试过使用类似的东西来看看它是否有任何不同。

ggplot() + geom_map(data = puntos, aes(map_id = Provincia, fill = Puntos), 
                    map = arg_pv) + expand_limits(x = arg_pv$long , y = arg_pv$lat) 

在尝试了一些数据之后,我很清楚导致处理需要很长时间的代码显然是

expand_limits

就像获取 fortify 表中所有 259k 数据点的信息一样。

有什么办法可以解决这个问题吗?

【问题讨论】:

ggplot() + geom_map(data = puntos, aes(map_id = Provincia, fill = Puntos), map = arg_pv) + expand_limits(x = arg_pv$long , y = arg_pv$lat) 中,我想知道您是否只需要经纬度的最小值和最大值。现在,在我看来,您正在使用 long 和 lat 的所有值。 【参考方案1】:

更新 ggplot2 映射“工作”O_o 的新方式

这个:

library(maptools)
library(rgdal)
library(raster)
library(rgeos)
library(ggplot2)
library(ggalt)
library(ggthemes)
library(viridis)
library(magrittr)

# as stated in the other answer, this is the same as your shapefile
arg_adm <- raster::getData('GADM', country='ARG', level=1)

# make the polygons a bit less verbose
gSimplify(arg_adm, 0.01, topologyPreserve=TRUE) %>% 
  SpatialPolygonsDataFrame(dat=arg_adm@data) -> arg_adm

# turn them into a data frame
arg_map <- fortify(arg_adm, region="NAME_1")

# use a gd projection for this region
arg_proj <- "+proj=aeqd +lat_0=-37.869859624840764 +lon_0=-66.533203125"

# reproducibly simulate some data
set.seed(1492)
puntos <- data.frame(id=c("Buenos Aires", "Córdoba", "Catamarca", "Chaco", "Chubut",
                          "Ciudad de Buenos Aires", "Corrientes", "Entre Ríos", "Formosa", 
                          "Jujuy", "La Pampa", "La Rioja", "Mendoza", "Misiones", "Neuquén", 
                          "Río Negro", "Salta", "San Juan", "San Luis", "Santa Cruz", 
                          "Santa Fe", "Santiago del Estero", "Tierra del Fuego", "Tucumán"),
                     value=sample(100, 24))

# plot it
gg <- ggplot() 

# necessary in the new world of ggplot2 mapping O_o
gg <- gg + geom_blank(data=arg_map, aes(long, lat))

# draw the base polygon layer
gg <- gg + geom_map(data=arg_map, map=arg_map, 
                    aes(map_id=id),
                    color="#b2b2b2", size=0.15, fill=NA)
# fill in the polygons
gg <- gg + geom_map(data=puntos, map=arg_map,
                    aes(fill=value, map_id=id),
                    color="#b2b2b2", size=0.15)

gg <- gg + scale_fill_viridis(name="Scale Title")
gg <- gg + coord_proj(arg_proj)
gg <- gg + theme_map()
gg <- gg + theme(legend.position=c(0.8, 0.1))
gg

在我的系统上真的快速渲染:

benchplot(gg)

##        step user.self sys.self elapsed
## 1 construct     0.000    0.000   0.000
## 2     build     0.029    0.002   0.031
## 3    render     0.206    0.006   0.217
## 4      draw     0.049    0.001   0.051
## 5     TOTAL     0.284    0.009   0.299

尝试遵循上述成语与您正在做的事情,或将dput(puntos) 的输出发布到您的问题中,以便重现。另外:在您的问题中继续包含整个 RStudio 窗口实际上既无帮助也无济于事。

【讨论】:

感激不尽。这对我来说也很快。非常感谢,为什么其他渲染这么慢? 不完全确定,因为我没有尝试使用您的数据和方法进行复制。这是使用 ggplot2 进行 GIS 操作的“标准”方式。就像“真正的” GIS 程序中的图层一样。 知道了。你让它看起来很简单。 @hrbrmstr 我刚刚意识到geom_map() 不像 aes() 中的 x 和 y 那样需要很长时间和 lat。我检查了 CRAN 手册中的函数示例。哈德利使用了expand_limits()。这是我们现在可以在 ggplot 中指定 long 和 lat 的唯一方法吗?至少当我们使用 geom_map() 时,这似乎是唯一的方法。如果你知道什么,你能分享你的知识吗? @jazzurro 有点。让我模拟一些东西。我会说 ggplot2 的最新 CRAN 版本感觉就像大众对他们的柴油车所做的那样。

以上是关于减少 shp 地图等值线的处理时间的主要内容,如果未能解决你的问题,请参考以下文章

GeoDa绘制疫情地图

使用谷歌地图绘制等值线

无法在布局了邮政编码的叶子地图上绘制等值线数据

移动端H5地图矢量SHP网格切分打包方案

shp数据转为geojson格式作为ECharts地图扩展文件

GeoTools介绍环境安装读取shp文件并显示