나는 점을 정점의 좌표 시스템을 제공 할 때를 계산하는데는 distence geosphere
패키지 distm()
기능을 사용했다. 또한 보조 계전기 dis <- function(x0,x1,y0,y1){sqrt((x0-x1)^2 +(y0-y1)^2)}
(distm()
)을 통해 쉽게 교대로 전환 할 수 있습니다.
algo.p2poly <- function(pt, poly){
if(!identical(poly[1,],poly[nrow(poly),])){poly<-rbind(poly,poly[1,])}
library(geosphere)
n <- nrow(poly) - 1
pa <- distm(pt, poly[1:n, ])
pb <- distm(pt, poly[2:(n+1), ])
ab <- diag(distm(poly[1:n, ], poly[2:(n+1), ]))
p <- (pa + pb + ab)/2
d <- 2 * sqrt(p * (p - pa) * (p - pb) * (p - ab))/ab
cosa <- (pa^2 + ab^2 - pb^2)/(2 * pa * ab)
cosb <- (pb^2 + ab^2 - pa^2)/(2 * pb * ab)
d[which(cosa <= 0)] <- pa[which(cosa <= 0)]
d[which(cosb <= 0)] <- pb[which(cosb <= 0)]
return(min(d))
}
예 :
poly <- matrix(c(114.33508, 114.33616,
114.33551, 114.33824,
114.34629, 114.35053,
114.35592, 114.35951,
114.36275, 114.35340,
114.35391, 114.34715,
114.34385, 114.34349,
114.33896, 114.33917,
30.48271, 30.47791,
30.47567, 30.47356,
30.46876, 30.46851,
30.46882, 30.46770,
30.47219, 30.47356,
30.47499, 30.47673,
30.47405, 30.47723,
30.47872, 30.48320),
byrow = F, nrow = 16)
pt1 <- c(114.33508, 30.48271)
pt2 <- c(114.6351, 30.98271)
algo.p2poly(pt1, poly)
algo.p2poly(pt2, poly)
결과 :
> algo.p2poly(pt1, poly)
[1] 0
> algo.p2poly(pt2, poly)
[1] 62399.81
난 당신이 요구하는지 않는 것을 팔기 전에 포장 아무것도 모른다. 정보를 조금 더 주시겠습니까? 거리를 계산하기 전에 다각형에 대해 아는 것이 있습니까? 아니면 어떤 모양이 될 수 있습니까? 나는 이것이 피타고라스에 대해 데카르트 공간에 있다고 언급 한 이후로 추측합니다. – Dinre
제안 된 방법에 따르면 폴리곤이 내부 교차점을 허용하지 않는 것처럼 들리므로 정점에 회전 순서 (CW 또는 CCW 이동)가 있음을 나타냅니다. 사실입니까? – Dinre
이것은 맞습니다 –