标签: geosphere

找到r中某个纬度/经度距离内的位置

我有一个网格化数据集,可在以下位置获得数据:

lon <- seq(-179.75,179.75, by = 0.5)
lat <- seq(-89.75,89.75, by = 0.5)
Run Code Online (Sandbox Code Playgroud)

我想找到位于该位置500公里范围内的所有数据点:

mylat <- 47.9625
mylon <- -87.0431
Run Code Online (Sandbox Code Playgroud)

我的目标是在R中使用geosphere包,但我目前编写的方法效率似乎不高:

require(geosphere)
dd2 <- array(dim = c(length(lon),length(lat)))
for(i in 1:length(lon)){
  for(ii in 1:length(lat)){
    clon <- lon[i]
    clat <- lat[ii]
    dd <- as.numeric(distm(c(mylon, mylat), c(clon, clat), fun = distHaversine))
    dd2[i,ii] <- dd <= 500000
  }
}
Run Code Online (Sandbox Code Playgroud)

在这里,我循环遍历数据中的每个网格,并查找距离是否小于500 km.然后我存储一个TRUE或FALSE变量,然后我可以使用它来平均数据(其他变量).从这个方法,我想要一个TRUE或FALSE的矩阵,用于距离lat和lon 500公里范围内的位置.有没有更有效的方法来做到这一点?

r geosphere

19
推荐指数
2
解决办法
1675
查看次数

显示日夜区域的世界地图

我正在尝试将日间/夜间线路添加到世界地图ggplot中,以指示日夜区域; 这样的事情:

daynightexample

计划是在24小时的周期内为我的地图制作动画,如下所示:

sinewavetest

上面的动画是用正弦波实现的,我知道它是完全不准确的.我知道这geosphere::gcIntermediate可以让我绘制大圆线,就像这样:

library(ggplot2)
library(ggthemes)
library(geosphere)

sunPath1 <- data.frame(gcIntermediate(c(-179, -30), c(0, 30), n=100))
sunPath2 <- data.frame(gcIntermediate(c(0, 30), c(179, -30), n=100))
sunPath <- rbind(sunPath1, sunPath2)

ggplot(sunPath) +
  borders("world", colour = "gray95", fill = "gray90") +
  geom_ribbon(aes(lon, ymax = lat), ymin=-180, fill="black", alpha=0.2) +
  theme_map()
Run Code Online (Sandbox Code Playgroud)

greatcircletest

虽然我不确定是否有可能在一年中的不同点画出所需的线条,例如在三月看起来如此:

在天上


我没有找到解决方案的运气,但我猜我不知道要搜索的关键字,因为这超出了我的知识范围.我认为答案可能在日出方程中的某处,但我不知道如何应用这些来找到解决方案,我也不知道如何在一年中改变这些参数.这个网站(用于上面的情节)似乎也很有用,但我还不确定如何!

gis r great-circle ggplot2 geosphere

13
推荐指数
1
解决办法
832
查看次数

geosphere distHaversine()&dplyr - 向量错误长度错误,应为2

我无法解决错误:"当向量计算两个点(跑道入口/终点)之间的(跑道长度)距离"时,"向量的长度应该为2".更糟糕的是,我无法理解像这里的答案R错误:向量的长度错误,应为2并将它们应用于我的案例.(跑道末端)位置的简化数据框如下所示:

runways <-  data.frame(
 RWY_ID = c(1,2,3)
,RWY    = c("36R", "36L","01")
,LAT    = c(40.08, 40.12, 40.06)
,LON    = c(116.59, 116.57, 116.62)
,LAT2   = c(40.05, 40.07,40.09)
,LON2   = c(116.6, 116.57, 116.61)
)
Run Code Online (Sandbox Code Playgroud)

使用geosphere的distHaversine()函数,我尝试计算距离:

runways <- mutate(runways
                 , CTD = distHaversine( c(LON, LAT), c(LON2, LAT2))
                 )
Run Code Online (Sandbox Code Playgroud)

我不确定我在这里做错了什么.如果我拉出LON LAT位置,它是一个具有正确长度的数字向量.

myv <- c(runways$LON[1], runways$LAT[1])
myv

[1] 116.59  40.08
str(myv)
num [1:2] 116.6 40.1
Run Code Online (Sandbox Code Playgroud)

r dplyr geosphere

8
推荐指数
1
解决办法
4075
查看次数

在data.table上使用geosphere distm函数来计算距离

我创建了一个data.table,它有6列.我的data.table有一个列可以计算两个位置:位置1和位置2.我正在尝试使用distm函数来计算每行上位置之间的距离,从而创建第7列.geosphere包中的distm包需要针对每个纬度/长度组合使用两个不同的向量.我的下面的代码不起作用,所以我试图弄清楚如何为函数提供向量.

LOC_1_ID LOC1_LAT_CORD LOC1_LONG_CORD LOC_2_ID LOC2_LAT_CORD LOC2_LONG_CORD
 1       35.68440        -80.48090        70624    34.86752   -82.46632
 6       35.49770        -80.62870        70624    34.86752   -82.46632
10       35.66042        -80.50053        70624    34.86752   -82.46632
Run Code Online (Sandbox Code Playgroud)

假设res保存data.table,下面的代码不起作用.

 res[,DISTANCE := distm(c(LOC1_LAT_CORD, LOC1_LONG_CORD),c(LOC2_LAT_CORD, LOC2_LONG_CORD), fun=distHaversine)*0.000621371]
Run Code Online (Sandbox Code Playgroud)

如果我要拉出每个向量,该函数工作正常.

loc1 <- res[LOC1_ID == 1,.(LOC1_LAT_CORD, LOC1_LONG_CORD)]
loc2 <- res[LOC2_ID==70624,.(LOC2_LAT_CORD, LOC2_LONG_CORD)]
distm(loc1, loc2, fun=distHaversine)
Run Code Online (Sandbox Code Playgroud)

真的,我的问题是当该函数需要向量作为参数时,如何应用函数来选择data.table中的列.

r data.table geosphere

7
推荐指数
1
解决办法
5566
查看次数

R使用包地圈计算地球上2个点之间的距离

我的问题是基于这个问题.使用它我写下面的代码,其中第一组坐标是纽约LGA机场,而第二组坐标是纽约EWR机场.我得到了答案33713.那是英里还是公里?一个快速的谷歌检查说,距离应该是33英里(但它不是直线/弧距离:(这是一个公路的距离).包文件说答案是以米为单位.请澄清.这是一个给出2个坐标找到地球上距离的好方法?我怎样才能在里程中找到答案?

library(geosphere)
distm (c(40.777250, -73.872610), c(40.6895, -74.1745), fun = distHaversine)
         [,1]
[1,] 33713.61
Run Code Online (Sandbox Code Playgroud)

r distance geosphere

7
推荐指数
1
解决办法
1万
查看次数

R测量距海岸线的距离

我有一组坐标:

d1 <- data_frame(
title = c("base1", "base2", "base3", "base4"),
lat = c(57.3, 58.8, 47.2, 57.8, 65.4, 56.7, 53.3),
long = c(0.4, 3.4, 3.5, 1.2, 1.5, 2.6, 2.7))
Run Code Online (Sandbox Code Playgroud)

我想知道坐标是落在陆地上,在海中还是在海岸线内3英里处。坐标应该在英国的某个地方,所以我知道我需要绘制英国的形状文件并将其绘制在上面。

我只是不知道如何测量这些点是落在海洋,陆地还是在距海岸2英里的地方。显然,从查看地图可以看出它们落在哪里,但是我想在数据集中添加另一列,如下所示:

 d2 <- data_frame(
title = c("base1", "base2", "base3", "base4", "base5", "base6", "base7"),
lat = c(57.3, 58.8, 47.2, 57.8, 65.4, 56.7, 53.3),
long = c(0.4, 3.4, 3.5, 1.2, 1.5, 2.6, 2.7),
where = c("land", "land", "sea", "coast", "land", "sea", "coast"))
Run Code Online (Sandbox Code Playgroud)
  • 请注意,d2列“ where”中的数据是说明性的,这些经纬度可能全部在陆地上,或其他

r geospatial r-sp geosphere

7
推荐指数
2
解决办法
1234
查看次数

使用R中的distm()计算数据帧中两个GPS位置之间的距离

这个问题以前被问过,但从来没有用以下数据排列。下面是它的一个示例:

> head(datagps)
   Date & Time [Local]  Latitude Longitude
1: 2018-06-18 03:01:00 -2.434901  34.85359
2: 2018-06-18 03:06:00 -2.434598  34.85387
3: 2018-06-18 03:08:00 -2.434726  34.85382
4: 2018-06-18 03:12:00 -2.434816  34.85371
5: 2018-06-18 03:16:00 -2.434613  34.85372
6: 2018-06-18 03:20:00 -2.434511  34.85376
Run Code Online (Sandbox Code Playgroud)

如您所见,我有一Date & Time [Local]列平均每 4 分钟记录一次 GPS 位置。我想计算两个连续记录之间的距离(以米为单位)并将此度量存储在新列中Step。我一直在尝试distm()对我的数据实施:

> datagps$Step<-distm(c(datagps$Longitude, datagps$Latitude), c(datagps$Longitude+1, datagps$Latitude+1), fun = distHaversine)
Error in .pointsToMatrix(x) : Wrong length for a vector, should be 2
Run Code Online (Sandbox Code Playgroud)

尽管我不确定语法以及这是否是填充函数参数的正确方法。我对 R 很陌生,所以我希望能得到一些帮助。

任何输入表示赞赏!

r geosphere

6
推荐指数
1
解决办法
1025
查看次数

计算数据框中多个经纬度点的中心点

我有一个如下所示的数据集:

site   lat      long 
bras2  41.21   -115.11
tex4   45.3    -112.31
bras2  41.15   -115.15 
bras2  41.12   -115.19
Run Code Online (Sandbox Code Playgroud)

对于同名的样本site,我想计算它们的中心点,然后将其作为列添加到数据集中。有些site名字重复两次,有些重复三次,有些重复四次。

像这样:

site   lat      long    centre_lat  centre_long 
bras2  41.21   -115.11  value here     value here
tex4   45.3    -112.31  45.3           -112.31 
bras2  41.15   -115.15  value here     value here
bras2  41.12   -115.19  value here     value here
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

r geospatial geosphere

6
推荐指数
1
解决办法
1514
查看次数

Geosphere/dplyr:创建坐标之间的距离矩阵

我想创建多个坐标之间距离的“矩阵”。最好使用 dplyr/geosphere。我已经看到 geosphere 包提供了这个。我设法创建了两个向量之间的距离,但我很难创建完整的矩阵。

这是具有多个坐标的示例表。

df <- data.frame(latitude = c(49.48609,-8.14671,11.28625),
                 longitude = c(8.463678,143.05793,-11.18285))

  latitude  longitude
1 49.48609   8.463678
2 -8.14671 143.057930
3 11.28625 -11.182850
Run Code Online (Sandbox Code Playgroud)

这是我正在寻找的输出:

  latitude    longitude    distance-latlon1    distance-latlon2   distance-latlon3                 
1 49.48609     8.463678    NA                  *latlon2><latlon1  *latlon3><latlon1
2 -8.14671   143.057930    *latlon1><latlon2   NA                 *latlon3><latlon2
3 11.28625   -11.182850    *latlon1><latlon3   *latlon2><latlon3  NA
Run Code Online (Sandbox Code Playgroud)

我尝试使用 geosphere,但我只找到了一种计算两列之间距离的方法(在此代码段中结果为 0)。

library(geosphere) 
df$distance <- distVincentyEllipsoid(df[,c('longitude','latitude')],
                                     df[,c('longitude','latitude')])
Run Code Online (Sandbox Code Playgroud)

r geospatial latitude-longitude dplyr geosphere

5
推荐指数
1
解决办法
2511
查看次数

从一个数据集到第二个数据集查找最近的点(纬度/经度)

我有两个数据集 A 和 B,它们给出了英国不同点的位置,如下所示:

A = data.frame(reference = c(C, D, E), latitude = c(55.32043, 55.59062, 55.60859), longitude = c(-2.3954998, -2.0650243, -2.0650542))

B = data.frame(reference = c(C, D, E), latitude = c(55.15858, 55.60859, 55.59062), longitude = c(-2.4252843, -2.0650542, -2.0650243))
Run Code Online (Sandbox Code Playgroud)

A 有 400 行,B 有 1800 行。
对于 A 中的所有行,我想找到 A 中的一个点与 B 中三个最近点中的每一个之间的最短距离(以公里为单位),以及 B 中这些点的经纬度参考和坐标。

我尝试使用这篇文章

R - 在给定半径内找到最近的相邻点和相邻点的数量,坐标经纬度

但是,即使我按照所有说明进行操作,主要是使用distmpackage 中的命令geosphere,距离也会以不可能为公里的单位出现。我看不到代码中要更改的内容,尤其是因为我对这些geo包根本不熟悉。

r distance spatial latitude-longitude geosphere

5
推荐指数
1
解决办法
955
查看次数