2016-03-20 24 views
1

Birkaç yüz satırın bazı enlem ve boylam koordinatları arasındaki uzaklığı hesaplamak için R içindeki distHavrsine işlevini bir döngü içinde kullanmaya çalışıyorum. mesafesi 50 metreden az ise bundan sonraDistHaversine işlevi nasıl kullanılır?

if ((distHaversine(c(file[i,"long"], file[i,"lat"]), 
        c(file[j,"long"], file[j,"lat"]))) < 50) 

ben bu satırları kaydetmek istiyor ve enlem ve boylam koordinatları nerede gibi göz başvurduğunu:

0.492399367 30.42530045 
benim döngüde Bu kodu vardır

ve

0.496899361 30.42497045 

ama bu hatayı olsun

.pointsToMatrix (p1) içinde

Hata: enlem> 90

+0

küçük tekrarlanabilir örnek – akrun

+0

Olası kopyası sağlamak için dikkate alınız ([Haversine kullanarak iki farklı veri kareler arasında en yakın mesafeyi nasıl bulunur] https://stackoverflow.com/questions/44608687/how-to-find-the-nearest-distance-between-two-different-data-frames-using-haversi) –

cevap

4

ben bu hata olsun ".pointsToMatrix (p1) 'de hata: enlem> 90". Herkes neden ve nasıl çözüleceğini açıklayabilir mi?

hata enlem kapsam dışı olan daha büyük 90 değerleri var olduğunu söyler:

library(geosphere) 
distHaversine(c(4,52), c(13,52)) 
# [1] 616422 
distHaversine(c(4,52), c(1,91)) 
# Error in .pointsToMatrix(p2) : latitude > 90 

Yalnızca kabul aralıkları içindeki koordinatları ile distHaversine besleyerek bu sorunu çözebilir.

bazı enlem ve boylam arasındaki mesafeyi hesaplamak bir döngü içinde R distHavrsine işlevi kullanmak için çalışıyorum bir kaç yüz satırlar için koordine eder. mesafe az 50 metre ise (...) ben

kolayca birkaç yüz satır için bir uzaklık matrisi hesaplayan distm fonksiyonuna bir göz, var olan satırları kaydetmek istediğiniz (yani gevreksiz). Varsayılan olarak distHaversine kullanır. Örneğin, 650.000 metre sonra yakın olan veri çerçevesi satırları almak için:

df <- read.table(sep=",", col.names=c("lon", "lat"), text=" 
4,52 
13,52 
116,39") 
(d <- distm(df)) 
#   [,1] [,2] [,3] 
# [1,]  0 616422 7963562 
# [2,] 616422  0 7475370 
# [3,] 7963562 7475370  0 

d[upper.tri(d, T)] <- NA 
(idx <- which(d < 650000, arr.ind = T)) 
#  row col 
# [1,] 2 1 
cbind(df[idx[, 1], ], df[idx[, 2], ]) 
# lon lat lon lat 
# 2 13 52 4 52 
İlgili konular