Shapefile erstellen, das Fußabdrücke von Rastern zeigt?


33

Ich habe ungefähr 1.000 Satellitenbilder im TIFF-Format und möchte ein Shapefile erstellen, das als Index für die Raster dient. Dies ähnelt einem Raster-Katalog, ich möchte jedoch keinen Raster-Katalog erstellen.

Einige Hindernisse, die ich sehen kann, sind, dass das Bild georeferenziert ist, so dass sie keine rechteckige Form haben (ich spreche über den Datenbereich).

Um dies zu verdeutlichen, muss das Polygon nur die Pixel des Rasters abdecken, die nicht Null (oder Nicht-Nodata) sind, und nicht das gesamte rechteckige Raster. Die meisten bisherigen Antworten ergeben ein rechteckiges Polygon, das sowohl die Daten- als auch die Nichtdatenpixel abdeckt.

Mein Bild Ein Beispiel für ein Satellitenbild


Das Ergebnis stammt von Tools, die ich untersucht habe (z. B. Raster-Catlog, verschiedene Arcscripts, benutzerdefiniertes Python-Skript in einer der Antworten): Ergebnis


Ergebnis, das ich will: Bildbeschreibung hier eingeben


4
Es scheint, als würde ein Raster-Katalog erstellt, und auch vorübergehend wäre dies eine gute Lösung, um Footprints zu erstellen. Sie können einen nicht verwalteten Katalog erstellen, der eine Referenztabelle erstellt, die Bilder jedoch an ihrem Speicherort auf dem Server belässt. Der Stapelimport von Rastern in einen Katalog ist einfach und relativ schnell. Nach der Erstellung können Sie die Footprints in eine neue Feature-Class exportieren und den Raster-Katalog löschen. Dies kann genauso schnell geschehen wie bei anderen Optionen.
Holen Sie sich Spatial

2
Das Mosaik-Dataset erstellt auch den Footprint der Bilder.
Roy

Mosaik-Dataset ist der richtige Weg. Sehr einfach zu erreichen
Brad Nesom

Befinden sich im letzten Bild die Pixel außerhalb des roten Kästchens NoData oder 0? Wenn sie 0 sind, gibt es Pixel in dem Bereich, den Sie möchten, die ebenfalls den Wert 0 haben?
Chad Cooper

1
Die Pixel außerhalb des roten Randes sind Knotendaten. Meine multispektralen Daten haben jedoch 0,0,0 als RGB-Werte für die Knotenbereiche. In beiden Fällen befinden sich keine Pixel mit dem Wert 0 innerhalb des erforderlichen Bereichs.
Devdatta Tengshe

Antworten:


15

In QGIS gibt es ein Plugin namens Image Boundary . Es ist ein großartiges Werkzeug. In diesem Tool gibt es eine Option für "Gültige Pixel", bei der beispielsweise die schwarzen Ränder eines Satellitenbilds weggelassen werden.


Dieses Plugin behauptet, zu tun, was ich wollte, aber es scheitert an einem Image, mit dem ich experimentiert habe. Ich werde es morgen mit meinen echten Daten versuchen.
Devdatta Tengshe

Ich fand, dass dieses Plugin mit multispektralen Daten sehr gut funktioniert, aber manchmal seltsame Ergebnisse mit pancromatischen Einzelbandbildern liefert.
Devdatta Tengshe

2
Ich bin damit einverstanden, dass die QGIS-Bildgrenze am besten funktioniert, aber es gibt ein Tool, um dies für Vektordateien zu tun, bei denen wir keine "Bounding Box" oder "Footprint" benötigen, sondern ein Polygon, in dem Daten vorhanden sind.
GeorgeC

Die Bildgrenzen-Tools sind großartig, der von Ihnen bereitgestellte Link lautet jedoch 404. Ich glaube, die Tools sind weiterhin verfügbar, wenn Sie experimentelle Plugins in den Plugin-Einstellungen zulassen. Vielleicht nutzen Sie diesen Link ?: github.com/lmotta/imagefootprint_plugin
Aaron

Gibt es eine Dokumentation zur Verwendung von Image Boundary?
15.

9

Mit dem folgenden Code wird ein Eingabe-Raster erstellt, die Ausdehnung abgerufen und diese Ausdehnung in eine Polygon-Feature-Class eingefügt:

import arcpy

r = arcpy.Raster(in_raster)
point = arcpy.Point()
array = arcpy.Array()

corners = ["lowerLeft", "lowerRight", "upperRight", "upperLeft"]

cursor = arcpy.InsertCursor(fc)
feat = cursor.newRow()
for corner in corners:    
    point.X = getattr(r.extent, "%s" % corner).X
    point.Y = getattr(r.extent, "%s" % corner).Y
    array.add(point)
array.add(array.getObject(0))
print len(array)
polygon = arcpy.Polygon(array)
feat.shape = polygon
cursor.insertRow(feat)
array.removeAll()
del feat
del cursor

Sie können es im ArcMap Python-Fenster ausführen, indem Sie Folgendes einrichten in_rasterund ausführen fc:

>>> fc = 'r_extent'
>>> in_raster = 'CaliCoast10mNED_HavCurvedPCS'

Wo r_extentbefindet sich eine vorhandene Polygon-Feature-Class? Dann einfach den Code kopieren und ausführen. Ich bekomme das:

Bildbeschreibung hier eingeben


1
Ich habe den obigen Code verwendet, um dasselbe für einen Ordner zu tun: gist.github.com/4162013
jeb

7

Sie können hierfür gdaltindex verwenden: http://www.gdal.org/gdaltindex.html

Es werden jedoch weiterhin Rechtecke (z. B. 4 + 1 Punkte) im selben Referenzsystem wie die Bilder erstellt. Aber ich frage mich, ob das wirklich ein Problem ist: Wie groß sind Ihre Bilder?


Das Problem bei gdaltindex ist, dass für jedes Bild ein rechteckiges Polygon erstellt wird. Ich interessiere mich nur für die Nicht-Null-Pixel
Devdatta Tengshe

4

Ich habe das Tool "Image Boundary" in QGIS ausprobiert, aber es schlägt bei einigen Rastern fehl.

Eine andere Option, die für mich funktioniert hat, ist: 1. Konvertieren Sie das Eingabe-Raster mit dem Befehlszeilen-Dienstprogramm gdal_translate in eine einzelne digitale Zahl.

gdal_translate -co compress = lzw -b 1 -ot byte -scale 1 1 inp.tif out.tif

Dadurch wird überall dort ein Raster mit den Werten 1 erstellt, wo inp.tif Werte ungleich Null verwendet wurden.

  1. Anschließend können Sie in ArcMap das Werkzeug "Raster in Polygon" verwenden, um ein Polygon (Shapefile) abzurufen.

Das Ausgabe-Shapefile hat nicht-vierseitige Grenzen mit mehreren Polygonscheitelpunkten, die der tatsächlichen Grenze des Bildes folgen.


3

Wenn Sie an einer Skriptlösung interessiert sind, probieren Sie den Befehl gdal nearblack aus . Mit dem Flag -white können Sie auch Daten abrufen, die durch Leerzeichen begrenzt sind. Sie können die Ausgabe polygonisieren , um eine nicht rechteckige Grundfläche der Rasterdaten zu generieren.

##run nearblack
shellcmds = "nearblack -white -o " + outpath + " " + inpath
os.system(shellcmds)

##run polygonize
shellcmds = "gdal_polygonize.py " + outpath + " -f" + """ "ESRI Shapefile"  """ + outpath2 + " nearblack"
os.system(shellcmds)


0

In ArcGIS 3D Analyst gibt es ein Tool namens Raster Domain , das einen Polygon- oder Polylinien-Footprint der Datenbereiche eines Raster-Datasets erstellt und NoData-Zellen ignoriert. Hat super für mich funktioniert.


1
Willkommen auf unserer Webseite! Können Sie erklären, wie sich Ihre Antwort von der von Tomek unterscheidet?
whuber

Raster Domain hat für mich funktioniert - Danke für Ihre Hilfe!
Meryloo

0

Sie können einen Raster-Katalog mit einem zugewiesenen Raumbezug erstellen, den Raster-Katalog zu ArcMap hinzufügen und dann "Footprint exportieren". Denken Sie daran, dass Sie einen "UNMANAGED" -Rasterkatalog erstellen können, damit Sie nicht von jedem Raster-Dataset ein Duplikat erstellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.