PyQt4 Qgis memory layer als .shp schreiben

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Amelie
User
Beiträge: 16
Registriert: Montag 7. März 2011, 14:48

Hallo,
Ich arbeite gerade an einem Plugin für das georeferencing Program QGIS 1.6 mit integriertem Python 2.5 und PyQt4.
Mein Problem liegt wahrscheinlich nicht direkt an Python, aber vielleicht doch an meinem Verständnis der Sprache...
In dem Plugin habe ich einen Vector Layer, und erstelle einen weiteren in memory.

Code: Alles auswählen

newLayer = QgsVectorLayer("Point", newLayer_name, "memory")
Nachdem ich den neuen Layer bearbeitet habe, möchte ich ihn mit HIlfe von QgsVectorFileWrite.writeAsShapefile als abspeichern. Allerdings funktioniert das nicht (trotz Vergleichen mit etlichen Beispielen und docs). Ich erhalte keine Fehlermeldung, außer meiner QMessageBox.warning und die Datei wird nicht gespeichert. Hat vielelicht jemand Erfahrungen damit? Oder sieht einen Fehler im Skript?
Vielen vielen Dank für jegliche Hinweise!

Code: Alles auswählen

    # make sure layer doesn't already exist
      QgsVectorFileWriter.deleteShapeFile(self.newLayer_filePath) 
      
      # use properties of original layer
      encoding = self.provider.encoding()
      geom = self.provider.geometryType()
      fields = self.newProvider.fields()
      crs = self.provider.crs()
      self.newProvider.select(self.newProvider.attributeIndexes())

      writer = QgsVectorFileWriter.writeAsShapefile(self.newLayer, self.newLayer_dir, "CP1250", crs)
      if writer == QgsVectorFileWriter.NoError:
         QMessageBox.warning(None, 'myfile', "the newLayer was saved as  " + self.newLayer_dir)
      else: 
         QMessageBox.warning(None, myfile, 'error when saving newLayer')

      # flush writer to disk
      del writer
BlackJack

@Amelie: `writer` ist dann also nicht `QgsVectorFileWriter.NoError` -- aber was ist es denn dann!? Lass Dir das doch mal ausgeben, vielleicht enthält es ja einen Hinweis.

Das ``del`` am Ende ist übrigens eigenartig. Sollte das tatsächlich irgend etwas bewirken, dann ist diese Wirkung so nicht garantiert.
Amelie
User
Beiträge: 16
Registriert: Montag 7. März 2011, 14:48

BlackJack hat geschrieben:@Amelie: `writer` ist dann also nicht `QgsVectorFileWriter.NoError` -- aber was ist es denn dann!? Lass Dir das doch mal ausgeben, vielleicht enthält es ja einen Hinweis.
wenn ich mir writer.hasError() ausgeben lasse ist die Ausgabe: 2
Leider konnte ich bisher nicht herausfinden, was das bedeutet.
BlackJack hat geschrieben:Das ``del`` am Ende ist übrigens eigenartig. Sollte das tatsächlich irgend etwas bewirken, dann ist diese Wirkung so nicht garantiert.
Das stammt aus verschiedenen Beispielen, z.B. aus der PyQGIS Doumentation S. 17 (http://linfiniti.com/wp-content/uploads ... PyQGIS.pdf)
BlackJack

@Amelie: Wenn Du `writer.hasError()` schreibst, solltest Du zumindest bei dem Quelltext im ersten Beitrag etwas in der Richtung ``AttributeError: 'int' object has no attribute 'hasError'`` bekommen.

Tjaja, die Freuden einer API die Zahlen als Fehlerindikatoren zurück gibt, statt eine aussagekräftige Ausnahme auszulösen. Hier ist die API-Doku von den Fehlerwerten in der darunter liegenden C++-Bibliothek: http://doc.qgis.org/stable/classQgsVect ... ae5bd9bade
Nummeriere die Namen in Gedanken von 0 an durch, dann kommst Du auf 2 == `ErrCreateDataSource`.

Für die Verwendung von ``del`` sollte man den Autor der PyQGIS-Dokumentation schlagen. Der Kommentar stimmt nicht, und es ist eben nicht garantiert, dass auch wirklich das passiert was der Kommentar nahe legt. ``del`` löscht nicht das Objekt, sondern nur den *Namen* `writer`. Ob das dazu führt, dass auch das Objekt aus dem Speicher entfernt wird und dadurch dann "Aufräumcode" ausgeführt wird, ist überhaupt nicht garantiert. Auf so etwas sollte man sich nicht verlassen, sondern auf dem Objekt eine Methode aufrufen, die das raus schreiben der veränderten Daten forciert. Wenn es so eine Methode nicht gibt, sollte man die Entwickler vielleicht gleich noch einmal schlagen. :twisted:
Antworten