【问题标题】:Converting lat/long into correct format将纬度/经度转换为正确的格式
【发布时间】:2020-05-19 14:40:27
【问题描述】:

我有一些看起来像这样的数据:

     long_bnk                 lat_bnk                  
[1,] "3<U+00B0> 52' 30.1\" W" "40<U+00B0> 44' 3.7\" N" 
[2,] "2<U+00B0> 44' 54.4\" E" "42<U+00B0> 7' 18.1\" N" 
[3,] NA                       NA                       
[4,] "2<U+00B0> 7' 54.2\" E"  "41<U+00B0> 31' 21.9\" N"
[5,] "0<U+00B0> 1' 54.5\" W"  "39<U+00B0> 58' 59.3\" N"
[6,] "3<U+00B0> 41' 15.5\" W" "40<U+00B0> 27' 47.2\" N"

我正在尝试将数据转换为正确的纬度/经度格式。我正在运行以下命令:

pts_bnk[pts_bnk==""] <- NA 
pts_bnk <- pts_bnk[complete.cases(pts_bnk),]
pts_bnk <- matrix(as.numeric(sp::char2dms(as.vector(pts_bnk), "°")), ncol=2)

但是,我不断得到:

if (any(abs(object@deg) > 90)) return("abs(degree) > 90") 中的错误:
需要 TRUE/FALSE 的缺失值另外:警告消息:在 asMethod(object) : 强制引入的 NAs

在转换为正确的纬度/经度格式时我哪里出错了? 数据:

pts_bnk <- structure(c("3<U+00B0> 52' 30.1\" W", "2<U+00B0> 44' 54.4\" E", 
NA, "2<U+00B0> 7' 54.2\" E", "0<U+00B0> 1' 54.5\" W", "3<U+00B0> 41' 15.5\" W", 
"40<U+00B0> 44' 3.7\" N", "42<U+00B0> 7' 18.1\" N", NA, "41<U+00B0> 31' 21.9\" N", 
"39<U+00B0> 58' 59.3\" N", "40<U+00B0> 27' 47.2\" N"), .Dim = c(6L, 
2L), .Dimnames = list(NULL, c("long_bnk", "lat_bnk")))

编辑:

基本上我想使用以下方法绘制数据:

library(ggrepel)
library(ggmap)
register_google(key = "MyKey")
spain <- get_map("Spain", zoom = 6)
ggmap(spain, extent = "normal") +
geom_point()

编辑 2:

我拥有的原始数据(有效)如下:

dms_lat <- readLines(n=5)
1  40° 25' 35.8" N
2  40° 26' 28.4" N
3  40° 28' 39.8" N
4                 
5  38° 59' 15.0" N
dms_long <-readLines(n=5)
1   3° 41' 19.9" W
2   3° 47' 42.2" W
3   3° 41' 11.7" W
4                 
5   3° 55' 29.6" W
pts <- cbind(dms_long, dms_lat)
pts <- sub("^\\d+\\s+", "", pts)
pts[pts==""] <- NA
pts <- pts[complete.cases(pts),]
pts <- matrix(as.numeric(sp::char2dms(as.vector(pts), "°")), ncol=2)
library(rworldmap)
plot(subset(getMap(resolution = "low"), NAME=="Spain"))
points(pts[,1], pts[,2], col = "red", pch=3, cex = 0.6)

我拥有的当前数据(不起作用)是:

x <- structure(c("3<U+00B0> 52' 30.1\" W", "2<U+00B0> 44' 54.4\" E", 
NA, "2<U+00B0> 7' 54.2\" E", "0<U+00B0> 1' 54.5\" W", "3<U+00B0> 41' 15.5\" W", 
"40<U+00B0> 44' 3.7\" N", "42<U+00B0> 7' 18.1\" N", NA, "41<U+00B0> 31' 21.9\" N", 
"39<U+00B0> 58' 59.3\" N", "40<U+00B0> 27' 47.2\" N"), .Dim = c(6L, 
2L), .Dimnames = list(NULL, c("long_bnk", "lat_bnk")))

x %>%
  data.frame() %>% 
  mutate(
    lat = sub("<U\\+00B0>", "\u00B0", lat_bnk),
    long = sub("<U\\+00B0>", "\u00B0", long_bnk)
  ) %>% 
  select(lat, long) %>% 
  drop_na()

我正在尝试使第二个数据等于第一个数据,以便可以使用ggmap() 绘制它。

【问题讨论】:

  • 您可能需要更换&lt;U+00B0&gt;
  • 我正在尝试sub("\\&lt;[^\\]]*\\&gt;", "", pts_long),但运气不佳。
  • 抱歉,我没有测试您的代码的密钥。可能是其他人会测试它
  • 谢谢,无论如何!
  • gsub("&lt;U\\+00B0&gt;", "\u00B0", as.vector(pts_bnk))

标签: r


【解决方案1】:

根据我们的 cmets,让我知道这是否适合您:

library(rworldmap)
library(sp)
library(dplyr)

pts <- x %>%
  data.frame() %>% 
  mutate(
    lat = sub("<U\\+00B0>", "d", lat_bnk),
    long = sub("<U\\+00B0>", "d", long_bnk)
  ) %>% 
  select(lat, long) %>% 
  drop_na()

pts_long <- as.numeric(char2dms(pts[["long"]]))
pts_lat <- as.numeric(char2dms(pts[["lat"]]))

plot(subset(getMap(resolution = "low"), NAME=="Spain"))
points(pts_long, pts_lat, col = "red", pch=3, cex = 0.6)

注意char2dms的用法如下:

char2dms(from, chd = "d", chm = "'", chs = "\"")

其中度数字符终止符的默认值是字母d(如果未指定chd,则可以替代度数符号)。

使用ggmap可以在geom_point中传递经度和纬度:

library(ggrepel)
library(ggmap)
library(ggthemes)

pts_data <- data.frame(pts_long, pts_lat)

# Note requires Google key
spain <- ggmap::get_map("Madrid, Spain", zoom = 6)
ggmap(spain, extent = "normal") +
  geom_point(data = pts_data, aes(x = pts_long, y = pts_lat)) +
  theme_map()

【讨论】:

  • 谢谢,这太完美了!如何将pts_longpts_lat 传递给geom_point。我想做的是:ggmap(spain, extent = "normal") + geom_point(aes(x = Long, y = Lat), data = pts, alpha = 1, size = 6, shape = 22, color = "black", stroke = 1) 一旦我使用get_mapggmap 下载了地图。
【解决方案2】:

我们可以在末尾添加mutate_at

library(dplyr)
x %>%
  data.frame() %>% 
  mutate(
    lat = sub("<U\\+00B0>", "\u00B0", lat_bnk),
    long = sub("<U\\+00B0>", "\u00B0", long_bnk)
  ) %>% 
  select(lat, long) %>% 
  drop_na()%>% 
  mutate_at(vars(matches('^(lat|long)')), ~ as.numeric(sp::char2dms(., "°")))

【讨论】:

  • 我的数据中有一个额外的列,因此mutate_all 将其删除。我怎样才能使用mutate_at 来改变latlong。我目前的尝试是mutate_at(vars(lat, long), funs(as.numeric(sp::char2dms(., "°"))))
  • @user113156 因为我们已经创建了纬度/经度,那么你的尝试非常好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2016-03-21
相关资源
最近更新 更多