2013-03-28 6 views
0

J'ai un problème avec les données spatiales. J'ai besoin d'extraire les données de température d'un fichier NetCDF; alors j'ai besoin d'associer cette température à une latitude et à une longitude donnée à un autre ensemble de latitude et de longitude contenu dans une trame de données différente. Ce est le code que je l'habitude d'extraire mes variables:Association entre deux coordonnées dans 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 

J'ai choisi de travailler sur la première étape de temps de la température pour l'instant. Alors:

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

Ensuite, je créé un data.frame dont lat, lon et la température dans la première étape de temps:

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 

Dans une autre trame de données (DF2) J'ai quelques points aléatoires de latitude et longitude, que je dois associer à la plus proche latitude et la longitude de la data.frame précédente:

> 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 

Je pensais à obtenir la distance entre chaque point et d'obtenir une plus bas, mais je ne sais pas ho w pour le faire. Je ne suis pas sûr s'il y a d'autres solutions.

+0

Il existe plusieurs solutions, mais cela dépend si vous avez des coordonnées planes ou projetées. Projection sont comme lat-long vous obtenez sur votre téléphone mobile ou un appareil GPS (que je soupçonne que vous avez) et sont mesurés en degrés angulaires. –

+0

require (sp); ? spDistsN1 – mdsumner

Répondre

1

Je suppose que vos données sont des coordonnées projetées, et que vous devez calculer des distances de grand cercle. Vous pouvez utiliser une formule vous-même (voir my answer here) ou vous pouvez utiliser rdist.earth à partir du package fields. Pour chaque entrée dans df2, calculez la distance de toutes les entrées dans df1, recherchez l'index de la distance minimale dans ce vecteur et utilisez cet index pour sélectionner la ligne appropriée df1 pour affecter la température à df2. Il suffit d'une ligne (mais il pourrait être plus clair pour séparer les étapes sur quelques commandes):

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 

Il ressemble à vos distances sont au moins un kilomètre à part (> 300 km dans ces données) afin que vous devriez obtenir bonne précision avec la formule Great Circle. Si elles sont inférieures à 1 km, vous pouvez utiliser le Haversine formula.

+0

Merci! Ça marche! – Piera

0

Deux formules que j'aime pour obtenir la distance entre deux coordonnées lat/long sont les Haversine formula et Vincenty's formula. La formule de Haversine est une formule plus simple qui suppose que la Terre est une sphère parfaite. Vous obtiendrez probablement l'exactitude à quelques pieds. Si vous avez besoin d'un niveau de précision supérieur, essayez la formule de Vincenty. Il est basé sur des sphéroïdes qui tente de rendre compte de la forme de la sphère imparfaite de la Terre. Les échantillons sur les liens ne sont pas dans R mais il ne devrait pas être difficile de les réécrire dans R.

Questions connexes