Pyqgis'te özel qgsfunction kaydetme


9

Bağımsız bir uygulamada pyqgis kullanıyorum. Şimdi kural olarak filterExpression olarak kullanmak için özel bir ifade oluşturmak istedim ruleBasedRendererV2. (Daha önce mevcut işlevlerle oluşturucuyu denedim ve her şey iyi çalıştı!)

Özel qgisfunction(bitsel AND işlevi - henüz böyle bir işlev olmadığından) şöyle görünür:

from qgis.utils import qgsfunction

@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
    return value1 & value2

Ayrıca, kaydetmeye çalıştım:

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 

İfadeyi şu yolla test etme:

expressionString = 'bitwise_and(2, 2) = 2'
exp = QgsExpression(expressionString)
if exp.hasParserError():
    print(exp.parserErrorString())

( 2=2Her zaman bu şekilde verilir True) işlevi kaydettikten sonra çalışır ve değilse başarısız olur. Ama yine de, ifadeyi kural içinde kullanamıyorum ...

Şu anda, işlevi içeren dosya otomatik olarak PATH'e dahil edilen proje klasörümde en üstte yer alıyor, değil mi ?! (Nathan Woodrow'a göre, dosya PATH'ın herhangi bir yerine yerleştirilebilir - bkz. Https://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/ ).

GÜNCELLEME: Fonksiyonun kaydedilmesi şu ana kadar çalışıyor, yukarıdan kodla - şimdi sorun fonksiyonun kendisinde yatıyor ...

GÜNCELLEME # 2:

Çok ilginç! do_nothingİki argüman almak basit fonksiyon benim kodda iyi çalışıyor:

@qgsfunction(args="auto", group='Python')
def do_nothing(value1, value2, feature, parent):
    return value1

İfadeyi kullanma expString = 'do_nothing(2, 2) = 2'

GÜNCELLEME # 3:

Basit bir değişiklik do_nothingiçin add_oneartık çalışmaz:

@qgsfunction(args="auto", group='Python')
def add_one(value1, value2, feature, parent):
    return value1 + 1

aracılığıyla çağırıyor expString = 'add_one(2, 2) = 3'. Bu yüzden geri dönen tip ile ilgili bir şey olduğunu düşünüyorum ?!


1
Dosyanızı ~/.qgis2/python/expressions/
kopyaladıktan sonra QGIS'i

Tavsiyenizi takiben, işlev QGIS işlev düzenleyicisinde görünür ve beklendiği gibi kullanabilirim. Ancak bağımsız uygulamamda kullanmaya çalışırken, işlev çalışmıyor! - Bence, QGIS başladığında, bir şekilde tüm dosyaları ifade klasörüne kaydeder, ama nasıl?
Henhuy

Koddaki @qgsfunctionişlevi kullandığınız gibi, kodunuzdaki işlevi mi kullanıyorsunuz ? expressionsSadece ana uygulama için olan kendi komut dosyanızı oluşturuyorsanız klasörü yok sayabilirsiniz
Nathan W

Haklısınız - fonksiyonun kaydedilmesi yukarıda açıklandığı gibi çalışır (örneğin do_nothing). Ama orijinal bitwise_andişlevim hala çalışmıyor. Şimdi, o zamandan beri, işlevin dönüş türü ile ilgili bir şey olduğunu düşünüyorum do_nothing works, ama add_onedeğil!
Henhuy

Yanıtlar:


8

Sonunda sorunu çözdüm!

Giriş değerleri QVariantiçeride tanımlandığından, bu gerçekten bir tür problemiydi @qgsfunction. Yani, kod işimi almak için önce tamsayılara dönüştürmek zorunda kaldım. Görünüşe göre, QGIS tip dönüşümlerinin kendisi ile ilgileniyor ...

İşlev şu şekilde görünüyor:

@qgsfunction(args="auto", group='Python')
def bitwise_and(value1, value2, feature, parent):
    return value1.toInt()[0] & value2.toInt()[0]

İşlevi proje klasörünüze yerleştirdiyseniz, önce kaydetmeyi unutmayın:

from qgis.core import QgsExpression
QgsExpression.registerFunction(bitwise_and) 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.