R - Utwórz obwiednię, przekonwertuj na klasę Polygon i wydrukuj

11

Mam NE lat lngi SW lat lng. Mój cel jest prosty, używam RStudio i chcę utworzyć obwiednię z powyższych dwóch łat i długich, a następnie wygenerować wielokąt i chcę dodać losowe punkty do wielokąta kwadratowego. Mam NELat / Lng i SW-Lat / Lng w pliku csv, który mógłbym zaimportować do pliku data.frame.

Potrzebuję tylko trochę wskazówek, aby zacząć, jestem bardzo nowy w języku R, jest naprawdę inny niż to, do czego jestem przyzwyczajony.

Do tej pory mam to:

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)

Właśnie widziałem kilka przykładów gdzie indziej, ale nie jestem w stanie wykreślić wielokąta z 4 rogów.

użytkownik134611
źródło
Masz tylko jedną zduplikowaną współrzędną w r1, czy to ma oznaczać 'r1 = rbind (coords, coordsmax) `??
mdsumner,
Tak, poprawiłem to. Nadal jednak nie działa
134611
Staranne rozwiązywanie problemów za jednym razem jest dobrym sposobem na znalezienie rozwiązania. Uważam za błąd, że Polygon () nie popełnia błędu, gdy podano tylko dwie lub jedną współrzędną, zauważyłem to w problemach ze sp Dla ciebie q, biblioteka (raster); SPs1 <- as (zakres (r1), „SpatialPolygons”); fabuła (SPs1)
mdsumner
przepraszam, że muszę użyć funkcji odpowiedzi stackexchange, ale moja reputacja nie jest wystarczająco wysoka, aby komentować. @ dof1985 używasz (x_min, y_min), (x_max, y_min), (x_max, y_max), (x_max, y_min), (x_min, y_min) jako współrzędne do utworzenia wielokąta. próbowałem tego samego, ale nie powiodło się. potem przyjrzałem się bliżej twojemu przykładowi i sprawdziłem, że używasz zamiast (x_min, y_min), (x_max, y_min), ... po (x_min, y_min), (x_min, y_max), ... czy to może być powód mojego błędu? popraw swój przykład :)
ExploreR

Odpowiedzi:

7

W kodzie wprowadzono kilka zmian:

Najpierw zauważ, że upuściłem tworzenie punktów. Możesz utworzyć wielokąt bez użycia SpatialPoints. Chociaż w przypadku wielu punktów, lepiej byłoby utworzyć wielokąt z punktów.

Po drugie, zapisałem 5 par współrzędnych w macierzy poniżej. Każda para współrzędnych oznacza jeden róg obwiedni, a piąty powtarza pierwszy punkt. Mianowicie macierz obejmuje: [ (x_min, y_min) , (x_max, y_min), (x_max, y_max), (x_max, y_min), (x_min, y_min) ]

Wreszcie użyłem SpatialPolygonsz, espg:4326aby utworzyć obiekt możliwy do wydruku w kontekście geograficznym.

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)

Tak się dzieje, jeśli wykreślę kod:

Wielokąt, który wygląda jak linia

i to po przedstawionych tutaj modyfikacjach kodu:

Bonding Box

dof1985
źródło
Otóż ​​to! Czy mógłbyś trochę skomentować proj4String? definiujesz charakterystykę lat i długo przez to?
user134611,
Naciśnij ?is.projectedkonsolę R, aby zobaczyć proj4stringpomoc. Tak, służy do zdefiniowania klasy CRS dla obiektu przestrzennego
dof1985
21

Możesz zagnieździć extentfunkcję z biblioteki rastrowej, asaby utworzyć obiekt 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
źródło
2
to wygląda na lepszy sposób niż moja odpowiedź.
dof1985