Картографирование с использованием карт ggmap и Stamen в R: маркировка точек и масштаба - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь составить карту места моего обучения, используя карты ggmap и Stamen. Я видел несколько похожих вопросов, но не нашел способа включить решение в мой код карты Stamen.

У меня есть два вопроса по этому поводу: 1. Как я могу пометить точки на карте карта? 2. Как добавить масштаб к картам в Stamen map? (либо как линия, указывающая расстояние, либо что-то вроде x см на карте = y км в реальной жизни)

Tcoords <- read.csv("Tcoords.csv")

Мой файл выглядит так

# trap latitude longitude
1 52.34431 0.5374620
2 52.34281 0.5382080
3 52.34468 0.5406787
4 52.34357 0.5398280
5 52.34431 0.5397050
6 52.34516 0.5406294

В ответ на предложение, Я вставил результаты в dput(head(Tcoords)) здесь:

 structure(list(trap = c("1", "2", "3", "4", "5", "6"), latitude = c(52.344312, 
52.342809, 52.3446849, 52.343572, 52.34431, 52.3451601), longitude = c(0.537462, 
0.538208, 0.5406787, 0.539828, 0.539705, 0.5406294)), row.names = c(NA, 
6L), class = "data.frame")

Это код, который я использую для построения точек

center = c(lon = 0.5406294, lat = 52.3451601)
qmap(center, zoom = 16, source = "stamen", maptype = "watercolor")+ 
      geom_point(aes(x = longitude, y = latitude), size = 4, shape = 21, 
                 fill = "dark green", data = Tcoords)

Но почему-то ловушка не распознается как объект. Вероятно, это что-то элементарное, но я не совсем уверен, что я упустил (новичок в R). Я сохранил здесь «ловушку» как текстовый объект.

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 30 мая 2020

Нанесение надписей на карту было просто вопросом переопределения источника данных в функции geom_text().
Чтобы получить масштаб для печати на карте, нужно было следовать решению в этом вопрос: Есть ли способ добавить масштабную линейку (для линейных расстояний) в ggmap?

#get base map
map.base <- get_map(location = center, zoom = 16, source = "stamen", maptype = "watercolor") # could also use zoom = "auto"
#get extent of base map
bb <- attr(map.base,"bb")

#define the location and length of scale bar
sbar <- data.frame(lon.start = c(bb$ll.lon + 0.1*(bb$ur.lon - bb$ll.lon)),
                   lon.end = c(bb$ll.lon + 0.25*(bb$ur.lon - bb$ll.lon)),
                   lat.start = c(bb$ll.lat + 0.1*(bb$ur.lat - bb$ll.lat)),
                   lat.end = c(bb$ll.lat + 0.1*(bb$ur.lat - bb$ll.lat)))

#Calculate distance in meters
library(geosphere)
sbar$distance = distGeo(c(sbar$lon.start,sbar$lat.start), c(sbar$lon.end,sbar$lat.end))

map.scale <- ggmap(map.base, extent="device")   +
   geom_point(aes(x = longitude, y = latitude), size = 4, shape = 21, fill = "dark green", data = Tcoords) +
   geom_text(data=Tcoords, aes(label=trap, x = longitude, y = latitude), nudge_x = 0.0001, nudge_y = 0.0001, color="black") +

   geom_segment(data = sbar,  aes(x = lon.start, xend = lon.end, y = lat.start, yend = lat.end)) +
   geom_text(data = sbar,  aes(x = (lon.start + lon.end)/2,
                 y = lat.start + 0.025*(bb$ur.lat - bb$ll.lat),
                 label = paste(format(distance,   digits = 4, nsmall = 2), 'm')),
             hjust = 0.5, vjust = 0)  
map.scale

enter image description here

май необходимо настроить nudge_x & _y в функции geom_text() для правильного размещения метки.

...