1

我试图在极坐标上画线ggmap。一般方法适用于ggplot

library(ggmap)
library(rgdal)
library(ggplot2)

#####################################


## build data frame with triangulation data

t1 <- c(534325, 4858925, 338, 0955)
t2 <- c(534383, 4859261, 290, 1010)
t3 <- c(534386, 4859011, 301, 1015)

df <- as.data.frame(rbind(t1, t2, t3))
colnames(df) <- c("Easting", "Northing", "Azimuth", "Time")
df$Time <- as.character(df$Time)

## plot coordinates with triangulation

ggplot(df, aes(x=Easting, y=Northing, label=Time)) + 
  geom_point() + 
  geom_text(nudge_x = 50) + 
  geom_spoke(aes(angle = Azimuth, radius = -500)) + 
  theme_bw()

没有底图的三角测量:

图像1

这就是我想要的,但背景中没有底图。

但是,当我尝试这种方法时ggmap

## convert utms to lat long

utmcoor <- SpatialPoints(cbind(df$Easting,df$Northing), 
proj4string=CRS("+proj=utm +zone=12"))
lonlatcoor <- as.data.frame(spTransform(utmcoor,CRS("+proj=longlat")))
colnames(lonlatcoor) <- c("lon", "lat")

df$lon <- lonlatcoor$lon
df$lat <- lonlatcoor$lat

## plot on base map

zoom <- 15 

meanlon <- mean(df$lon)
meanlat <- mean(df$lat)

basemap <- get_googlemap(center=c(lon=meanlon, lat=meanlat), zoom=zoom, 
maptype="hybrid")

ggmap(basemap) + 
  geom_point(aes(x=lon, y=lat), colour="red", size=2, data=df) +
  geom_spoke(aes(x=lon, y=lat, angle = Azimuth), data=df, radius=-200) + 
  theme_void()

我得到错误

Warning message:
Removed 3 rows containing missing values (geom_segment).

代码在没有geom_spoke线的情况下工作正常,导致底图没有三角测量:

img2

我知道这个功能通常用于箭袋图之类的东西。不ggmap支持geom_spoke?有没有我不知道的更好的功能?

提前致谢。

4

1 回答 1

1

问题在于坐标:您给出geom_spoke的半径为 -200,但您使用的坐标要小几个数量级。我拿出来theme_void只是为了提醒自己规模有多小;你想要一个像 0.01 这样的半径。弄乱我放在这里的半径值。

geom_spoke基本上在幕后做了一点三角函数来计算每个辐条的端点,然后绘制一个段。如果该端点超出绘图范围,则会收到缺失值警告。我不确定 -200 是你坚持的半径,还是只是一个虚拟值,但你可以使用原始坐标和角度来计算端点,然后投影这些点来计算半径。或者只是使用这些端点来绘制geom_segment自己。我会把这些计算留给你,否则可能会引起另一个问题。我非常偏爱sf并有一种感觉,可以提供一种足够简单的方法来获得这些分数。

library(ggmap)
library(rgdal)
library(ggplot2)

# .....
# everything up until ggmap is the same as in question

ggmap(basemap) + 
  geom_point(aes(x=lon, y=lat), colour="red", size=2, data=df) +
  geom_spoke(aes(x=lon, y=lat, angle = Azimuth), data=df, radius = -1e-2)

reprex 包(v0.2.0)于 2018 年 7 月 18 日创建。

于 2018-07-18T14:32:26.617 回答