Saya menggunakan pyqgis dalam aplikasi mandiri. Sekarang saya ingin membuat ekspresi khusus untuk digunakan sebagai filterExpression ruleBasedRendererV2
. (Saya mencoba renderer dengan fungsi yang ada sebelumnya dan semuanya bekerja dengan baik!)
Kustom qgisfunction
(fungsi AND bitwise - karena belum ada fungsi seperti itu) terlihat seperti ini:
from qgis.utils import qgsfunction
@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
return value1 & value2
Saya juga mencoba mendaftarkannya, melalui:
from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and)
Menguji ekspresi melalui:
expressionString = 'bitwise_and(2, 2) = 2'
exp = QgsExpression(expressionString)
if exp.hasParserError():
print(exp.parserErrorString())
(Memberi 2=2
selalu True
) berfungsi setelah mendaftar fungsi, dan gagal jika tidak. Tapi tetap saja, saya tidak bisa menggunakan ekspresi dalam aturan ...
Saat ini, file yang berisi fungsi terletak di atas di folder proyek saya, yang secara otomatis dimasukkan ke PATH, bukan ?! (Menurut Nathan Woodrow, file dapat ditempatkan di mana saja di PATH - lihat https://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/ ).
PEMBARUAN: Mendaftarkan fungsi berfungsi sejauh ini, dengan kode dari atas - sekarang masalahnya terletak pada fungsi itu sendiri ...
PEMBARUAN # 2:
Sangat aneh! Fungsi sederhana do_nothing
mendapatkan dua argumen berfungsi dengan baik dalam kode saya:
@qgsfunction(args="auto", group='Python')
def do_nothing(value1, value2, feature, parent):
return value1
Menggunakan ekspresi expString = 'do_nothing(2, 2) = 2'
PEMBARUAN # 3:
Perubahan sederhana do_nothing
menjadi add_one
tidak berfungsi lagi:
@qgsfunction(args="auto", group='Python')
def add_one(value1, value2, feature, parent):
return value1 + 1
memanggilnya via expString = 'add_one(2, 2) = 3'
. Itu sebabnya saya pikir itu ada hubungannya dengan mengetik kembali ?!
sumber
~/.qgis2/python/expressions/
kemudian muat ulang QGIS dan fungsinya tersedia di bagian python ekspresi builder@qgsfunction
fungsi dalam kode Anda, seperti dalam Anda mendefinisikan fungsi dalam kode. Anda dapat mengabaikanexpressions
folder jika Anda membuat skrip Anda sendiri yang hanya untuk aplikasi utamado_nothing
). Tetapi fungsi asli sayabitwise_and
masih tidak berfungsi. Sekarang, saya pikir itu ada hubungannya dengan jenis kembalinya fungsi, karenado_nothing works
, tetapiadd_one
tidak!Jawaban:
Saya akhirnya memecahkan masalah!
Itu benar-benar tipe-masalah, karena nilai input didefinisikan sebagai
QVariant
di dalam@qgsfunction
. Jadi, untuk mendapatkan kode saya bekerja saya harus mengubahnya menjadi bilangan bulat terlebih dahulu. Tampaknya, QGIS menangani konversi tipe itu sendiri ...Fungsi terlihat seperti ini sekarang:
Dan jika Anda memiliki fungsi yang ditempatkan di folder proyek Anda, jangan lupa untuk mendaftarkannya terlebih dahulu:
sumber