1

我在尝试在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 值有关。我很难找到那些可能在我的数据中。我已经删除了相同/重叠的“到”和“从”目的地,这可能导致为大圆绘制 0 距离。据报道,这与 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

非常感谢!

4

2 回答 2

2

这不是一个答案。但仅在此处发布是为了能够格式化调试输出。你正在尝试做……某事……这里没有说明。第一行和第二行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, ])
于 2016-07-30T20:22:25.867 回答
0

是的,我也遇到了这个警告。但是在我仔细检查了我的数据集并确保边缘列表中的每个点都存在于经纬度节点集中之后,循环运行顺利。这个问题可能是由于节点和边之间的数据不匹配造成的。

于 2020-11-06T03:18:58.697 回答