2016-07-30 7 views
0

У меня возникла проблема при попытке воспроизвести карту соединения большого круга по адресу http://flowingdata.com/2011/05/11/how-to-map-connections-with-great-circles/. Я встречая следующее сообщение об ошибке при выполнении цикла для функции:R - ошибка в if (антиподальная (p1, p2)) при создании greatcircles - library (geosphere)

Error in if (antipodal(p1, p2)) { : missing value where TRUE/FALSE needed 

Кстати, функция работает нормально, когда он находится вне цикла, но я не могу видеть, что это неправильно с настройкой контура чтобы вызвать проблему.

Эта ошибка, похоже, встречается при попытке отображения данных таким образом и имеет какое-то отношение к значениям NULL, передаваемым в антиподал. Мне трудно найти, могут ли быть в моих данных. Я удалил пункты «в» и «из», которые являются тем же самым/наложением, что может привести к удалению 0 для большого круга. Об этом сообщается проблему с аналогичной ошибки на SO здесь:

Antipodal error in Great Circles code

Исходный код использует запросы SQL, чтобы собрать таблицы для gcIntermediate, но я написал это, как столы, если кто-то хочет работать кода и убедиться сами.

library(maptools) 
library(rgeos) 
library(sp) 
library(geosphere) 


fsub = read.csv("fsub.csv") 

dfCord = read.csv("dfCord.csv") 

dfBind = cbind(as.numeric(dfCord$lon), as.numeric(dfCord$lat)) 
sp = SpatialPoints(dfBind) 
plot(sp) 


for (j in 1:length(fsub$MODE9)) { 


    air1 <- dfCord[dfCord$sa2_main11 == fsub[j,]$O_SA2_11,] 
    air2 <- dfCord[dfCord$sa2_main11 == fsub[j,]$D_SA2_11,] 

    inter <- gcIntermediate(c(as.integer(air1[1,]$lon), as.integer(air1[1,]$lat)), c(as.integer(air2[1,]$lon), as.integer(air2[1,]$lat)), n=100, addStartEnd=TRUE) 


    lines(inter, col="black") 
} 

Файлы данных можно найти на GIT.

dfCord.csv fsub.csv

https://github.com/GaryPate/R-Greatcircles/commit/e1149ccdb7ab13b89f5f11e8ebad66f26ec3e39b

Большое спасибо!

ответ

1

Это не ответ. Но здесь размещается только возможность форматирования вывода отладки. Вы пытаетесь сделать ... что-то ... не указано здесь. В первом и втором строках air2 оба имеют NA.

> which(is.na(geosphere:::.interm(c(as.integer(air1[1, ]$lon), as.integer(air1[1, 
+  ]$lat)), c(as.integer(air2[1, ]$lon), as.integer(air2[1, 
+  ]$lat))) 
+) 
+) 
Error in if (antipodal(p1, p2)) { : missing value where TRUE/FALSE needed 
> traceback() 
2: geosphere:::.interm(c(as.integer(air1[1, ]$lon), as.integer(air1[1, 
     ]$lat)), c(as.integer(air2[1, ]$lon), as.integer(air2[1, 
     ]$lat))) 
1: which(is.na(geosphere:::.interm(c(as.integer(air1[1, ]$lon), 
     as.integer(air1[1, ]$lat)), c(as.integer(air2[1, ]$lon), 
     as.integer(air2[1, ]$lat))))) 
> which(is.na(antipodal(c(as.integer(air1[1, ]$lon), as.integer(air1[1, 
+  ]$lat)), c(as.integer(air2[1, ]$lon), as.integer(air2[1, 
+  ]$lat))) 
+)) 
[1] 1 
> c(c(as.integer(air1[1, ]$lon[1]), as.integer(air1[1, 
+  ]$lat)[1]), c(as.integer(air2[1, ]$lon[1]), as.integer(air2[1, 
+  ]$lat[1])) 
+) 
[1] 151 -33 NA NA 
> as.integer(air2[1, ] 
+) 
[1] NA NA NA NA 
> as.integer(air2[2, ]) 
+0

Спасибо за трассировку 42- Я просто хотел сообщить об этой проблеме, которая была решена в конце. Существовали две причины, по которым петля не срабатывала: Я преобразовал последовательность строк в as.integer, а не в as.numeric. Это привело к тому, что длинные точки lat были усечены и наложены, что вызвало нулевые расстояния при рисовании большого круга. Другая причина заключалась в том, что мой SQL-запрос не был достаточно строгим и включал точки назначения, которых не было в моей длинной таблице lat. Нет большой тайны в конце. Просто отсутствуют записи данных. – Praxis

+0

Вы могли бы подумать о том, чтобы активировать полезный ответ, если он помог найти ответ. Вы также можете опубликовать реальный ответ (и отметьте его после подходящего интервала), чтобы другие могли узнать из наших усилий. –