R - Erstellen Sie einen Begrenzungsrahmen, konvertieren Sie ihn in Polygonklasse und Plot

11

Ich habe das NE lat lngund SW lat lng. Mein Ziel ist einfach: Ich verwende RStudio und möchte aus den beiden oben genannten Lats und Longs einen Begrenzungsrahmen erstellen, dann ein Polygon generieren und dem quadratischen Polygon zufällige Punkte hinzufügen. Ich habe NELat / Lng und SW-Lat / Lng in einer CSV-Datei, die ich in einen data.frame importieren könnte.

Ich brauche nur eine kleine Anleitung, um loszulegen. Ich bin sehr neu in der R-Sprache, es ist wirklich anders als ich es gewohnt bin.

Bisher habe ich Folgendes:

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)

Ich habe gerade einige Beispiele an anderer Stelle gesehen, kann aber kein Polygon mit 4 Ecken zeichnen.

user134611
quelle
Sie haben nur eine einzige duplizierte Koordinate in r1. Soll das "r1 = rbind (coords, coordsmax)" sein?
Mdsumner
Ja, korrigiert. Es funktioniert immer noch nicht
user134611
Das sorgfältige Durcharbeiten von Problemen ist ein guter Weg, um eine Lösung zu finden. Ich halte es für einen Fehler, dass Polygon () keinen Fehler macht, wenn nur zwei oder eine Koordinate angegeben wird. Ich habe dies in den sp-Problemen vermerkt. Für Sie q, Bibliothek (Raster); SPs1 <- as (Ausmaß (r1), "SpatialPolygons"); Handlung (SPs1)
mdsumner
Es tut mir leid, dass ich die Antwortfunktion von Stackexchange verwenden muss, aber mein Ruf ist nicht hoch genug, um Kommentare abzugeben. @ dof1985 Sie verwenden (x_min, y_min), (x_max, y_min), (x_max, y_max), (x_max, y_min), (x_min, y_min) als Koordinaten, um das Polygon zu erstellen. Ich habe das gleiche versucht, aber fehlgeschlagen. dann habe ich mir dein beispiel genauer angesehen und untersucht, dass du anstelle von (x_min, y_min), (x_max, y_min), ... nach (x_min, y_min), (x_min, y_max), ... könnte dies das sein Grund meines Fehlers? Bitte korrigieren Sie Ihr Beispiel :)
ExploreR

Antworten:

7

An Ihrem Code wurden einige Änderungen vorgenommen:

Beachten Sie zunächst, dass ich die Punkteerstellung fallen gelassen habe. Sie können ein Polygon ohne die Verwendung von bilden SpatialPoints. Wenn jedoch viele Punkte betroffen sind, ist es besser, ein Polygon aus Punkten zu erstellen.

Zweitens habe ich 5 Koordinatenpaare in die folgende Matrix geschrieben. Jedes Koordinatenpaar steht für eine Ecke Ihres Begrenzungsrahmens, und das fünfte wiederholt den ersten Punkt. Die Matrix enthält nämlich: [ (x_min, y_min) , (x_max, y_min), (x_max, y_max), (x_max, y_min), (x_min, y_min) ]

Schließlich habe ich SpatialPolygonsmit verwendet espg:4326, um ein zeichnungsfähiges Objekt in einem geografischen Kontext zu bilden.

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)

Folgendes passiert, wenn ich Ihren Code zeichne:

Ein Polygon, das wie eine Linie aussieht

und dies ist nach Code-Änderungen, die hier vorgestellt werden:

Bonding Box

dof1985
quelle
das ist es! Könnten Sie etwas dazu sagen proj4String? Definieren Sie Merkmale eines Lat und Long durch ihn?
user134611
Drücken Sie ?is.projectedin der R-Konsole, um die proj4stringHilfe zu sehen . Ja, es wird verwendet, um die CRS-Klasse für ein räumliches Objekt zu definieren
dof1985
21

Sie können die extentFunktion aus der Rasterbibliothek asverschachteln, um ein SpatialPolygons-Objekt zu erstellen.

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
quelle
2
Das sieht nach einem besseren Weg aus als meine Antwort.
dof1985