2016-07-30 13 views
0

에 greatcircle 연결 맵을 재현하려고 할 때 문제가 있습니다. 함수에 대한 루프를 실행할 때 나는 다음과 같은 오류가 발생하고있다 : 그것은 루프의 외부에있을 때R - greatcircles을 만들 때 if (antipodal (p1, p2)) - 라이브러리 (지리권)

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

또한, 함수가 확인 실행을,하지만 난 루프의 설정에 어떤 문제가 있는지 볼 수 없습니다 문제를 일으킬 수 있습니다.

이 오류는이 방법으로 데이터를 표시 할 때 발생하는 일반적인 문제인 것으로 보이며 NULL 값이 반주에 전달되는 것과 관련이 있습니다. 그 데이터가 내 데이터에있을 수 있음을 발견하는 데 어려움이 있습니다. 나는 'to'와 'from'목적지를 제거했습니다. 동일한 목적지/오버레이는 큰 원으로 그려지는 0 거리가 될 수 있습니다. 즉 SO 여기에 유사한 오류에 문제가있는 것으로보고되었다 :

Antipodal error in Great Circles code

원래 코드는 gcIntermediate의 테이블을 조립하는 SQL 쿼리를 사용하지만 사람이 실행하고 싶은 경우에 나는 테이블로 다음을 작성했습니다 코드를보고 스스로 알아보십시오.

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.numeric 대신 as.integer로 변환하고있었습니다. 이로 인해 위의 긴 점이 잘리고 오버레이되어 큰 원을 그리는 데 null 거리가 발생했습니다. 또 다른 이유는 내 SQL 쿼리가 충분히 엄격하지 않아서 위의 긴 테이블에 존재하지 않는 대상 지점을 포함하고 있기 때문입니다. 결국 큰 신비가 없습니다. 데이터 항목이 누락되었습니다. – Praxis

+0

답변을 찾는데 도움이된다면 유용한 응답을 upvoting하는 것이 좋습니다. 다른 사람들이 우리의 노력을 통해 배울 수 있도록 실제 답변을 게시하고 적절한 간격을두고 체크 표시 할 수도 있습니다. –