У меня возникла проблема при попытке воспроизвести карту соединения большого круга по адресу 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
Большое спасибо!
Спасибо за трассировку 42- Я просто хотел сообщить об этой проблеме, которая была решена в конце. Существовали две причины, по которым петля не срабатывала: Я преобразовал последовательность строк в as.integer, а не в as.numeric. Это привело к тому, что длинные точки lat были усечены и наложены, что вызвало нулевые расстояния при рисовании большого круга. Другая причина заключалась в том, что мой SQL-запрос не был достаточно строгим и включал точки назначения, которых не было в моей длинной таблице lat. Нет большой тайны в конце. Просто отсутствуют записи данных. – Praxis
Вы могли бы подумать о том, чтобы активировать полезный ответ, если он помог найти ответ. Вы также можете опубликовать реальный ответ (и отметьте его после подходящего интервала), чтобы другие могли узнать из наших усилий. –