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

ちなみに、ループの外側にあるときは問題なく機能しますが、ループの設定のどこが問題なのかわかりません。

このエラーは、この方法でデータを表示しようとしたときに発生する一般的なエラーのようで、antipodal に渡される NULL 値と関係があります。それらが私のデータに含まれている可能性があるかどうかを見つけるのに苦労しています。大円の距離が 0 になる可能性がある同じ/オーバーレイである「to」および「from」の目的地を削除しました。これは、SO here の同様のエラーの問題であると報告されました。

大円コードの対蹠エラー

元のコードでは、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

これは答えではありません。ただし、デバッグ出力をフォーマットする機能のためにここに投稿しただけです。あなたがやろうとしているのは...何か...ここには記載されていません。どちらも1列目と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 に答える