1
votes

Je voudrais calculer la distance des points de données (lat / long) des bords d'un fichier de forme dans R, puis appliquer un critère aux points de données?

J'ai des points de données d'une espèce observée à l'aide de pièges photographiques et j'aimerais mesurer la distance de chaque site de piège photographique (CameraStation) au bord d'un parc national en utilisant R. J'ai un fichier de formes du parc (shp) et souhaitez appliquer un critère aux CameraStation (s) situées à moins de 5 km du bord. Mon cadre de données (df) se compose de plusieurs événements / observations (EventID) par CameraStation. L'objectif est d'analyser quand les événements près de la lisière du parc sont les plus fréquents compte tenu d'autres facteurs environnementaux tels que la saison, la phase de lune et la nuit (également des colonnes dans DF).

J'ai trouvé un package appelé distance dans R mais c'est pour l'échantillonnage à distance et pas ce que je veux faire. Quel package est pertinent dans cette situation?

J'attends le résultat suivant:

EventID  CameraStation  Distance(km)  Within 5km
0001     Station 1      4.3           Yes
0002     Station 1      4.3           Yes
0003     Station 2      16.2          No
0004     Station 3      0.5           Yes
...


3 Réponses :


0
votes

Voici une solution rapide.

Simplifiez le contour de votre fichier de formes en N points. Calculez ensuite la distance minimale de chaque piège photographique à chaque point du contour du parc national.

library(geosphrere)
n      <- 500 ##The number of points summarizing the shapefile
NPs    <- ##Your shapefile goes here
NP.pts <- spsample(NPs, n = n, type = "regular")


CP.pts <- ## Coordinates for a single trap
distances<-distm(coordinates(CP.pts), coordinates(NP.pts), fun = distHaversine)/1000 

##Distance in Km between the trap to each point in the perimeter of the shapefile:
distances

Utilisez distances pour trouver la distance minimale entre le fichier de formes et ce piège donné. Cette approche peut facilement être généralisée en utilisant les fonctions pour boucles ou apply .


1 commentaires

Merci de votre aide. J'ai eu cette erreur lorsque j'ai exécuté ce code. `` `> NP.pts <- spsample (NPs, n = n, type =" regular ")` `` `Erreur dans n * bb.area: argument non numérique de l'opérateur binaire



1
votes

Voici une solution générale, adaptée de la réponse de Spacedmans à cette question sur gis.stackexchange . Remarque: Cette solution nécessite de travailler dans un système de coordonnées projetées. Vous pouvez transformer en CRS projeté si nécessaire en utilisant spTransform .

La fonction gDistance du package rgeos calcule la distance entre les géométries, mais pour le cas des points à l'intérieur d'un polygone la distance est nulle. L'astuce consiste à créer un nouveau polygone «masque» où le polygone d'origine est un trou découpé dans le masque. Ensuite, nous pouvons mesurer la distance entre les points dans le trou et le masque, qui est la distance au bord du polygone d'origine qui nous tient vraiment à cœur.

Nous utiliserons le fichier de forme du Yellowstone National Limite du parc trouvée sur cette page .

# Put the points in a SpatialPointsDataFrame with camera id in a data field.
spts.df <- SpatialPointsDataFrame(pts, data = data.frame(Camera = ordered(1:length(pts$x))))

# Give our SpatialPointsDataFrame the same spatial reference as the polygon.
proj4string(spts.df) <- proj4string(yellowstone.shp)

# Calculate distances (km) from points to edge and put in a new column.
spts.df$km_to_edge <- apply(gDistance(spts.df, difference, byid=TRUE),2,min)/1000

# Determine which records are within 5 km of an edge and note in new column.
spts.df$edge <- ifelse(spts.df$km_to_edge < 5, TRUE, FALSE)

# Results
spts.df

#             coordinates Camera km_to_edge  edge
# 1  (536587.3, 85158.01)      1   1.855010  TRUE
# 2     (507432, 77251.5)      2   9.762755 FALSE
# 3  (542517.2, 15976.07)      3  11.668700 FALSE
# 4  (477782.6, 40683.91)      4   4.579638  TRUE
# 5 (517315.2, -3790.195)      5   8.211961 FALSE


3 commentaires

Cela a fonctionné, cependant, j'ai des valeurs étranges pour mon km_to_egde. J'obtiens beaucoup de 0 ou quelques 500 km jusqu'au bord et ce n'est pas représentatif des données - même si lorsque j'ai vérifié et masqué les points, ils ont raison. Pourquoi cela serait-il? J'utilise le même CRS pour les points et le masque (CRS ("+ init = EPSG: 32648")). De plus, mes données se trouvent sur 2 zones de grille UTM 47N et UTM 48N, mais seuls les points de données dans UTM 48N apparaissent. Je pense que je vais devoir le faire deux fois pour chaque zone de grille et les ajouter à une trame de données après.


J'ai refait le code du CRS ("+ init = EPSG: 32647") pour qu'il corresponde à la zone de grille UTM 47 et cette fois j'obtiens plus de 500 km_to_edge et quelques 0 ... il a inversé les 0 et 500 d'avant . Il semble mesurer au bord de la zone de grille et non du parc ?? J'examinerai cela plus en détail.


Sans un exemple reproductible de votre problème (données et code), il est difficile de savoir ce qui se passe. Je soupçonne que vous rencontrez des problèmes de CRS, peut-être liés à plusieurs grilles UTM. EPSG: 32648 est uniquement pour UTM 48N.



0
votes

J'ai eu un problème avec le bloc de données de points et le fichier de forme projeté, j'ai donc utilisé l'exemple de ce lien pour répondre à ma question

https://gis.stackexchange.com/questions/225102/calculate-distance-between-points-and-nearest-polygon-in -r

En gros, j'ai utilisé ce code;

df # my data frame with points
shp # my shapefile (non-projected)

dist.mat <- geosphere::dist2Line(p = df2, line = shp)
coordinates(df2)<-~Longitude+Latitude # Longitude and Latitude are columns in my df

dmat<-data.frame(dist.mat) # turned it into a data frame

dmat$km5 <- ifelse(dmat$distance < 5000, TRUE, FALSE) # in meters (5000)
coordinates(dmat)<-~lon+lat

df2$distance <- dmat$distance # added new Distance column to my df


0 commentaires