[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