2012-06-25 2 views
2

У меня есть набор широт и долгот, так что это данные для животного, когда оно движется во времени. то, что я хочу сделать, это вычислить угол поворота, то есть под каким углом он поворачивается между каждым движением. так что скажите, что у меня есть точка 1, точка 2 и точка 3 с широтой и долготой, соответствующей каждой точке (животное перемещается из точки 1 в пункт 2 в пункт 3 и т. д.), и я хочу рассчитать угол между этими тремя точками, точкой 2 - средняя точка. что мне делать? моя ОС - это окна, и я использую R для анализа.Расчет угла от широты и долготы

так вот мой пример данных:

longitude      latitude 
36.89379547    0.290166977 
36.89384037    0.290194109 
36.88999724    0.286821044 
36.88708721    0.288339411 
36.88650313    0.29010232 
36.88563203    0.289939416 
36.88545224    0.290924863 

они находятся в десятичных градусах

+0

Что вы пробовали? По крайней мере, покажите, что вы пытались найти что-то, и/или показать, что вы понимаете математику. – Andrie

+0

Я попытался преобразовать lat и long в координаты x и y в км, считая, что земля является сферической (для простоты). и затем я попытался использовать формулу косинуса для вычисления углов. но я получаю чрезвычайно небольшие значения для углов, которые кажутся практически очень маловероятными. любая помощь будет высоко оценена. – Maddy

+1

Покажите свой код и некоторые данные примера, иначе мы можем только догадываться, в чем проблема. Вы работаете в градусах или радианах? – Andrie

ответ

8

Использование функции trackAzimuth в maptools:

library(maptools) 

trackAngle <- function(xy) { 
    angles <- abs(c(trackAzimuth(xy), 0) - 
        c(0, rev(trackAzimuth(xy[nrow(xy):1, ])))) 
    angles <- ifelse(angles > 180, 360 - angles, angles) 
    angles[is.na(angles)] <- 180 
    angles[-c(1, length(angles))] 
} 

trackAzimuth функция представляет собой простой цикл оберткой gzAzimuth. См. ?gzAzimuth для справок по вычислению направлений на сфере.

Использование данных:

x <- read.table(text = "longitude      latitude 
36.89379547    0.290166977 
36.89384037    0.290194109 
36.88999724    0.286821044 
36.88708721    0.288339411 
36.88650313    0.29010232 
36.88563203    0.289939416 
36.88545224    0.290924863", header = TRUE) 

trackAngle(as.matrix(x)) 
[1] 10.12946 111.17211 135.88514 97.73801 89.74684 

EDIT: я должен был удалить первые/последние углы от функции, то, что я делал после того, как тот факт, с помощью этой функции в другом месте. Должно быть прямо сейчас. :)

Также в пакетах adehabitatLT и argosfilter содержатся функции для расчета направлений и углов дорожки.

+0

Следует ли удалить инструкцию ifelse в функции trackAngle? Она тихо меняет направление угла по часовой стрелке против часовой стрелки, когда углы> 180. Вы не можете оценить, что азимут 89,7 ° и 97,7 ° 172 ° друг от друга, так как вторая на самом деле составляет 262,3 °. – mbask

+0

Хорошо, я просто думал о мерце остроты, а не о направлении. – mdsumner

0

ваших точек данных варьируются только над небольшим диапазоном. Мы можем посмотреть на один небольшой участок земной поверхности и притвориться плоской, двумерной. Вы должны выяснить, сколько километров, метров, миль, независимо от вашей любимой единицы, соответствует одной степени широты и на одну градус долготы. Последнее зависит от широты - оно будет таким же, как масштаб для широты, когда рядом с экватором, но если вы стоите на расстоянии до северного полюса, один шаг займет вас через пятьдесят градусов. Настройте координаты x, y, где x = 0, на долготе 36.88000, а y = 0 - широта 0.29000.

Итак, теперь у вас есть серия (x, y) точек. Возьмите различия от каждой точки к следующей: P2-P1, P3-P2 и т. Д. Их можно назвать «векторами смещения», но другие термины могут использоваться в других полях, чем где я. Назовите их V1, V2 и т. Д. Используйте точечные произведения и нормы: точка (V1, V2) = величина (V1) * величина (V2) * cos (a), где a - угол, на который V2 отклоняется от направления V1. Повторите для V3 и V2 и так далее.

У R есть все инструменты для этого, но я не знаю достаточного синтаксиса R, чтобы привести примеры.

+0

и i :( – Maddy