„Wybierz według atrybutu” w QGIS przy użyciu Pythona?

16

Czy istnieje sposób użycia funkcji „Wybierz według atrybutu” w QGIS za pomocą polecenia python? W mojej wtyczce użytkownik powinien wprowadzić wartość za pomocą GUI, a ta wartość powinna zostać użyta w funkcji, która wybiera wszystkie funkcje posiadające ten atrybut. Nazwa kolumny jest ustalona w kodzie, funkcja powinna wyszukiwać tylko poprawną wartość.

W moim obecnym rozwiązaniu funkcja łączy QGIS z bazą danych PostgreSQL i uruchamia instrukcję SQL. Spowoduje to utworzenie tabeli z wyników, a tabela jest wizualizowana jako Shapefile w QGIS.

Zasadniczo wystarczy podświetlić funkcje i nie tworzyć nowego pliku kształtów zaznaczenia. Użycie funkcji „Wybierz według atrybutu” spowoduje także pominięcie niepotrzebnego połączenia z bazą danych.

Czy istnieje sposób użycia funkcji „Wybierz według atrybutu” w pythonie, aby wyróżnić funkcje? Używając funkcji w QGIS, wszystkie funkcje, które nie pasują do zapytania, są tymczasowo wygaszane, co również byłoby w porządku.

userHH
źródło
1
Te odpowiedzi wymagają aktualizacji qgis 3.
MonsterMushroom,

Odpowiedzi:

8

Tak. Możesz pobrać wszystkie atrybuty poprzez powiązania Pythona i zaimplementować dodatkowe filtrowanie we własnej wtyczce. Zobacz ten fragment PyQGIS Coobook dla podsumowania i kilka przykładów. Następnie po prostu wykluczyłbyś wszelkie niepasujące wyniki ze zwróconego słownika.

Jeśli chodzi o wizualizację, prawdopodobnie nadal będziesz musiał utworzyć kolejną warstwę, ponieważ select()nie ma odpowiednich argumentów. Możesz użyć warstwy pamięci, aby uniknąć konieczności tworzenia fizycznych plików (więcej na ten temat w książce kucharskiej).

edytować:

W rzeczywistości można użyć za selectedFeaturesIds()pomocą przycisku, setSelectedFeatures(ids)aby zmienić wybór na utworzony podzbiór. Cytując implementację bezpośrednio:

/** Get a copy of the user-selected features */  
QList<QgsFeature> selectedFeatures();

/** Return reference to identifiers of selected features */
const QSet<qint64> &selectedFeaturesIds() const;

/** Change selection to the new set of features */
void setSelectedFeatures(const QSet<qint64> &ids);
lynxlynxlynx
źródło
Jaka szkoda! Myślałem, że jest to możliwe w QGIS, ponieważ jest to również możliwe w ArcGIS przy użyciu arcpy. Niemniej jednak dziękuję za odpowiedź!
userHH
Może jest jakiś sposób; Po prostu tego nie wiem. Daj innym użytkownikom witryny trochę czasu - może ktoś to zrobi.
lynxlynxlynx
Myślę, że to musi być możliwe. W QGIS wszystkie funkcje są wizualizowane, które pasują do zaznaczenia, wszystkie inne funkcje są tymczasowo wygaszane.
userHH
Znalazłem to. QGIS robi to w rdzeniu, ale wygląda na to, że udostępnia wystarczająco dużo interfejsu, aby odpowiednio dostosować wybór.
lynxlynxlynx
Czy możesz wysłać mi link?
userHH
9

Począwszy od QGIS 2.2 jest to obsługiwane w bardzo naturalny sposób. Można to zrobić za pomocą silnika wyrażeń QGIS przy użyciu tej QgsFeatureRequest.setFilterExpression( unicode )metody.

# The important part: get the feature iterator with an expression
it = l.getFeatures( QgsFeatureRequest().setFilterExpression ( u'"Counties" = \'Norwich\'' ) )
# Set the selection
l.setSelectedFeatures( [ f.id() for f in it ] )

Najlepsza rzecz: jeśli masz najnowszą wersję QGIS (2.10 i późniejszą), zostanie ona odfiltrowana bezpośrednio w bazie danych o wiele bardziej wydajna niż inne rozwiązania, a jednocześnie bardzo czytelna.

Matthias Kuhn
źródło