问题描述
使用下面的代码,我可以绘制以下内容: 此代码改编自 here
如您所见,情节几乎没有问题。我正在努力
我意识到这个问题有几点,但我希望一个解决方案可以解决所有问题。
# Load libraries
library(sp)
library(raster)
library(ggplot2)
# Projection
wgs.84 <- CRS("+proj=longlat +datum=wgs84 +no_defs +ellps=wgs84 +towgs84=0,0")
# Load data
x <- c(76.82973,76.82972,76.82969,76.83076,76.83075,76.83071,76.83129,76.83126,76.83125)
y <- c(28.26734,28.26644,28.26508,28.26778,28.26733,28.26507,28.26912,28.26732,28.26687)
z <- c(-56.7879,-58.22462,-58.4211,-55.75333,-58.55153,-56.38619,-56.11011,-58.17415,-59.77212)
# Create data frame
dataset <- data.frame("LONGITUDE" = x,"LATITUDE" = y,"VALUES" = z)
# Create SpatialPointsDataFrame object
datasetSP <- SpatialPointsDataFrame(coords = dataset[,c(1,2)],data = data.frame("id" = 1:nrow(dataset),"values" = dataset$VALUES),proj4string = wgs.84)
# Extent
extentDatasetSP <-extent(datasetSP)
# Make grid options
# Cell size (map units)
xCellSizeGrid <- 0.001
yCellSizeGrid <- 0.001
# Grid
grid <- GridTopology(cellcentre.offset = c(extentDatasetSP@xmin,extentDatasetSP@ymin),cellsize = c(xCellSizeGrid,yCellSizeGrid),cells.dim = c(3,7))
# Create SpatialGrid object
gridSpatial <- SpatialGrid(grid = grid,proj4string = wgs.84)
# Convert to SpatialPixels object
gridSpatialPixels <- as(gridSpatial,"SpatialPixels")
# Convert to Spatialpolygons object
gridSpatialpolygons <- as(gridSpatialPixels,"Spatialpolygons")
# Add 'id' and 'values' to every polygon
gridSpatialpolygons$id <- 1:nrow(coordinates(gridSpatialpolygons))
gridSpatialpolygons$values <- paste("Gridvalue",1:nrow(coordinates(gridSpatialpolygons)),sep = ":")
# Get attributes from polygons
samplePointsInpolygons2 <- datasetSP %over% gridSpatialpolygons
ggplot(gridSpatialpolygons,aes(x = long,y = lat)) +
geom_polygon(color = "red") +
geom_point(data = dataset,aes(x = LONGITUDE,y = LATITUDE))
解决方法
谈到空间对象时,ggplot2
(以及一般的 tidyverse)似乎与 sf
的搭配比 sp
更好。以下建议取自相关 broom
包中的帮助文件之一:
请注意,sf
包现在定义了整洁的空间对象,并且是
空间数据的推荐方法。 sp
整理者很可能是
在不久的将来不赞成使用 sf::st_as_sf()
。发展
sp
个整理器已在 broom
停止。
转换为 sf
后,事情应该相当简单。
library(dplyr)
sf::st_as_sf(gridSpatialPolygons) %>%
filter(id %in% samplePointsInPolygons2$id) %>% # keep only grid cells with data
ggplot() +
geom_sf(colour = "red") +
geom_sf_text(aes(label = values),# label cells
nudge_y = 0.0003,colour = "grey40") +
geom_point(data = dataset,aes(x = LONGITUDE,y = LATITUDE))