2013-03-28 6 views
0

공간 데이터에 문제가 있습니다. NetCDF 파일에서 온도 데이터를 추출해야합니다. 주어진 위도와 경도로이 온도를 다른 데이터 프레임에 포함 된 또 다른 위도와 경도와 연관시켜야합니다.두 좌표 간의 연관이 R

myfile <- nc_open(paste(wd, 'myfile.nc', sep='')) 
timearr = ncvar_get(myfile, "time") 
temp <- ncvar_get(myfile, 'temp_srf') 
lat <- ncvar_get(myfile, 'lat_rho') 
lon <- ncvar_get(myfile, 'lon_rho') 
dim(temp) 

[1] 27 75 52   # which means: 27 longitude * 75 latitudes * 52 time steps 

내가 지금 온도의 처음 단계에서 작업하기로 결정했습니다 : 이 내 변수를 추출하는 데 사용되는 코드입니다. 그래서 : 다른 데이터 프레임에

lat1 <- as.vector(lat) 
lon1 <- as.vector(lon) 
df1 <- as.data.frame(cbind(lon1, lat1, t1)) 
head(df1) 

    lon1 lat1  t1 
1 18.15338 40.48656 13.96225 
2 18.24083 40.55126 14.36726 
3 18.32845 40.61589 14.53822 
4 18.41627 40.68045 14.78643 
5 18.50427 40.74495 14.88624 
6 18.59246 40.80938 14.95925 

(DF2) I 위도의 어떤 임의의 점을 가지고 :

> t1 <- as.vector(temp[,,1]) 

그러면 I 처음 단계에서 위도, 경도 및 온도를 포함하는 data.frame 만들어 나는 이전 data.frame의 가장 가까운 위도와 경도에 연결해야한다는 경도 :

> df2 <- read.csv(paste(id, "myfile.csv", sep=""), header=TRUE, sep=",") 
> head(df2) 

    LONs  LATs 
1 14.13189 43.41072 
2 14.13342 43.34871 
3 14.09980 43.40822 
4 14.05338 43.72771 
5 13.91311 43.88051 
6 13.98500 43.91164 

나는 각 점 사이의 거리를 얻을 가장 낮은 하나를 얻을 생각,하지만 난 호 모른다 그것을 할 w. 다른 해결책이 있는지 확실하지 않습니다.

+0

여러 가지 해결책이 있지만 투영 된 좌표 또는 평면 좌표가 있는지에 따라 다릅니다. 예상되는 것은 당신이 휴대 전화 나 GPS 장치 (당신이 가진 것으로 의심되는)에 도달하고 각도로 측정되는 것과 같은 것입니다. –

+0

require (sp); ? spDistsN1 – mdsumner

답변

1

귀하의 데이터가 좌표로 추정되고 큰 원의 거리를 계산해야한다고 가정합니다. 직접 수식 (my answer here 참조)을 사용하거나 fields 패키지의 rdist.earth을 사용할 수 있습니다. df2의 각 항목에 대해 df1에있는 모든 항목의 거리를 계산하고 해당 벡터의 최소 거리 인덱스를 찾은 다음 해당 인덱스 행 df1을 선택하여 df2에 임시를 할당합니다. 그것은 하나 개의 라인을합니다 (그러나 몇 가지 명령을 통해 단계 분리해서하는 명확 수 있습니다) :

require(fields) 
df2["Temp"] <- df1[ sapply(seq_len(nrow(df2)) , function(x){ which.min(rdist.earth(df2[x,] , as.matrix(df1[ c("lon1" , "lat1") ]) , miles = FALSE, R = 6371)) }) , "t1" ] 

And the results using your data: 
df1 
#   lon1  lat1  t1 
# 1 18.15338 40.48656 13.96225 
# 2 18.24083 40.55126 14.36726 
# 3 18.32845 40.61589 14.53822 
# 4 18.41627 40.68045 14.78643 
# 5 18.50427 40.74495 14.88624 
# 6 18.59246 40.80938 14.95925 

df2 
#   LONs  LATs  Temp 
# 1 14.13189 43.41072 13.96225 
# 2 14.13342 43.34871 13.96225 
# 3 14.09980 43.40822 13.96225 
# 4 14.05338 43.72771 14.53822 
# 5 13.91311 43.88051 14.53822 
# 6 13.98500 43.91164 14.78643 

당신의 거리가 적어도 킬로미터 떨어져 마치를 (>이 데이터 300km) 그래서 당신은 가야 Great Circle 공식으로 정확도가 높습니다. 1km보다 작 으면 Haversine formula을 사용할 수 있습니다.

+0

고마워요! 그것은 작동합니다! – Piera

0

두 위도/경도 좌표 사이의 거리를 얻으려는 두 가지 수식은 Haversine formulaVincenty's formula입니다. Haversine 공식은 지구가 완전한 구체라고 가정하는 간단한 공식입니다. 아마 몇 피트 정도의 정확도를 얻을 것입니다. 높은 수준의 정확도가 필요하면 Vincenty의 공식을 시도하십시오. 그것은 지구의 불완전한 구형을 설명하려고하는 회전 타원체입니다. 링크의 샘플은 R에 있지 않지만 R로 다시 쓰는 것은 어렵지 않습니다.

관련 문제