我想使用Delaunay Triangulations计算城市之间的距离。我有二十个城市的经度和纬度,我想计算它们之间的距离,但是我很难弄清楚如何从三角测量中提取距离信息。到目前为止,我已经使用了deldir()(来自库deldir)。请参阅下面的代码。
x <- c(2.3,3.0,7.0,1.0,3.0,8.0)
y <- c(2.3,3.0,2.0,5.0,8.0,9.0)
try <- deldir(x,y,list(ndx=2,ndy=2),c(0,10,0,10))
str(try)
List of 8
$ delsgs :'data.frame': 23 obs. of 6 variables:
..$ x1 : num [1:23] 3 7 7 1 1 3 3 3 8 8 ...
..$ y1 : num [1:23] 3 2 2 5 5 8 8 8 9 9 ...
..$ x2 : num [1:23] 2.3 2.3 3 2.3 3 3 7 1 7 3 ...
..$ y2 : num [1:23] 2.3 2.3 3 2.3 3 3 2 5 2 8 ...
..$ ind1: num [1:23] 2 3 3 4 4 5 5 5 6 6 ...
..$ ind2: num [1:23] 1 1 2 1 2 2 3 4 3 5 ...
$ dirsgs :'data.frame': 15 obs. of 8 variables:
..$ x1 : num [1:15] 1.65 4.56 5.75 0 1.65 ...
..$ y1 : num [1:15] 3.65 0.74 5.5 2.86 3.65 ...
..$ x2 : num [1:15] 4.56 4.51 4.56 1.65 3.5 ...
..$ y2 : num [1:15] 0.74 0 0.74 3.65 5.5 ...
..$ ind1: num [1:15] 2 3 3 4 4 5 5 5 6 6 ...
..$ ind2: num [1:15] 1 1 2 1 2 2 3 4 3 5 ...
..$ bp1 : logi [1:15] FALSE FALSE FALSE TRUE FALSE FALSE ...
..$ bp2 : logi [1:15] FALSE TRUE FALSE FALSE FALSE FALSE ...
$ summary :'data.frame': 10 obs. of 9 variables:
..$ x : num [1:10] 2.3 3 7 1 3 8 0 10 0 10
..$ y : num [1:10] 2.3 3 2 5 8 9 0 0 10 10
..$ n.tri : num [1:10] 4 4 6 5 5 5 4 3 4 2
..$ del.area: num [1:10] 4.5 6.05 18.67 7.5 15 ...
..$ del.wts : num [1:10] 0.045 0.0605 0.1867 0.075 0.15 ...
..$ n.tside : num [1:10] 4 4 5 4 5 3 1 1 2 1
..$ nbpt : num [1:10] 4 0 4 2 2 4 2 2 2 2
..$ dir.area: num [1:10] 9.09 10.74 23.32 9.39 18.06 ...
..$ dir.wts : num [1:10] 0.0909 0.1074 0.2332 0.0939 0.1806 ...
$ n.data : int 6
$ n.dum : int 4
$ del.area: num 100
$ dir.area: num 100
$ rw : num [1:4] 0 10 0 10
- attr(*, "class")= chr "deldir"
我很确定在'尝试'某处可以存储由deldir计算的点之间的距离,但我只是不知道在哪里。我已经尝试通过计算距离并在$元素中查找值来计算它,但我找不到它们。对我来说,使用这些信息的最佳方式是,如果我可以将绘图上每条线的长度绘制到每条线上,那么我可以手动计算所有城市之间的距离。
感谢您的帮助!
答案 0 :(得分:0)
<强>解决方案:强>
计算所有可能的距离并将其存储到名为all.distances
的矩阵中(距离以米为单位)。 ( dat 是包含纬度和经度的源数据。)
library(BoSSA)
all.distances<-distGPS(dat$lat, dat$lon)
现在您的距离远远超过您的需要,因此您必须生成仅提取所需值的代码。创建列表,您可以在其中查看哪些树是邻居(通过Delaunay Triangulation)
library(tripack)
tree.nb<-neighbours(tri.mesh(dat$lat,dat$lon))
创建两个向量,因此您有邻居的组合
my.FC<-rep(c(1:length(tree.nb)), sapply(tree.nb, length))
my.SC<-unlist(tree.nb)
看起来像这样:
my.FC
[1]
1 1 1 2 2 2 2 3 4 4
my.SC
[1]
6 7 8 4 7 5 8 5 2 9
作为列读取,因此位置“1”是邻居,位置为“6”,“7”,“8”。位置“2”是邻居,位置“4”,“7”,“5”,“8”,等等......
现在来了聪明的部分...... 您需要使用邻域组合作为距离矩阵中所需值的坐标。并将这些值提取到矢量
为距离值创建空矢量:
nb.dist<-numeric(sum(sapply(tree.nb, length)))
提取值的代码:
for (i in 1:sum(sapply(tree.nb, length)))
nb.dist[i] <- all.distances[my.FC[i],my.SC[i]]
然而,在创建的向量中,“nb.dist”将是所有值两次(因为“1”是“8”的邻居而“8”也是“1”的邻居。
所以只需使用unique()
unique(nb.dist)
享受:)