R语言 ggmap/sf是否仍在错误的位置绘制点?

dm7nw8vv  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(96)

这个老的bug仍然没有解决,或者有一个合理的解决方案吗?
部分城市:

require(ggplot2)
require(ggmap)
require(sf)

cities = sf::read_sf('{
  "type": "FeatureCollection",
  "name": "cities",
  "crs": {
    "type": "name",
    "properties": {
      "name": "urn:ogc:def:crs:OGC:1.3:CRS84"
    }
  },
  "features": [{
      "type": "Feature",
      "properties": {
        "city": "London"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [-0.13, 51.51]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "city": "Rome"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [12.48, 41.89]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "city": "Stockholm"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [18.07, 59.33]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "city": "Istanbul"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [28.96, 41.01]
      }
    }
  ]
}
')

和一个ggmap底图:

bb = c(left = -11, bottom = 35, right = 42, top = 65)
europe = ggmap::get_stamenmap(bbox = bb, maptype = 'toner-lite', zoom = 3)

ggmap(europe) + 
  geom_sf(data = cities, inherit.aes = FALSE, col = 'red', size = 3)

sbdsn5lh

sbdsn5lh1#

我认为问题在于ggmap使用坐标对象CoordMap来决定光栅的像素位置。通过切换到coord_sf(当您添加geom_sf图层时会发生这种情况),您会使光栅失去对齐。如果你提取点的坐标,你可以简单地将它们叠加成一个geom_point层:

ggmap(europe) + 
  geom_point(data = as.data.frame(st_coordinates(cities)), aes(X, Y), 
             inherit.aes = FALSE, col = 'red', size = 3)

如果你想绘制更复杂的sf对象,那么我会远离ggmap,使用maptiles

library(maptiles)
library(tidyterra)

bb <- c(left = -11, bottom = 35, right = 42, top = 65)

europe <- matrix(bb, 2, byrow = TRUE) |>
  st_multipoint()       |> 
  st_sfc(crs = 4326)    |>
  st_transform(3857) |>
  get_tiles(provider = "Stadia.Stamen.TonerLite", zoom = 4, crop = TRUE)

ggplot() +
  geom_spatraster_rgb(data = europe) +
  geom_sf(data = cities, size = 3, color = "red") +
  coord_sf(crs = 3857, expand = FALSE, ylim = st_bbox(europe)[c(2, 4)])

相关问题