R - Buat kotak pembatas, konversikan ke kelas dan Plot Polygon


11

Saya punya NE lat lngdan SW lat lng. Tujuan saya sederhana, saya menggunakan RStudio dan saya ingin membuat kotak pembatas dari dua lat dan long di atas dan kemudian menghasilkan Polygon dan saya ingin menambahkan titik acak ke dalam poligon persegi. Saya memiliki NELat / Lng dan SW-Lat / Lng dalam file csv yang dapat saya impor ke data.frame.

Saya hanya perlu sedikit panduan untuk memulai, saya sangat baru ke bahasa R, itu benar-benar berbeda dari apa yang saya terbiasa.

Sejauh ini saya punya ini:

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)

Saya baru saja melihat beberapa contoh di tempat lain tetapi saya tidak dapat merencanakan poligon dengan 4 sudut.


Anda hanya memiliki satu duplikat koordinat dalam r1, apakah itu dimaksudkan sebagai 'r1 = rbind (coords, coordsmax) `??
mdsumner

Ya, perbaiki. Itu masih tidak berfungsi sekalipun
user134611

Mengatasi masalah dengan hati-hati satu kali adalah cara yang baik untuk mendapatkan solusi. Saya menganggapnya bug yang tidak kesalahan Polygon () ketika diberikan hanya dua atau satu koordinat, saya telah mencatat ini dalam masalah sp. Untuk Anda q, perpustakaan (raster); SPs1 <- as (sejauh (r1), "SpatialPolygons"); plot (SPs1)
mdsumner

saya menyesal karena saya harus menggunakan fungsi jawaban stackexchange tetapi reputasi saya tidak cukup tinggi untuk berkomentar. @ dof1985 Anda menggunakan (x_min, y_min), (x_max, y_min), (x_max, y_max), (x_max, y_min), (x_min, y_min) sebagai koordinat untuk membuat poligon. saya sudah mencoba yang sama, tetapi gagal. kemudian saya melihat lebih dekat pada contoh Anda dan memeriksa, yang Anda gunakan alih-alih (x_min, y_min), (x_max, y_min), ... mengikuti (x_min, y_min), (x_min, y_max), ... bisakah ini menjadi alasan kesalahan saya? tolong perbaiki contoh Anda :)
ExploreR

Jawaban:


7

Beberapa perubahan telah dilakukan pada kode Anda:

Pertama, perhatikan bahwa saya menjatuhkan pembuatan poin. Anda dapat membentuk poligon tanpa menggunakan SpatialPoints. Meskipun dalam kasus banyak titik yang terlibat akan lebih baik untuk membuat poligon dari titik.

Kedua, saya menulis 5 pasangan koordinat dalam matriks di bawah ini. Setiap pasangan koordinat berdiri untuk satu sudut kotak pembatas Anda, dan yang kelima mengulangi poin pertama. Yaitu matriks termasuk: [ (x_min, y_min) , (x_max, y_min), (x_max, y_max), (x_max, y_min), (x_min, y_min) ]

Akhirnya, saya menggunakan SpatialPolygonsdengan espg:4326membentuk objek-plot mampu dalam konteks geografis.

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)

Inilah yang terjadi jika saya memplot kode Anda:

Poligon yang terlihat seperti garis

dan ini setelah modifikasi kode yang disajikan di sini:

Kotak Ikatan


itu dia! Bisakah Anda berkomentar sedikit proj4String? Apakah Anda mendefinisikan karakteristik lat dan panjang melaluinya?
user134611

Tekan ?is.projecteddi R-console untuk melihat proj4stringbantuannya. Ya itu digunakan untuk mendefinisikan kelas CRS ke objek spasial
dof1985

21

Anda bisa membuat sarang extentfungsi, dari pustaka raster, asuntuk membuat objek 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)

2
ini sepertinya cara yang lebih baik daripada jawaban saya.
dof1985
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.