【问题标题】:ggplot gridded SpatialPolygonsDataFrame producing odd triangles and subsetting data based on point dataggplot gridded SpatialPolygonsDataFrame 根据点数据生成奇数三角形和子集数据
【发布时间】:2021-04-22 21:39:12
【问题描述】:

使用下面的代码,我可以绘制以下内容: 此代码改编自here

如您所见,情节几乎没有问题。我正在努力

  1. 删除情节中的奇怪线条
  2. 仅绘制有数据的单元格(网格)
  3. 在网格单元格顶部绘制 ID(请参阅 gridSpatialPolygons$values)

我知道这个问题有几点,但我希望一个解决方案可以解决所有问题。

# Load libraries
library(sp)
library(raster)
library(ggplot2)

# Projection
wgs.84 <- CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,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))

【问题讨论】:

    标签: r ggplot2 gis raster sp


    【解决方案1】:

    当涉及到空间对象时,ggplot2(以及一般的 tidyverse)似乎与sf 一起玩得比sp 更好。以下建议取自相关broom 包中的帮助文件之一:

    请注意,sf 包现在定义了整洁的空间对象,并且是 推荐的空间数据方法。 sp 整理者可能是 在不久的将来不推荐使用 sf::st_as_sf()。发展 的sp tidiers 已在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))
    

    【讨论】:

    • 太棒了 - 谢谢你的解释。使用真实数据需要相当长的时间,但它很有效。非常感谢!倾注于这个问题的时间(和压力!)刚刚解决!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多