Mehr

Punktattribut aus zugrunde liegenden Rasterdaten TIFFTAG


Ich habe eine Schicht von manuell gesetzten Punkten in qgis, die im Moment die folgenden Attribute haben:

id, lat, lang

Außerdem habe ich eine Reihe von verschiedenen überlappenden Rasterbildern (Satellitendaten), die alle mit einem Datum versehen sind TIFFTAG_DATETIME in den Metadaten des Rasters.

Was ich tun möchte, ist ein zusätzliches Attribut für die Punktebene zu bilden, die aufgerufen wird Termine:

Termine = ["2015-01-01", "2015-12-01"]

Die Datumsliste sollte alle Datumsangaben von Satellitenbildern enthalten, die den bestimmten Punkt enthalten.

Irgendwelche Ideen, wie man dies in qgis macht. Bei Bedarf kann ich auch verschiedene Methoden zum Taggen der GeoTiff-Datei verwenden. Oder erstellen Sie vielleicht sogar Polygone, die das Datum als Attribute haben. Aber der Code, der die GeoTiff-Dateien erstellt und markiert, läuft außerhalb von qgis.


Eine Möglichkeit besteht darin, die Raster in Postgresql (mit Postgis-Erweiterung) zu bringen und einfach die Namen der Raster auszuwählen, die den Punkt überlappen. Für Python könntest du das installierenpsycopg2Bibliotheken dazu. Für den Import verwende ich dasraster2pgsqlTool, das SQL generiert, in das eingespeist werden kannpsql.

Weitere Informationen finden Sie auf der Seite PostGIS-Raster.

Postgis raster bietet die folgenden Rasterfunktionen für Bounding Boxes und konvexe Hüllen…

ST_Envelope() ST_ConvexHull() ST_MinConvexHull()

Der Letzte -ST_MinConvexHull- findet die konvexe Hülle ohne NODATA-Pixel, sodass Sie den Polygonumriss der Datenpixel erhalten. Dadurch eignet er sich für unregelmäßig geformte Schwaden oder Vermessungen.

Es gibt auchST_Polygon, die ein Multipolygon der Datenabdeckung zurückgibt, also kann ich mir vorstellen, dass dies Löcher / Lücken ermöglicht, aber ich konnte dies nicht überprüfen. Es könnte sich jedoch lohnen, nach DEMs zu suchen.

Das mögliche Problem bei der Verwendung von QgsRasterLayer.extent() besteht darin, dass a Begrenzungsrahmen, keine konvexe Hülle (oder Hülle) um die Datenpixel.

Wenn Sie Extent() verwenden, muss Ihr Test also auch einen Test auf data/nodata enthalten, wie Detlev betont hat. Ich habe es nicht mit gedrehten rechteckigen Rastern ausprobiert - aber es funktioniert bei rechteckigen Rastern mit einem gedrehten / unregelmäßigen Datenbereich, umgeben von NODATA.

Angenommen, Sie haben die Raster in Postgres geladen (und jedem Raster ein Zeitstempelfeld hinzugefügt), könnten Sie für jeden Punkt so etwas tun

select timestamp from rastertable where st_contains( st_minconvexhull(rast), st_setsrid( st_makepoint($x,$y), $SRID );

Ersetzen$x,$ymit deiner Punktkoordinate und$SRIDmit dem Raster SRID

Ich bin mir nicht sicher, ob POSTGIS das TIFFTAG_DATETIME für Sie extrahieren kann. Ich denke, dies wird beim Importieren verworfen (siehe diese Antwort), sodass Sie dies beim Importieren selbst hinzufügen müssen.

Aber ein Aufruf angdalinfokann das Tag sicherlich erhalten, wenn Sie dies automatisieren ...

gdalinfo Dateiname.tiff | grep TIFFTAG_DATETIME

Sie haben eine Punktebene, die die aktive Ebene ist, und eine Reihe von Rasterebenen aus verschiedenen Satellitenbildern, die alle mit TIFFTAG_DATETIME gekennzeichnet sind.

Ich nehme an, dass die Bilder das gleiche Koordinatensystem haben und entzerrt sind, es muss nicht festgestellt werden, ob die Punkte außerhalb der Bildinformationen liegen. Wenn dies berücksichtigt werden soll, muss das Skript erweitert werden, um den Bildwert an der Position des Punktes zu identifizieren und zu entscheiden, ob der Wert data oder nodata ist.

from PyQt4.QtCore import QVariant from osgeo import gdal # Wörterbuch zum Speichern von Metadaten aus den Bildern Metadaten = {} # Punktebene abrufen und Attribut 'dates' hinzufügen, falls nicht vorhanden points = iface.activeLayer() prov = points.dataProvider( ) fni = prov.fieldNameIndex('dates') if fni == -1: if prov.capabilities() & QgsVectorDataProvider.AddAttributes: prov.addAttributes([QgsField('dates', QVariant.String)]) # ein Diktat füllen mit Datums-Tag und Bounding Box aller Rasterlayer für image_name, Bild in QgsMapLayerRegistry.instance().mapLayers().items(): if isinstance(image, QgsRasterLayer): # Bild mit gdal öffnen um Metadaten zu lesen ras = gdal.Open (image.dataProvider().dataSourceUri()) datetag = ras.GetMetadata()['TIFFTAG_SOFTWARE'] box = QgsGeometry.fromWkt(layer.extent().asWktPolygon()) Metadaten[image.name()] = {' datetag': datetag, 'box': box} ras = None # in den Bearbeitungsmodus wechseln points.startEditing() # für jeden Punkt prüfen, ob er in einem Bild vorhanden ist für feat in points.getFeatures(): date = [] for i mage in den Metadaten: result = metadata[image]['box'].contains(feat.geometry()) # wenn das Bild den Punkt enthält, füge das Datum zur Liste hinzu wenn result: date.append(metadata[image]['datetag ']) # die Liste in str umwandeln und Klammern entfernen feat['dates'] = str(dates).strip('[]') points.updateFeature(feat) # endlich Änderungen speichern points.commitChanges()

Ich glaube nicht, dass Ihr Problem mit dem QGis Gui Interface gelöst werden kann. Ich schlage ein solches Skript vor. Es verwendet die Python-Bildverarbeitungsbibliothek, um das gewünschte TiffTag zu lesen. Es ist erforderlich, dass alle Ihre Rasterdateien in das Inhaltsverzeichnis geladen werden. Es ist auch erforderlich, dass Sie Ihrem Punktlayer ein neues Attribut hinzugefügt haben, das mit 'dtattr', Typ 'string' und maximaler Länge benannt ist.

##pointsUri=Vektor aus PIL-Import Bild aus qgis.utils-Import * aus qgis.core-Import * points = processing.getObjectFromUri(pointsUri) #alle Rasterlayer aus dem legendInterface holen rasterlayers = [Layer für Layer in iface.legendInterface(). layer() if layer.type() == 1] für Feature in points.getFeatures(): #check ob raster-extend-geometry Feature-Geometrie enthält datevalues ​​= [] #leere Liste für die zu speichernden Datumswerte für Rasterlayer in Rasterlayern : #erzeuge die Geometrie der Rasterausdehnung rasterRectGeom = QgsGeometry.fromWkt(rasterlayer.extent().asWktPolygon()) if rasterRectGeom.contains(feature.geometry()): satImage = Image.open(rasterlayer.source()) tifftags = satImage.tag datevalues.append(tifftags.get(306)) #306 für TIFFTAG_DATETIME #schreiben Sie in das Attributfeld points.startEditing() datetimestr = ';'.join(datevalues) #datetimestr =".join(e for .) e in Datumswerten) feature['dtattr'] = datetimestr points.updateFeature(feature) points.commitChanges()

Möglicherweise müssen Sie die Ausgabe ein wenig anpassen, da sie im Format JJJJ:MM:TT HH:MM:SS vorliegt. Ich habe das Skript unter QGis 2.8.3 mit einigen Beispieldaten getestet. Um das Skript auszuführen, erstellen Sie in der Bearbeitungssymbolleiste ein neues 'Benutzerskript'.


Schau das Video: Arcgis: Merge the raster datasets fusionner raster arcgis Mosaic raster dataset ArcGIS (Oktober 2021).