Membuat "kotak pembatas miring" dengan rasio lebar / tinggi maksimum?

13

Saya ingin membuat kotak di sekitarnya dengan rasio lebar / tinggi maxiumum ("kotak pembatas miring") dari serangkaian fitur input seperti yang ditunjukkan pada gambar di bawah ini:

masukkan deskripsi gambar di sini

Misalnya fungsi PostGIS ST_Envelopedan ST_Box2Djuga FME Transformers BoundingBoxReplacerdan BoundingBoxAccumulatormenghasilkan kotak pembatas paralel sumbu.

Setiap saran yang menggunakan pendekatan dengan PostGIS, QGIS atau FME sangat disambut baik!

Jochen Schwarze
sumber
Bukan duplikat yang tepat , karena pria itu tidak meminta solusi yang berlaku di FME atau PostGIS. Namun demikian, skrip python yang dimaksud dalam jawaban atas pertanyaan yang disebutkan di atas cukup berguna untuk dimasukkan ke dalam transformator FME PythonCaller. Jika saya memiliki ruang kerja yang berjalan, saya akan memposting solusi dengan skrip yang sedikit dimodifikasi.
Jochen Schwarze
Tidak hanya itu bukan duplikat, tetapi pertanyaan yang direferensikan belum diterima, dan ada pertanyaan yang belum terjawab mengenai algoritma mana yang digunakannya, dan apakah itu tepat atau tidak.
John Powell
Lihat jawaban saya di bawah ini. Anda harus dapat melakukan ini di FME. Versi apa yang Anda gunakan?
Fezter

Jawaban:

9

Ini mungkin berlebihan di depan pemrosesan dan kemungkinan ada solusi matematis yang lebih baik, tetapi sebagai contoh cara itu bisa dilakukan lebih sederhana sebagai kueri

SELECT 
   id, rotated_by, oblique_bound
  FROM 
     (
     SELECT 
        m.id,
        r rotated_by, 
        ST_Rotate(ST_Envelope(ST_Rotate(m.geom, r)),-r) oblique_bound,
        row_number OVER (PARTITION BY id) 
                   ORDER BY ST_Area(ST_Rotate(ST_Envelope(ST_Rotate(m.geom, r)),-r))) N
       FROM 
          generate_series(0, 90, 0.1) N(r), my_table m
    ) s
WHERE N = 1;

Ini memutar geometri, membuat batas, membalikkan rotasi untuk setiap sepersepuluh derajat antara 0 dan 90. Hasilnya adalah kotak pembatas dengan luas terkecil. Tentu saja ini bukan cara yang sepenuhnya akurat untuk melakukannya dan mungkin perlu mengutak-atik nilai kenaikan dalam seri tergantung pada kebutuhan Anda.

MickyT
sumber
Sebenarnya, saya pikir ini adalah solusi yang bagus. Solusi yang tepat sangat mahal. Anda dapat dengan mudah menambahkannya dalam plpgsql untuk merekam kotak x-bounding terbaik, dan jika keduanya sangat dekat, Anda dapat memperbesar dan melakukan beberapa rotasi kecil untuk mendekati solusi yang tepat. Akan selalu ada kasus tepi, tetapi pendekatan yang bagus.
John Powell
Dan sebagai manfaat tambahan mempertahankan sudut rotasi :-)
Jochen Schwarze
6

QGIS memiliki algoritma "kotak batas berorientasi minimum" yang melakukan hal ini.

ndawson
sumber
Ini disebut "kotak batas minimum Berorientasi". Anda dapat memanggilnya dari Processing Toolbox> Geoalgorithms QGIS> Alat umum vektor.
Stefan
Saya kira ini di luar QGIS 2.14, karena saya tidak dapat menemukannya di 2.14.15LTR yang masih kami gunakan di sini?
Jochen Schwarze
@JochenSchwarze ada di QGIS 2.14.19. Anda perlu mencari di Memproses kotak alat. Secara langsung, Anda dapat menemukannya di bawahProcessing toolbox -> QGIS geoalgorithms -> Vector General tools -> Oriented minimum bounding box
ahmadhanb
4

The kotak pembatas pengganti transformator, yang Anda sebutkan harus dapat melakukan hal ini. Menurut dokumentasi itu,

Mengganti geometri fitur dengan kotak pembatas dua dimensi atau kotak pembatas minimum dua dimensi.

Parameter ini memungkinkan Anda untuk memilih kotak pembatas sumbu-algined atau bujursangkar.

Rupanya, ada peningkatan yang disarankan untuk memasukkan sudut sisi yang lebih panjang dari kotak berlari yang berorientasi. Ini Nomor Aman PR # 53924.

Fezter
sumber