menetapkan dan memindahkan centroid ke poligon mereka

9

Saya menggunakan QGIS 1.8 Lisboa. Setelah menghitung centroid dari bentuk poligon, jika beberapa dari mereka berada di luar garis poligon, saya ingin memindahkannya pada poligon tempat asalnya. Kriteria harus univocal karena saya harus menggunakannya untuk mengekstrak koordinat untuk digunakan sebagai kode identifikasi poligon itu sendiri. Oleh karena itu, prosedur harus menampilkan lokasi titik yang sama setiap kali berjalan untuk poligon yang sama (bukan posisi acak seperti yang diberikan oleh fungsi "titik acak", yang memberikan hasil baru setiap kali dijalankan).

umbe1987
sumber
1
Kedengarannya seperti dua pertanyaan. Jika saya mengerti dengan benar, Anda ingin (a) menambahkan titik acak di dalam poligon dan (b) memberi mereka atau poligon ID unik berdasarkan ini. Hal paling sederhana yang muncul dalam pikiran untuk (a) adalah menggunakan kemampuan titik acak yang ada di QGIS dan kemudian hanya memotong titik awan itu dengan poligon Anda.
lynxlynxlynx
menggunakan fungsi "titik acak" waktu yang berbeda dengan poligon yang sama mengarah ke hasil yang berbeda (yaitu, posisi titik yang berasal dari setiap poligon berbeda pada setiap penggunaan fungsi baru), dan saya ingin membuat metode yang akan memberi saya selalu titik yang sama per poligon dari tempat saya dapat mengekstrak koordinat yang ingin saya gunakan sebagai kode identifikasi untuk poligon itu sendiri.
umbe1987
gunakan alat 'true centroid' fTools di bawah alat geometri - docs.qgis.org/html/id/docs/user_manual/plugins/…
Mapperz
itu hanya memberi saya centroid, tetapi ini juga bisa berada di luar poligon, yang harus saya hindari. Saya perlu memindahkan mereka pada poligon yang berasal dari mereka, menggunakan fungsi seperti jarak minimum (tapi saya tidak tertarik pada jarak, saya ingin dipindahkan). Di blog lain seseorang menyuruh saya untuk menggunakan ST_PointOnSurface of PostGIS (tapi saya menggunakan QGIS).
umbe1987
2
apakah ini duplikat dari gis.stackexchange.com/questions/50029/... sekarang?
underdark

Jawaban:

7

Anda bisa menggunakan pustaka python Shapely, yang menyediakan fungsi representative_point()yang dijamin terletak di dalam poligon.

Berikut ini adalah skrip Python yang dapat dijalankan di konsol Python QGIS. Lapisan poligon yang ingin Anda buat atributnya harus dipilih. Fungsi mengambil nama atribut yang ingin Anda perbarui. Atribut harus sudah ada di layer Anda, itu harus tipe string, dan itu harus cukup panjang (30 karakter).

Berikut adalah contoh poin yang ditemukan algoritma:

import shapely.wkb

def setIDPoint(attributename):
 layer = qgis.utils.iface.activeLayer()
 provider = layer.dataProvider()
 fields = provider.fields()
 provider.select(provider.attributeIndexes() )
 attributeID = provider.fieldNameIndex(attributename)
 feature = QgsFeature()
 layer.startEditing()
 while provider.nextFeature(feature):
  wkb = feature.geometry().asWkb()
  polygon = shapely.wkb.loads(wkb)
  reprPoint = ','.join([str(polygon.representative_point().x), str(polygon.representative_point().y)] )
  feature.changeAttribute(attributeID, reprPoint)
  layer.updateFeature(feature)
 layer.commitChanges()
Jake
sumber
Saya mencoba mengujinya, sepertinya persis apa yang saya cari. Saya akan memberi tahu Anda segera setelah saya menjalankannya!
umbe1987
satu hal yang saya tidak mengerti adalah apa yang Anda maksud dengan "itu harus tipe string, dan itu harus cukup panjang (30 karakter)". Apakah perpustakaan ini bekerja langsung pada poligon shpfiles? Jika demikian, apakah saya harus membuat bidang tipe string baru di Tab Att dengan setidaknya 30 karakter, dan ini yang akan diperbarui?
umbe1987
@ user9518: Ya, cara fungsi ini ditulis saat Anda harus membuat atribut di tabel sendiri, dan kemudian hanya meneruskan nama bidang ke fungsi. Script juga dapat dengan mudah diadaptasi untuk membuat bidang yang diperlukan itu sendiri, jika itu yang diperlukan.
Jake
Saya hanya melewatkan satu hal. Sepertinya sekarang saya mendefinisikan fungsi (atau kelas) dengan mengetikkan "def", tetapi kemudian ketika saya berakhir menulis skrip itu tidak terjadi apa-apa. Bagaimana akhirnya saya bisa mendapatkan hasilnya di meja saya?
umbe1987
1
Itu bekerja dengan sempurna !!! Saya membayangkan koordinat ditulis sesuai dengan sistem koordinat layer dan bahwa jika saya ingin memiliki poin saya perlu membuat shp dengan koordinat tersebut, kan? Jika Anda di sini saya akan menawarkan Anda setidaknya 3 bir! Terima kasih banyak atas upaya Anda !!!
umbe1987
5

Alat centroid ftools dapat menempatkan centroid di luar poligon jika cekung.

ST_PointOnSurfacepasti akan melakukan apa yang Anda inginkan. Anda dapat menggunakan perintah dari dalam QGIS jika Anda telah menginstal dengan menggunakan SPIT untuk mendapatkan shapefile Anda ke PostGIS dan kemudian menggunakan plugin PgQuery untuk menjalankan kueri.

Atau, jika menginstal PostGIS sedikit banyak untuk sekali pakai, Anda bisa menggunakan Spatialite dari dalam QGIS. Anda kemudian dapat menggunakan plugin QSpatiaLite untuk mengimpor data Anda ke SpatiaLite dan menjalankan kueri (kehormatan SpatialLite ST_PointOnSurface).

MappaGnosis
sumber
2

ketika saya mengerti Anda benar, gunakan: Vector-> Research Tools_> Poin Acak. Sekarang pilih di bawah "Stratified Sampling Design (Individual polygons)" menggunakan nilai dari bidang input dan menggunakan bidang yang sesuai, yang memberikan nilai numerik poin, yang harus di-genereasi untuk setiap poligon yang berbeda

Kurt
sumber
apa yang Anda maksud dengan "bidang yang sesuai"? Saya berpikir untuk menggunakan centroid dan kemudian menghubungkannya ke bagian terdekat dari poligon yang dimaksud, jika diletakkan di luar garis besar, dengan (misalnya) menghitung jarak minimum dari titik tersebut ke poligon terdekat. Tujuannya adalah untuk mengekstrak koordinat titik tersebut untuk menggunakannya sebagai kode identifikasi spesifik poligon yang unik.
umbe1987
Pada dasarnya apa yang saya coba lakukan adalah menetapkan setiap centroid untuk poligon relatifnya dan memindahkannya untuk berada di dalam poligonnya (atau setidaknya menyentuh garis batasnya).
umbe1987
@ user9518: maaf, saya salah paham pertanyaan Anda. Saya pikir Anda ingin sejumlah titik acak dalam setiap poli, misalnya 2 poin fpr poli 1, 10 poin dalam poly2 dll. Oleh karena itu istilah "bidang yang sesuai". tentu saja Anda dapat memilih 1 untuk "gunakan jumlah poin ini" untuk menghasilkan hanya satu poin untuk setiap poli. titik ini berada di dalam poli atau paling tidak menyentuh garis pembatasnya. tetapi poin ini masih ditemukan per acak, jadi ketika Anda mengulang prosedur Anda mendapatkan poin lain :-(
Kurt
1

plugin realcentroids, tersedia untuk diinstal melalui Plugins> Manage and Install Plugins bekerja untuk saya di QGIS 2.2 untuk menghasilkan titik-titik seperti centroid, dipaksa di dalam setiap poligon jika cekung (titik akan terletak sangat dekat dengan tepi). Saya mencoba alat Poin acak seperti yang disarankan oleh Kurt, dan meskipun saya menentukan 1 poin per poligon, itu menghasilkan dua sebagai gantinya. Kerugian tambahan adalah bahwa dalam kebanyakan kasus, poin tidak mewakili centroid karena mereka acak.

http://www.agt.bme.hu/gis/qgis/realcentroid/

Alexandra Mates
sumber