2016-09-01 4 views
2

J'ai une trame de données de coordonnées lat/long et un polygone, qui représente un trait de côte. J'essaie de trouver la distance entre chaque point et la caractéristique la plus proche de la côte. Je voudrais finir avec une trame de données de sortie qui inclut des colonnes pour mes valeurs lat/long d'origine et une nouvelle colonne de distance.Trouver les distances les plus proches entre un vecteur de points et un polygone dans R

J'ai essayé d'utiliser la fonction gDistance après avoir lu les réponses à des questions similaires en ligne, mais je pense qu'il me manque quelques étapes et j'ai du mal à comprendre. À l'heure actuelle, je ne me retrouve qu'avec une seule valeur de distance. Je suis tout à fait nouveau à R et j'apprécierais vraiment toute aide que quelqu'un pourrait être en mesure de donner.

Merci!

#Load data 
    Locs = structure(list(id = 1:5, Lat = c(29.59679167, 29.43586667, 29.37642222,29.52786111, 30.10603611), Long = c(-81.02547778, -80.92573889, 
-80.97714167, -81.08721667, -80.94368611)), .Names = c("id","Lat", "Long"), class = "data.frame", row.names = c(NA, -5L)) 

#Extract lat/long coordinates 
    xy = Locs[,c("Lat","Long")] 
#Create SpatialPointsDataFrame from xy data and change projection to metres 
    spdf = SpatialPointsDataFrame(coords=xy, data=xy, proj4string = CRS("+proj=aea +zone=17 ellps=WGS84")) 

#Read in shapefile as a spatialdataframe object 
    coast = readOGR(dsn="land data", layer="coast")  
#Transform to AEA (m) projection to match projection of points 
    land_poly = spTransform(coast, CRS("+proj=aea +zone=17 ellps=WGS84")) 

#OR load map from map package (but unfortunately map objects do not work in gDistance) 
    library(maps) 
    library(mapdata) 
    coast2 = map('usa', col = "grey90", fill=TRUE) 

#Calculate distance between each point and the nearest land feature 
    for(i in 1:dim(spdf)[1]){ 
    g = gDistance(spdf[i,],land_poly) 
    } 

EDIT: Utilisation des modifications du code de FEA ci-dessous (pour la pour l'étape en boucle), je suis en mesure d'obtenir des valeurs gDistance pour chaque ligne, mais les distances de sortie ne sont pas correctes (voir ci-dessous). Selon arcGIS, ils devraient être entre 4-37km, pas> 500km. Des pensées sur ce que je fais mal ici? Mon polygone terrestre et mes points sont tous les deux dans la même projection.

sortie gDistance

id  Lat  Long dist_gDist 
1 1 29.59679 -81.02548 516299.0 
2 2 29.43587 -80.92574 516298.8 
3 3 29.37642 -80.97714 516298.9 
4 4 29.52786 -81.08722 516299.0 
5 5 30.10604 -80.94369 516299.0 

Les distances correctes (calculées SIG)

id  Lat  Long dist_arc 
1 1 29.59679 -81.02548 13.630 
2 2 29.43587 -80.92574 15.039 
3 3 29.37642 -80.97714 8.111 
4 4 29.52786 -81.08722 4.784 
5 5 30.10604 -80.94369 36.855 
+0

Est-ce que [ce] (http://stackoverflow.com/questions/16448402/distance-of-point-feature-to-nearest-polygon-in-r) ou [this] (http://stackoverflow.com/questions/15294343/calculating-the-distance-between-polygon-and-point-in-r) aider, ou avez-vous déjà regardé ces derniers? – eipi10

+0

@ eipi10 - Merci pour les liens. Oui, je les ai lus mais ils ne m'ont pas aidé à résoudre le problème. Merci. –

Répondre

1

Je pense que vous obtenez seulement une valeur de distance parce que vous écrasez g à chaque itération de votre for -loop. Je ne sais pas cependant si c'est le seul problème parce que je ne peux pas reproduire votre problème sans données appropriées. Essayez de changer la dernière boucle à ceci:

g = rep(NA, dim(spdf)[1]) 
for(i in 1:dim(spdf)[1]){ 
    g[i] = gDistance(spdf[i,],land_poly) 
} 
+0

@ AEF: merci pour l'aide! La boucle for semble maintenant fonctionner, mais je me retrouve quand même avec des valeurs de sortie très étranges (c'est-à-dire que je devrais obtenir des valeurs d'environ 15 km et obtenir 500 km). J'ai mis à jour ma question pour inclure des données ponctuelles, mais je ne peux pas télécharger de fichiers sur stackoverflow, donc je ne suis pas capable de fournir un fichier de formes. J'ai essayé d'utiliser une carte du paquet de carte pour permettre la reproductibilité mais les objets de carte ne fonctionnent pas dans gDistance. Toute aide supplémentaire serait très appréciée. Merci encore! –