Créer un fichier de formes montrant les empreintes de Rasters?

33

J'ai environ 1 000 images satellites au format TIFF et je souhaite créer un fichier de formes qui serve d'index aux rasters. Cela ressemble à un catalogue d'images, mais je ne souhaite pas créer de catalogue d'images.

Certains obstacles que je peux prévoir, c’est que les images sont géoréfringues et ne sont donc pas de forme rectangulaire (je parle de la zone de données).

Pour clarifier, j'ai besoin que le polygone ne couvre que les pixels non nuls (ou non nodata) du raster, et non le raster rectangulaire entier. Jusqu'à présent, la plupart des réponses donnent un polygone rectangulaire, qui couvre les données, ainsi que les pixels non liés aux données.

Mon image Un exemple d'image satellite


Résultat fourni par les outils que j'ai examinés (type catalogue d'images, divers scripts Arcscripts, script Python personnalisé donné dans l'une des réponses): Résultat


Résultat que je veux: entrez la description de l'image ici

Devdatta Tengshe
la source
4
Il semble que créer un catalogue d'images, même temporairement, serait une bonne solution pour créer des empreintes de pas. Vous pouvez créer un catalogue non géré, qui crée une table de références, mais laisse les images à leur emplacement sur le serveur. Il est facile et relativement rapide de faire une importation par lots de rasters dans un catalogue. Une fois créé, vous pouvez exporter les empreintes vers une nouvelle classe de fonctions et supprimer le catalogue d'images. Cela pourrait être aussi rapide que d'autres options.
Obtenez Spatial
2
La mosaïque génère également l'empreinte de l'image.
Roy
la mosaïque est la voie à suivre. Très facile à accomplir
Brad Nesom
Dans la dernière image, les pixels se trouvent-ils en dehors de la zone rouge NoData ou 0? S'ils sont 0, y a-t-il des pixels dans la zone que vous voulez qui ont également une valeur 0?
Chad Cooper
1
Les pixels en dehors de la bordure rouge sont des nodata; Cependant, mes données multispectrales ont 0,0,0 en tant que valeurs RVB pour les zones nodata. Dans les deux cas, il n'y a pas de pixels de valeur 0 dans la zone requise.
Devdatta Tengshe

Réponses:

15

Il existe un plugin dans QGIS appelé Image Boundary . C'est un excellent outil. Cet outil contient une option pour "Pixels valides" qui permet d’omettre les bords noirs d’une image satellite, par exemple.

Ryan Garnett
la source
Ce plugin prétend faire ce que je voulais, mais il échoue sur une image que j'ai expérimentée. Je vais essayer avec mes vraies données demain.
Devdatta Tengshe
J'ai trouvé que ce plugin fonctionne très bien avec les données multispectrales, mais donne parfois des résultats bizarres avec des images pancromatiques mono-bande.
Devdatta Tengshe
2
Je conviens que la limite d'image QGIS fonctionne le mieux, mais existe-t-il un outil pour le faire pour les fichiers vectoriels pour lesquels nous n'avons pas besoin du "cadre de sélection" ou de "l'empreinte" mais d'un polygone indiquant l'emplacement des données.
GeorgeC
Les outils de limite d'image sont excellents, cependant, le lien que vous fournissez est 404. Je crois que les outils sont toujours disponibles si vous autorisez des plugins expérimentaux dans les paramètres du plugin. Peut-être utilisez-vous ce lien ?: github.com/lmotta/imagefootprint_plugin
Aaron
Existe-t-il une documentation pour utiliser Image Boundary?
Loonuh
9

Le code suivant prendra un raster en entrée, en obtiendra l'étendue et l'insérera dans une classe de polygones:

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

Vous pouvez l' exécuter dans la fenêtre Python ArcMap en mettant en place in_rasteret fccomme ceci:

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

r_extentest une classe de polygones existante. Ensuite, copiez simplement le code et exécutez-le. J'ai compris:

entrez la description de l'image ici

Chad Cooper
la source
1
J'ai utilisé le code ci-dessus pour faire la même chose pour un dossier: gist.github.com/4162013
jeb
7

Vous pouvez utiliser gdaltindex pour cela: http://www.gdal.org/gdaltindex.html

Toutefois, il continuera à créer des rectangles (par exemple 4 + 1 points) dans le même système de référence que les images. Mais je me demande si c'est vraiment un problème: quelle est la taille de vos images?

johanvdw
la source
Le problème avec gdaltindex est qu’il crée un polygone rectangulaire pour chaque image. Je ne m'intéresse qu'aux pixels de valeur non nulle
Devdatta Tengshe
4

J'ai essayé l'outil "Image Boundary" dans QGIS mais il échoue avec certains rasters.

Une autre option qui a fonctionné pour moi est la suivante: - 1. Convertir le raster en entrée en un seul numéro numérique à l’aide de l’utilitaire de ligne de commande gdal_translate.

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

Cela créera un raster avec des valeurs de 1 partout. Inp.tif avait des valeurs non nulles.

  1. Ensuite, dans ArcMap, vous pouvez utiliser l'outil "raster en polygone" pour obtenir un polygone (fichier de formes).

Le fichier de forme de sortie aura des limites non quadrilatérales, avec plusieurs sommets de polygone, suivant la limite réelle de l'image.

utilisateur3294041
la source
3

Si une solution scriptée vous intéresse, essayez la commande gdal nearblack . Vous pouvez également utiliser le drapeau -white pour récupérer des données délimitées par des espaces. Vous pouvez polygoniser la sortie pour générer une empreinte non rectangulaire des données raster.

##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)
jsta
la source
1

Je pense que, dans le monde ArcGIS, vous pouvez y parvenir avec l' outil 3D Analyst \ Conversion \ From Raster \ Raster Domain .

Tomek
la source
Cela ne fonctionne que sur des données 3D et ne donne même pas les résultats escomptés. Ne fonctionne pas du tout avec les images satellites.
Devdatta Tengshe
Ouais c'est vrai. Je laisserai la réponse aux autres, pour en prendre conscience.
Tomek
0

ArcGIS 3D Analyst contient un outil appelé Domaine raster qui crée une empreinte de polygone ou de polyligne des parties de données d'un jeu de données raster - et ignore les cellules NoData. A bien fonctionné pour moi.

Joey
la source
1
Bienvenue sur notre site! Pouvez-vous expliquer en quoi votre réponse diffère de celle de Tomek?
whuber
Le domaine raster a fonctionné pour moi - merci pour votre aide!
meryloo
0

Vous pouvez créer un catalogue d'images avec une référence spatiale attribuée, ajouter le catalogue d'images à ArcMap, puis "Exporter l'empreinte". N'oubliez pas qu'il est possible de créer un catalogue d'images "NON-GÉRÉ" afin de ne pas dupliquer chaque jeu de données raster.

Nhunsaker
la source