Mengakses kanvas peta QGIS sebagai variabel untuk ekspresi

8

Apakah mungkin untuk mengakses Kanvas Peta QGIS sebagai variabel atau nilai ekspresi untuk digunakan dalam kalkulator lapangan atau mesin pelabelan?

(Yaitu agar Anda dapat membuat ekspresi yang memilih / menginterogasi fitur yang terlihat / hadir dalam tampilan tertentu kanvas dengan cara yang sama seperti komposer cetak 'menyaring legenda berdasarkan konten peta')

(QGIS 2.18.1 [osgeo4w], win7)

EDIT:
Potensial (fiksi) use case 1 - Ada 50 poligon dalam satu lapisan, saat ini ada 20 poligon yang terlihat dalam tampilan kanvas peta saat ini, saya ingin menata poligon biru jika ada <= 25 poligon yang terlihat atau gaya mereka hijau jika ada> = 25 poligon terlihat.

Potensi (fiksi) use case 2 - Ada 50 poligon dalam satu lapisan, saat ini ada 10 poligon yang terlihat, 5 yang memiliki nilai atribut 'Rumah' di bidang / kolom "Jenis Bangunan", dan 5 yang memiliki nilai 'Garasi' di bidang / kolom "Tipe Bangunan", terlihat pada tampilan kanvas peta saat ini. Kembali: nilai sama dengan jumlah poligon yang merupakan garasi ... answer = 5.

tamu lagi
sumber
3
Anda memiliki beberapa variabel (map_extent_center / height / width, map_id, map_scale, map_rotation) Jika tidak, dalam master, ada is_selected fungsi untuk mengetahui apakah fitur dipilih. Layak untuk memiliki rincian lebih lanjut tentang apa yang ingin Anda lakukan.
Denis Rouzaud
Terima kasih @Denis Rouzaud. Saya telah menggunakan beberapa variabel tersebut dalam berbagai konteks. Pertanyaan ini diajukan sebagai upaya yang disederhanakan untuk menyelesaikan masalah (atau satu bagian daripadanya) dalam pertanyaan lain yang saya ajukan di sini: gis.stackexchange.com/questions/218508/…
guestagain
@DenisRouzaud Apakah Anda ingin memposting itu sebagai jawaban? Kalau tidak, saya tergoda untuk menutup ini sebagai duplikat gis.stackexchange.com/questions/218508/…
underdark
Mari kita tutup. Pertanyaannya agak kabur.
Denis Rouzaud
1
Saya tidak berpikir pertanyaannya tidak jelas atau hanya duplikat dari pertanyaan terkait lainnya tetapi lebih rinci. Memang, secara khusus mencari solusi yang tidak dapat dipecahkan oleh variabel ekspresi yang tercantum dalam komentar pertama, dan resolusi untuk permintaan tidak terbatas pada kasus penggunaan dalam pertanyaan terkait. ... Dan tampaknya ada beberapa orang lain yang tertarik pada jawaban atas pertanyaan siapa yang harus memiliki aplikasi mereka sendiri untuk fungsionalitas tersebut atau penyelesaian saat ini mungkin.
guestagain

Jawaban:

1

Satu alat untuk melampaui variabel yang tersedia saat ini adalah ekspresi khusus python.

Sepengetahuan saya, ini adalah satu-satunya alat yang tersedia saat ini untuk mengakses kanvas peta dengan cara Anda menggambarkan dan menggunakan info itu dalam ekspresi.

Untuk menyelesaikan kasus penggunaan fiksi 1, Anda dapat melakukan sesuatu seperti ini:

from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')
def visibleFeaturesCount(layerName, feature, parent):
    lyr = QgsMapLayerRegistry.instance().mapLayersByName(layerName)[0]
    extentRect = iface.mapCanvas().extent()
    request = QgsFeatureRequest().setFilterRect(extentRect)
    feats = lyr.getFeatures(request)
    count = 0
    for feat in feats:
        count += 1
    return count

Lalu, Anda bisa mengatur gaya berdasarkan aturan menggunakan filter seperti:

visibleFeaturesCount('mylayer') > 20

API kanvas lengkap dapat ditemukan di sini .

Jesse McMillan
sumber
Terima kasih banyak @Jesse McMillan. Sepertinya jawaban yang sangat membantu yang akan saya uji lebih detail segera setelah saya mendapatkan rem dari proyek lain. Pengujian cepat dengan menempelkan di atas ke dalam dialog "Pilih dengan Ekspresi" sesuai tutorial yang ditautkan tidak berfungsi karena dialog tidak memiliki opsi / tombol untuk menyimpan dan atau menjalankan skrip dengan cara tutorial yang dijelaskan dan seperti yang ditampilkan dalam tangkapan layar. Baru menggunakan skrip python (atau apa pun namanya) tetapi tidak sabar untuk mulai memikirkannya. Di mana Anda berharap bahwa saya akan mendefinisikan / mengatur variabel menggunakan kode di atas?
guestagain
Agak membingungkan, tetapi yang Anda lakukan adalah memilih tombol 'muat' pada tab ekspresi kustom. Setelah dimuat, perintah tambahan akan ditampilkan dalam ekspresi qgis Anda yang tersedia.
Jesse McMillan