Как я могу извлечь расстояния между точками после триангуляции Делоне с помощью deldir в R?

Я хотел бы рассчитать расстояния между городами, используя триангуляции Делоне. У меня есть долгота и широта в двадцати городах, между которыми я хотел бы рассчитать расстояния, но у меня возникли некоторые затруднения с выяснением, как извлечь информацию о расстоянии из триангуляции. Я использовал 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"

Я совершенно уверен, что где-то в 'try' сохраняются расстояния между точками, рассчитанными deldir, но я просто не знаю, где. Я попытался выяснить это путем вычисления расстояний и поиска значений среди элементов $, но я не смог их найти. Для меня лучшим способом использования этой информации было бы, если бы я мог нарисовать длину каждой линии на графике для каждой отдельной линии, тогда я мог бы вручную рассчитать расстояния между всеми городами.

Спасибо за вашу помощь!

1 ответ

Решение:

Рассчитайте все возможные расстояния и сохраните их в матрице all.distances (расстояния в метрах). (dat является источником data.frame, содержащим широты и долготы)

library(BoSSA)
all.distances<-distGPS(dat$lat, dat$lon)

Теперь у вас гораздо больше расстояний, чем нужно, поэтому вы должны сгенерировать код, который будет извлекать только те значения, которые вам нужны. Создать список, в котором вы можете видеть, какие деревья являются соседями (по Триангуляции Делоне)

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)

Наслаждаться:)

Другие вопросы по тегам