Saya sedang bekerja dengan cara membuat proyek hidrologi menggunakan QGIS dan lembar kerja Excel yang saya miliki. Untuk melakukan ini, saya ingin mengekstraksi beberapa informasi dari garis, termasuk dalam lapisan vektor, yang mewakili bagian pipa.
Informasi yang perlu saya ekstrak adalah:
- Nomor ID
- Panjangnya
- X, Y memulai dan mengakhiri koordinat
Saya telah menemukan cara untuk menangkap bidang ini menggunakan "$ length" dan algoritma lain untuk koordinat X dan Y, tetapi untuk itu saya perlu membuka tabel Attributes, meletakkan ekspresi di setiap kolom atribut dan klik untuk memperbarui bidang.
Apakah ada cara ketika saya menggambar garis bidang ini diisi secara otomatis? Yaitu, saya menggambar / mengedit garis (mulai mengedit atau mengakhiri node) dan ketika saya membuka tabel atribut, bidang panjang dan koordinat X, Y diisi dan diperbarui.
sumber
Jawaban:
Jika Anda hanya membutuhkan bidang ini di dalam QGIS , Anda dapat menggunakan bidang virtual. Ini memungkinkan menggunakan ekspresi (seperti
$length
) yang tergantung pada nilai-nilai lain atau geometri.Buka kalkulator bidang, tambahkan bidang baru dengan panjang nama, centang kotak "Bidang Virtual" dan masukkan
$length
sebagai ekspresi (atau yang lainnya untuk bidang lainnya).Namun ini tidak akan disimpan ke file excel.
Jika Anda ingin menyimpan file excel dalam sinkronisasi dengan file shp untuk geometri dan menyertakan bidang turunan dalam file excel, ada sebuah plugin bernama ShpSync yang mengetahui konsep ini dan memperbarui bidang secara otomatis ketika fitur diubah, ditambahkan atau dihapus.
sumber
Pertanyaan menarik! Saya tidak mengetahui cara lain untuk mencapai apa yang Anda inginkan, tetapi menggunakan PyQGIS.
Baca kode di bawah ini. Ini memiliki beberapa teks di dalamnya:
'lines'
,'length'
,'startX'
,'startY'
,'endX'
,'endY'
. Anda dapat menyesuaikan nama-nama itu dalam skrip agar dapat berfungsi pada data Anda. Yang pertama adalah Anda nama lapisan, sedangkan sisanya sesuai dengan nama bidang. Saya menganggap layer baris Anda memiliki bidang-bidang tersebut (setelah semua, Anda ingin nilai ditulis di sana).Setelah Anda menyesuaikan nama layer Anda dan nama-nama bidang yang ingin Anda perbarui secara otomatis, salin dan tempel skrip ke konsol Python QGIS.
Jika semuanya berjalan dengan baik, Anda harus dapat melihat bahwa nilai-nilai bidang secara otomatis diperbarui dalam dua skenario: 1) Ketika fitur baru ditambahkan, dan 2) Ketika geometri dimodifikasi.
Begini Cara kerjanya:
Jika Anda memiliki masalah saat menjalankan skrip, tambahkan komentar di bawah jawaban ini.
Mungkin berguna bagi Anda untuk memiliki fungsi ini sudah tersedia ketika Anda membuka proyek QGIS Anda. Jika itu masalahnya, katakan padaku, aku bisa mengirim instruksi untuk melakukan itu.
EDIT:
Agar fungsionalitas ini tersedia setiap kali Anda membuka proyek QGIS Anda (yaitu,
.qgs
file yang berisi, antara lain, lapisan baris Anda), Anda perlu mengikuti langkah-langkah ini:Pergi ke
QGIS->Project->Project Properties->Macros
, periksaPython macros
opsi, dan ganti seluruh kode dengan yang ini (sesuaikan nilai yang menunjukkan nama layer dan field Anda):Pastikan Anda mengaktifkan macro pada proyek Anda, cara ini:
Settings->Options->General->Enable macros: Always
.Simpan proyek QGIS Anda.
Sekarang, setiap kali Anda membuka
.qgs
file yang baru saja Anda simpan, atribut dari layer garis Anda akan secara otomatis diperbarui ketika Anda menambahkan fitur baru atau memodifikasi geometri (yaitu, tidak perlu menyalin apa pun ke dalam Konsol Python QGIS lagi).EDIT ke-2:
Saya baru saja menerbitkan sebuah plugin yang disebut AutoFields untuk membantu orang menyelesaikan masalah seperti ini. Saya bahkan membuat video yang menunjukkan bagaimana menyelesaikan masalah Anda, Anda dapat menontonnya di:
https://vimeo.com/germap/autofields-geometric-properties
Dokumentasi AutoFields: http://geotux.tuxfamily.org/index.php/en/geo-blogs/item/333-autofields-plugin-for-qgis
sumber
myLayer = QgsMapLayerRegistry.instance().mapLayersByName( 'Tramo' )[0]
Jika Anda benar-benar tertarik dengan plugin saya di masa depan, silakan kirim saran apa pun yang Anda miliki, saya menghargai itu. Anda dapat menghubungi saya di GeoTux .Untuk QGIS 3 pergi ke
Layers Properties
=>Attributes Form
=> pilih bidang Anda dengan nilai-nilai geometri (misalnya,area
) => ketik$area
dalamDefaults value
kotak dan centangApply default value on update
. Ini juga bisa menjadi berguna:$perimeter
,$y
,$x
,$id
sumber
Saya akan meletakkan data dalam database (PostGIS) dan mengekstrak data ke QGIS dengan tampilan (mungkin terwujud).
sumber