[Fossgis-talk] Abfrage verbundener Wert
Bernhard.Stroebl at jena.de
Bernhard.Stroebl at jena.de
Mo Mai 30 08:32:26 CEST 2011
Hallo Michael,
soweit ich verstanden habe, hast Du eine 1:n-Verknüpfung (1
Flurstücksdatensatz hat 1..n Besitzerdatensätze). QGIS kann standarmäßig
zu einer Fläche immer nur _einen_ Datensatz anzeigen. Dieses Problem
haben sicher schon einige gelöst, aber die Lösungen wissen nicht, wie
Dein Datenmodell aussieht. Du wirst also um ein bischen Programmierung
nicht herumkommen.
So würde ich es machen:
1) Das ganze kommt in ein Plugin. Das Plugin hat einen Menüpunkt, mit
dem Du die Info für ein ausgewähltes Flurstück erhältst. In der
__init__-Funktion dese Plugins baust Du eine Verbindung auf Deine DB:
self.db = QtSql.QSqlDatabase.addDatabase ("QPSQL")
self.db.setHostName("127.0.0.1") # dies wäre der localhost
self.db.setDatabaseName("DBName")
self.db.setUserName("username")
self.db.setPassword("geheim")
ok = self.db.open()
# in unload sollte die DB-Verbindung wieder geschlossen werden:
def unload(self):
self.db.close()
# so bekommst Du die featureId des ersten ausgewählten Flurstücks
# im aktiven Thema
layer = self.iface.activeLayer()
featureId = layer.selectedFeaturesIds()[0]
# So wird der Dialog aufgerufen:
dlg = myDialog(self.iface, featureId, self.db)
dlg.show()
result = dlg.exec_()
2) Benutze die PluginBuilder-Erweiterung, um Dir ein "leeres" Plugin mit
einem Ui zu machen. Im Ui fügst Du einen QTableView hinzu, den Du mit
einem QSqlQueryModel füllst. Wenn Du das Dialog-Objekt baust übergibst
Du ihm die DB-Verbindung.
So sieht ungefähr die Dialogklasse aus:
from PyQt4 import QtCore, QtGui, QtSql
class myDialog(QtGui.QDialog):
def __init__(self, iface, featureId, db):
QtGui.QDialog.__init__( self )
# Set up the user interface from Designer.
self.ui = Ui_meinDialog()
self.ui.setupUi(self)
# keep reference to QGIS interface
self.iface = iface
self.featureId = featureId
self.db = db
self.fillTableView()
def fillTableView(self):
queryString = "SELECT besitzer FROM besitzertabelle \
WHERE flurstueck_id = :featureId ORDER BY besitzer;"
query = QtSql.QSqlQuery(self.db)
query.prepare(queryString)
query.bindValue(:featureId, QtCore.QVariant(self.featureId))
model = QtSql.QSqlQueryModel()
model.setQuery(query)
tblView = self.thisDialog.findChild(QtGui.QTableView,
'myTableView')
tblView.setModel(model)
Für weitere Infos, die Qt-Hilfe und die Qgis-api Dokumentation
hoffe, das hilft
Grüße
Bernhard
Am 27.05.2011 12:46, schrieb Michael Weninger:
>
> Hallo Liste!
>
> Ich bin schon einige Zeit auf der Suche nach einer Lösung für meine
> Aufgabe:
>
> Ich habe 2 Tabellen in PostGis, die miteinander verknüpft (über
> Einlagezahl und Grundbuchnummer) sind (Grundstücke, Besitzer (ev. auch
> mehrere auf einem Grundstück)). So jetzt will ich in QGIS, wenn ich auf
> ein Grundstück klicke die Information, wer das Grundstück besitzt.
>
> Ich habe schon einige Gedanken verfolgt, weiß aber nicht was die beste
> Lösung sein kann beziehungsweise kam ich zu keinem (entsprechenden)
> Ergebnis:
> 1.) Plugin, welches die Auswahl in SQL-Query übergibt und das Ergebnis
> darstellt (z.B.: select * from besitzer where einlagezahl = "Selektion
> aus QGIS" and grundbuchnummer = "Selektion aus QGIS")
> 2.) Aktion die aufgerufen wird
> 3.) Selbstdefinierte UI, die die Auswahl (Grundstücke) samt damit
> verbundener Subtabelle (Besitzer) darstellt.
>
> Meine Fragen:
> Gibt es bereits umgesetze Lösungen, die ich noch nicht gefunden habe?
> Welches Ansatz sieht für euch am praktikabelsten aus?
> Wie komme ich zum Ziel? (so gut wie keine Programmierkenntnisse,
> Grundlagen Postgres und SQL)
>
> Danke für eure Hilfe im Voraus!
>
> Noch eine schöne Zeit!
>
> Michael
>
> _______________________________________________
> Fossgis-talk-liste mailing list
> Fossgis-talk-liste at fossgis.de
> https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste
>
>
> ________ Information from NOD32 ________
> This message was checked by NOD32 Antivirus System for Linux Mail Server.
> http://www.nod32.com
________ Information from NOD32 ________
This message was checked by NOD32 Antivirus System for Linux Mail Server.
http://www.nod32.com