我有一个网格化数据集,可在以下位置获得数据:
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公里范围内的位置.有没有更有效的方法来做到这一点?
我正在尝试将日间/夜间线路添加到世界地图ggplot中,以指示日夜区域; 这样的事情:
计划是在24小时的周期内为我的地图制作动画,如下所示:
上面的动画是用正弦波实现的,我知道它是完全不准确的.我知道这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)
虽然我不确定是否有可能在一年中的不同点画出所需的线条,例如在三月看起来如此:
我没有找到解决方案的运气,但我猜我不知道要搜索的关键字,因为这超出了我的知识范围.我认为答案可能在日出方程中的某处,但我不知道如何应用这些来找到解决方案,我也不知道如何在一年中改变这些参数.这个网站(用于上面的情节)似乎也很有用,但我还不确定如何!
我无法解决错误:"当向量计算两个点(跑道入口/终点)之间的(跑道长度)距离"时,"向量的长度应该为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) 我创建了一个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中的列.
我的问题是基于这个问题.使用它我写下面的代码,其中第一组坐标是纽约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) 我有一组坐标:
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)
这个问题以前被问过,但从来没有用以下数据排列。下面是它的一个示例:
> 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 很陌生,所以我希望能得到一些帮助。
任何输入表示赞赏!
我有一个如下所示的数据集:
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)
我怎样才能做到这一点?
我想创建多个坐标之间距离的“矩阵”。最好使用 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) 我有两个数据集 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包根本不熟悉。
geosphere ×10
r ×10
geospatial ×3
distance ×2
dplyr ×2
data.table ×1
ggplot2 ×1
gis ×1
great-circle ×1
r-sp ×1
spatial ×1