2013-03-08 50 views
0

我有數據幀:查找從數據幀接近的緯度和經度和Z值

data <- data.frame(long = c(50.75 80.75 0.75 65.75 70.75 75.75 100.75 105.75 110.75   
        -4.25 65.75,100.55), lat=c(13.3 13.8 13.8 13.8 13.8 13.8 13.8 13.8 13.8 
        13.8 13.8,14.8), XCh4 c(1739.9 1737.5 1740.5 1715.7 1728.5 1745.0 1724.6 
        1734.2 1733.4 1713.6 1716.3 1725.3)) 

和我有站值是

lon<- 100.60 

lat <-13.4 

所以我應該如何提取最接近的緯度和經度,以站也獲得z值?
我曾嘗試:

lat.match <- which(abs(data[[3]]$lat - 13.04) == min(abs(data[[3]]$lat - 14.04)))[1] 

lon.match <- which(abs(data$long - 100.60)== min(abs(data$long- 100.60)))[1] 

data[data$long[lon.match] & data$lat[lat.match],] 

我沒有得到確切的對經緯度的這假設是LAT = 13.8和經度= 100.75。

請問有人能告訴我如何得到我的答案?

+0

z這裏是XCh4它是錯字 – uday 2013-03-08 08:14:14

+0

你想要找到真正最接近,在地理上說,或者最差的經緯度座標值?如果您有更多數據涵蓋更大的空間範圍 – 2013-03-08 16:06:47

+0

如果下面發佈的解決方案中的任何一個適合您,您可以通過按下您喜歡的答案旁邊的綠色勾號來接受該答案,以便可以採取該問題關閉未解答的問題堆棧。如果他們不工作,你能給我們更多的信息,以便我們能夠更好地協助?我看到你已經發布了問題,但從未接受過答案(你甚至可以接受你自己的答案並獲得積分!)或投票表示解決方案是否有用。 – 2013-03-22 12:49:17

回答

2

編輯以確認經度差異是由緯度收縮的事實減少了代碼被計算不是「距離」,而是「平方度」:

data$degr.sqrd <- ((lon-data$long)*cos(90*data$lat))^2 + (lat-data$lat)^2 
which.min(data$degr.sqrd) 
#[1] 7 
data[ which.min(data$degr.sqrd), "XCh4"] 
#[1] 1724.6 

data[ which.min(data$degr.sqrd), ] 
# long lat XCh4 degr.sqrd 
#7 100.75 13.8 1724.6 0.1651696 
+0

OP具有地理座標,這種距離計算採用平面(或投影)座標。 – 2013-03-08 09:11:25

+0

出色的一點,雖然我認爲簡單地引入cos(90 * lat)調整在這種情況下將是一個高度準確的近似值。在所有的請求都不是爲了距離而是爲了選擇特定的記錄之後。 – 2013-03-08 15:44:57

+0

是的,但他確實希望根據最近距離選擇記錄。我認爲這意味着「真實」的距離計算也是答案的重要和相關部分? – 2013-03-08 15:47:50

0

另一種解決方案使用dist

mat <- dist(cbind(c(data$lat,lat),c(data$long,lon))) 
n <- attr(mat,'Size') 
i <- 1:n 
j <- n 
v <- mat[n*(i-1) - i*(i-1)/2 + j-i] 
data[which.min(v),] 
long lat XCh4 dist 
7 100.75 13.8 1724.6 0.1825 

這裏的優勢,你可以改變的距離,例如,例如:

mat <- dist(cbind(c(data$lat,lat),c(data$long,lon)),meath='minkowski') 

data[which.min(v),] 
    long lat XCh4 dist 
7 100.75 13.8 1724.6 0.1825 ## not really representative , we get the same result:) 
1

小心!你有拉長的座標。不要使用假設座標是平面的方法,即在垂直和水平方向上的測量單位是相同的,而地理座標則不同。在示例數據中,它沒有什麼區別,但是如果您在大型數據庫中擁有大量數據,則可能會有所作爲。相反,你應該看看計算大圓距離(或這個的一些衍生物)。試試這個:

r <- 6371 # radius of the Earth 
#Coordinates need to be in radians 
data$longR <- data$long * pi/180 
data$latR <- data$lat * pi/180 
lon <- 100.60 * pi/180 
lat <- 13.4 * pi/180 
data$dist <- acos(sin(lat) * sin(data$latR) + cos(lat) * cos(data$latR) * cos(data$longR -lon)) * r 
data[ which.min(data$dist) , ] 
    long lat XCh4 longR  latR dist 
7 100.75 13.8 1724.6 1.758419 0.2408554 47.3403 

距離度量標準與地球半徑尺寸相同(在這種情況下是47.3公里)。有不同的距離計算方法的博客文章here