Bagaimana cara menghitung koordinat max dan min untuk beberapa poligon?

8

Saya ingin menghitung koordinat latidudinal maksimum, median, dan minimum untuk satu set besar poligon, menggunakan QGIS atau R. Jadi titik tertinggi dan terendah yang dicapai oleh setiap poligon melintasi rentang latidudinal. Central coords mudah dilakukan, tetapi mengubah poligon menjadi titik, dan menggunakan matriks jarak di QGIS membuat komputer saya crash. Apakah ada cara yang lebih efisien untuk melakukan ini?

Telah diminta dalam berbagai samaran di sini, tetapi 1. Tidak jelas 2. ketinggalan jaman saya pikir versi bijaksana atau 3. crash pada PC saya karena saya memiliki sekitar 2000 poligon.

Tamu2345234562
sumber

Jawaban:

7

Anda bisa melakukannya seperti ini:

library(raster)
# example data
g <- getData('GADM', country='BRA', level=1)

ext <- t(sapply(1:length(g), function(i) as.vector(extent(g[i,]))))
colnames(ext) <- c('xmin', 'xmax', 'ymin', 'ymax')

head(ext)
#          xmin      xmax       ymin      ymax
#[1,] -73.98971 -66.58875 -11.145161 -7.121320
#[2,] -38.23634 -35.15182 -10.501529 -8.814987
#[3,] -54.87619 -49.86681  -1.236008  4.442360
#[4,] -73.79568 -56.09750  -9.814520  2.246201
#[5,] -46.61705 -37.34903 -18.349859 -8.533636
#[6,] -41.42347 -37.25208  -7.858196 -2.784583

Dan lanjutkan seperti ini:

d <- data.frame(state=g$NAME_1, ext)
head(d)

#     state      xmin      xmax       ymin      ymax
#1     Acre -73.98971 -66.58875 -11.145161 -7.121320
#2  Alagoas -38.23634 -35.15182 -10.501529 -8.814987
#3    Amapá -54.87619 -49.86681  -1.236008  4.442360
#4 Amazonas -73.79568 -56.09750  -9.814520  2.246201
#5    Bahia -46.61705 -37.34903 -18.349859 -8.533636
#6    Ceará -41.42347 -37.25208  -7.858196 -2.784583
Robert Hijmans
sumber
Bagus! ---------------------
mdsumner
Yah, itu elegan. Semua jawaban tampaknya melakukan trik, tetapi ini memenangkan imo untuk efisiensi dan kesederhanaan. Terima kasih!
Tamu2345234562
5

Di QGIS, Anda bisa menggunakan alat Polygon dari Layer Extent ... dari toolbar ( Vector> Research Tools> Polygon dari Layer Extent ... ).

Ini pada dasarnya menampilkan lapisan kotak pembatas untuk setiap fitur (jika Anda memilih opsi) dengan bidang yang berisi koordinat max, pusat dan min X dan Y bersama dengan beberapa statistik lainnya:

Polygon dari Layer Extent

Contoh poligon

Tabel hasil atribut

Yusuf
sumber
1
Saya pikir itu berhasil - terima kasih! Namun, dan ini mungkin pertanyaan umum QGIS - tidak menghemat ID objek. Apakah urutan output sama dengan input poligon? Apakah ada cara untuk memastikan bahwa itu adalah, yaitu mencocokkan setiap kotak pembatas yang benar dengan data lain di shapefile asli.
Tamu2345234562
@ Guest2345234562 - Selamat datang sobat! Ya, saya percaya urutan output cocok dengan input. Saya melakukan pemeriksaan cepat dengan secara spasial bergabung dengan lapisan (misalnya menggunakan alat Gabung atribut berdasarkan lokasi ) dan mereka tampaknya cocok dengan baik.
Joseph
Adakah yang tahu di mana ini di QGIS 3? Terima kasih
Ian Allan
5

Dalam R

  1. membacanya dengan x <- gdal::readOGR(datasource, layername)format apa saja

  2. gunakan as(x, "class")paksaan untuk mengonversi dari poligon ke batas garisnya ke titik komponennya (dan dengan mudah, catat objek dan cincin ID)

  3. Gunakan fungsi ringkasan dengan cara standar untuk X / Y yang dikelompokkan berdasarkan ID poligon

Contoh:

library(rgdal)
dsn <- system.file("vectors/ps_cant_31.MIF", package = "rgdal")[1]
ogrInfo(dsn=dsn, layer="ps_cant_31")
ps_cant_31 <- readOGR(dsn=dsn, layer="ps_cant_31")

## cast to lines and then to points (creates columns  Lines.NR, Lines.ID,     Line.NR to identify pieces)

p <-  as(as(ps_cant_31, "SpatialLinesDataFrame"), "SpatialPointsDataFrame")
coords <- coordinates(p)
## see that Lines.NR groups your original polygons (nrow(ps_cant_31))
#spplot(p["Lines.NR"])

## summarize the Y-coordinate into groups defined by original polygon object
tapply(coords[,2], p$Lines.NR, median)
tapply(coords[,2], p$Lines.NR, max)
tapply(coords[,2], p$Lines.NR, min)

Anda menyebutkan "rentang lintang" tetapi tidak menentukan apakah koordinat Anda berada dalam sistem koordinat yang diproyeksikan, jika mereka Anda perlu memastikan Anda tidak memproyeksikan dan mengklasifikasikan berdasarkan lintang (bukan hanya Y) jika itu masalahnya.

Saya akan sangat menyarankan Anda memeriksa dplyrringkasan akhir, alat bawaan R's sangat kuat tapi melelahkan jika dilihat. Sayangnya dengan spAnda perlu mengkonversi secara manual antara array koordinat dan data.framemembentuk cukup rutin untuk mendapatkan jawaban semacam ini, tetapi semua itu bisa dilakukan.

Akhirnya, jika ini adalah apa yang Anda inginkan setelah itu tidak akan memakan waktu sama sekali, selama sumber daya memori virtual Anda cocok dengan set data yang Anda miliki, untuk membacanya sekaligus dan melakukan pekerjaan dalam satu langkah seperti ini.

mdsumner
sumber
3

Di QGIS, Anda bisa menggunakan ekspresi untuk menambahkan bidang menggunakan Kalkulator Bidang

Ekspresi berikut akan memberi Anda koordinat min dan maks untuk poligon

xmin($geometry)
xmax($geometry)
ymin($geometry)
ymax($geometry)

Untuk koordinat pusat, Anda dapat menggunakan

xmin(centroid($geometry))
ymin(centroid($geometry))
spatialthoughts
sumber