R - Créer une boîte englobante, convertir en classe polygone et tracé

11

J'ai le NE lat lnget SW lat lng. Mon objectif est simple, j'utilise RStudio et je veux créer un cadre de délimitation à partir des deux lats et longs ci-dessus, puis générer un polygone et je veux ajouter des points aléatoires dans le polygone carré. J'ai NELat / Lng et SW-Lat / Lng dans un fichier csv que je pourrais importer dans un data.frame.

J'ai juste besoin d'un petit conseil pour commencer, je suis très nouveau dans le langage R, c'est vraiment différent de ce à quoi je suis habitué.

Jusqu'à présent, j'ai ceci:

coords = cbind(78.46801, 19.53407)
coordsmax = cbind(78.83157, 19.74557 )
sp = SpatialPoints(coordsmax)
sp2 = SpatialPoints(coords)

r1 = rbind(coords, coordsmax[1, ])  # join
P1 = Polygon(r1)
Ps1 = Polygons(list(P1), ID = "a")
plot(Ps1)

Je viens de voir quelques exemples ailleurs mais je ne suis pas en mesure de tracer un polygone de 4 coins.

user134611
la source
Vous n'avez qu'une seule coordonnée dupliquée dans r1, est-ce que c'est censé être 'r1 = rbind (coords, coordsmax) `??
mdsumner
Oui, corrigé. Cela ne fonctionne toujours pas
user134611
Traiter soigneusement les problèmes une par une est un bon moyen d'obtenir une solution. Je considère que c'est un bug que Polygon () ne commet pas d'erreur quand on ne lui donne que deux ou une coordonnée, je l'ai noté dans les problèmes sp. Pour vous q, bibliothèque (raster); SPs1 <- as (étendue (r1), "SpatialPolygons"); plot (SPs1)
mdsumner
je suis désolé de devoir utiliser la fonction de réponse de stackexchange mais ma réputation n'est pas assez élevée pour commenter. @ dof1985 vous utilisez (x_min, y_min), (x_max, y_min), (x_max, y_max), (x_max, y_min), (x_min, y_min) comme coordonnées pour créer le polygone. j'ai essayé la même chose, mais j'ai échoué. puis j'ai regardé de plus près votre exemple et j'ai examiné, que vous utilisez à la place de (x_min, y_min), (x_max, y_min), ... suivant (x_min, y_min), (x_min, y_max), ... pourrait-il être le raison de mon erreur? veuillez corriger votre exemple :)
ExploreR

Réponses:

7

Quelques modifications ont été apportées à votre code:

Tout d'abord, notez que j'ai supprimé la création de points. Vous pouvez former un polygone sans utiliser de SpatialPoints. Bien que plusieurs points soient impliqués, il serait préférable de créer un polygone à partir de points.

Deuxièmement, j'ai écrit 5 couples de coordonnées dans la matrice ci-dessous. Chaque couple de coordonnées représente un coin de votre boîte englobante, et le cinquième répète le premier point. À savoir, la matrice comprend: [ (x_min, y_min) , (x_max, y_min), (x_max, y_max), (x_max, y_min), (x_min, y_min) ]

Enfin, j'ai utilisé SpatialPolygonsavec espg:4326pour former un objet pouvant être tracé dans un contexte géographique.

library(sp)

coords = matrix(c(78.46801, 19.53407,
               78.46801, 19.74557,
               78.83157, 19.74557,
               78.83157, 19.53407,
               78.46801, 19.53407), 
             ncol = 2, byrow = TRUE)


P1 = Polygon(coords)
Ps1 = SpatialPolygons(list(Polygons(list(P1), ID = "a")), proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))
plot(Ps1, axes = TRUE)

Voici ce qui se passe si je trace votre code:

Un polygone qui ressemble à une ligne

et ceci après les modifications de code présentées ici:

Boîte de liaison

dof1985
la source
c'est ça! Pourriez-vous commenter un peu proj4String? définissez-vous les caractéristiques d'un lat et le parcourez-vous?
user134611
Appuyez ?is.projectedsur R-console pour voir l' proj4stringaide. Oui, il est utilisé pour définir la classe CRS à un objet spatial
dof1985
21

Vous pouvez imbriquer la extentfonction, à partir de la bibliothèque raster, aspour créer un objet SpatialPolygons.

library(sp)
e <- as(raster::extent(78.46801, 78.83157, 19.53407, 19.74557), "SpatialPolygons")
proj4string(e) <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
plot(e)
Jeffrey Evans
la source
2
cela ressemble à une meilleure façon que ma réponse.
dof1985