R - Ошибка в if (antipodal(p1, p2)) при создании великих кругов - библиотека (геосфера)

У меня возникла проблема при попытке воспроизвести карту соединения greatcircle на http://flowingdata.com/2011/05/11/how-to-map-connections-with-great-circles/. Я сталкиваюсь со следующей ошибкой при запуске цикла для функции:

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

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

Эта ошибка, по-видимому, является обычной, возникающей при попытке отображения данных таким образом, и связана с тем, что значения NULL передаются в antipodal. Я с трудом могу найти те, которые могут быть в моих данных. Я удалил "to" и "from" пункты назначения, которые совпадают / накладываются, что может привести к нулевому расстоянию для большого круга. Сообщается, что это проблема аналогичной ошибки на SO здесь:

Антиподальная ошибка в коде Great Circles

Оригинальный код использует 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, ])

Да, я тоже столкнулся с этим предупреждением. Но после того, как я дважды проверил свой набор данных и убедился, что каждая точка в списке ребер существует в наборе узлов широта-долгота, цикл работал плавно. Эта проблема может возникать из-за несовпадения данных между узлами и ребрами.

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