简体   繁体   English

在 R 中使用 ggmap 和 Stamen 映射进行映射:标记点和比例

[英]Mapping using ggmap & Stamen maps in R: labelling points and scale

I'm trying to make a map of my study site using ggmap & Stamen maps.我正在尝试使用 ggmap 和 Stamen 地图制作我的研究站点的 map。 I've seen a few similar questions but haven't figured out a way to incorporate the solution into my Stamen map code.我已经看到了一些类似的问题,但还没有找到将解决方案合并到我的 Stamen map 代码中的方法。

I have two questions regarding this: 1. How can I custom label the points on the map?我对此有两个问题: 1. 如何自定义 label map 上的点? 2. How can I add a scale to maps in Stamen map? 2. 如何在 Stamen map 中为地图添加比例? (either as a line indicating distance or something like x cm on map = y km in real life) (作为指示距离的线或类似 map 上的 x cm = y km 在现实生活中)

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

My file looks like this我的文件看起来像这样

# 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

In response to the suggestion, I've pasted the results to dput(head(Tcoords)) here:作为对建议的回应,我将结果粘贴到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")

This the code I'm using to plot my points这是我用来 plot 我的观点的代码

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)

But somehow trap isn't being recognised as an object.但不知何故,陷阱没有被识别为 object。 It's probably something elementary but I'm not really sure what I've missed (new to R).这可能是一些基本的东西,但我不确定我错过了什么(R 的新手)。 I've saved "trap" as a text object here.我在这里将“陷阱”保存为文本 object。

Thanks for your help!谢谢你的帮助!

Getting the labels onto the map was just a matter of redefining the data source in the geom_text() function.将标签添加到 map 只需在geom_text() function 中重新定义数据源即可。
In order to get the scale to print on the map, it was a matter of following the solution in this question: Is there a way to add a scale bar (for linear distances) to ggmap?为了在 map 上打印比例,需要遵循这个问题中的解决方案: Is there a way to add a scale bar (for linear distances) to 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

在此处输入图像描述

May need to adjust the nudge_x & _y in the geom_text() function for proper label placement.可能需要调整geom_text() function 中的 nudge_x 和 _y 以正确放置 label。

I would like to suggest tmap as an alternative to ggmap .我想建议 tmap 作为tmap的替代ggmap This is one of many others possible packages for creating maps CRAN Task View: Spatial but I found the scale bar that tmap generates pretty nice and the code simple.这是创建地图CRAN 任务视图:空间的许多其他可能的包之一,但我发现tmap生成的比例尺非常好,代码也很简单。

The code to generate the final plot requires the following packages生成最终 plot 的代码需要以下包

# To create the map
library(tmap)
# To create the layer with the points given in Tcoords.csv
library(sf)
# To read the background map
library(tmaptools)
library(OpenStreetMap)

Then, we read the coordinates of the six points to be mapped and turn them into an sf object然后,我们读取要映射的六个点的坐标,并把它们变成一个sf object

# Read coordinates
Tcoords = dget("Tcoords.R")

# create an sf object for the six points in the file
coordinates = matrix(c(Tcoords$longitude, Tcoords$latitude), 6, 2)
tcoords_sfc = lapply(1:6, function(k) st_point(coordinates[k, ])) %>%
  st_sfc(crs = 4326)
tcoords_sf = st_sf(trap = Tcoords$trap, geometry = tcoords_sfc)

Next, we find the limits of the six points (bounding box) and extend them by a factor 2.5.接下来,我们找到六个点(边界框)的限制,并将它们扩展 2.5 倍。 You can play with this factor to get maps with other scales.你可以利用这个因素来获得其他比例的地图。

bb_new = bb(tcoords_sf, ext = 2.5)

Finally we read the background map最后我们阅读了背景map

map_osm = read_osm(bb_new, zoom = 15, type = "stamen-watercolor")

and draw the final map并画出最终的 map

带比例尺的地图

with the following code使用以下代码

tmap_mode("plot")
tm_shape(map_osm, projection = 4326, unit = "m") +
  tm_rgb() +
  tm_shape(tcoords_sf) + 
  tm_symbols(col = "darkgreen", shape = 21, size = 2) +
  tm_text(text = "trap", col = "white") +
  tm_scale_bar(breaks = c(0, 50, 100, 150, 200), text.size = 0.6) +
  tm_compass(position = c("left", "top"))

To get a dynamic map is even simpler as you do not have read first the basemap ( read_osm ) and then draw the map.要获得动态 map 甚至更简单,因为您无需先阅读底图 ( read_osm ),然后再绘制 map。

tmap_mode("view")
tm_shape(tcoords_sf, bbox = bb_new, unit = "m") + 
  tm_symbols(col = "darkgreen", shape = 21, size = 3) +
  tm_text(text = "trap", col = "white") +
  tm_basemap("Stamen.Watercolor") +
  tm_scale_bar()

In the static plot, colors, text and breaks in the scale can be personalized.在 static plot、colors 中,可以个性化刻度中的文本和中断。 Note the parameter unit = "m" in the tm_shape in order to get the scale in meters, if not it will be in kilometers.请注意tm_shape中的参数unit = "m"以获取以米为单位的比例,否则将以公里为单位。

Hope you will find this alternative worth mentioning.希望您会发现这个替代方案值得一提。

I would like to provide a solution that works with ggmap .我想提供一个适用于ggmap的解决方案。 The package ggsn by Oswaldo Santos link adds a scale bar to maps created with ggplot or ggmap . Oswaldo Santos 的 package ggsn链接为使用ggplotggmap创建的地图添加了比例尺。 It requires to play a bit with the parameters to find the right position of the scale bar, text size and text position.需要对参数进行一些操作才能找到比例尺的正确 position、文本大小和文本 position。

Hope you find it useful.希望你觉得它有用。

# packages required
library(ggmap)
#> Warning: package 'ggmap' was built under R version 4.0.3
#> Loading required package: ggplot2
#> Google's Terms of Service: https://cloud.google.com/maps-platform/terms/.
#> Please cite ggmap if you use it! See citation("ggmap") for details.

# package to draw scale bars in ggmap
library(ggsn)
#> Warning: package 'ggsn' was built under R version 4.0.3
#> Loading required package: grid

# coordinates
tcoords = data.frame(
  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),
  stringsAsFactors = F)

# get the stamen watercolor map
center = c(lon = 0.5406294, lat = 52.3451601)
bb_map = c(center["lon"] - 0.01, center["lat"] - 0.005,
  center["lon"] + 0.01, center["lat"] + 0.005)
names(bb_map) = c("left", "bottom", "right", "top")
map_osm2 = get_stamenmap(bb_map, zoom = 15, maptype = "watercolor")
#> Source : http://tile.stamen.com/watercolor/15/16432/10771.jpg
#> Source : http://tile.stamen.com/watercolor/15/16433/10771.jpg
#> Source : http://tile.stamen.com/watercolor/15/16434/10771.jpg
#> Source : http://tile.stamen.com/watercolor/15/16432/10772.jpg
#> Source : http://tile.stamen.com/watercolor/15/16433/10772.jpg
#> Source : http://tile.stamen.com/watercolor/15/16434/10772.jpg
#> Source : http://tile.stamen.com/watercolor/15/16432/10773.jpg
#> Source : http://tile.stamen.com/watercolor/15/16433/10773.jpg
#> Source : http://tile.stamen.com/watercolor/15/16434/10773.jpg

# plot the map, coordinates and scalebar
ggmap(map_osm2) +
  geom_point(data = tcoords, aes(x = longitude, y = latitude),
    size = 4, shape = 21, fill = "darkgreen") +
  scalebar(
    x.min = bb_map[1], x.max = bb_map[3],
    y.min = bb_map[2], y.max = bb_map[4],
    st.bottom = FALSE, dist = 100, dist_unit = "m",
    transform = TRUE, model = "WGS84",
    anchor = c( x = 0.548, y = 52.3410),
    st.size = 3, st.dist = 0.03) 

Created on 2020-11-08 by the reprex package (v0.3.0)reprex package (v0.3.0) 于 2020 年 11 月 8 日创建

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM