Suite

Conversion énorme raster (50 000 000 cellules) en .xyz


J'ai un DEM env. 40x5km avec une taille de cellule 2x2m, ce qui donne env. 50 000 000 de points.

J'ai besoin de l'exporter vers un fichier .xyz (1pt = 1 ligne au format x y z) afin de l'utiliser dans MIKE21.

Il semblait qu'il y avait beaucoup d'outils qui le feraient (j'ai accès à Arcinfo 9.3.1 et 10), même si je suis déjà bloqué depuis 2 jours. J'ai essayé quelques solutions et toutes ont échoué.

J'ai fait : 1. SA/EXTRACTION/SAMPLE, recevant la table, l'enregistrant comme .dbf, et essayant de l'importer dedans à Access 2007. Je n'ai pas pu importer .dbf produit dans Arc dans Access. L'exportation de la table au format .txt me donne toujours une erreur.

  1. Calculatrice raster et Sample(). Cela a très bien fonctionné. Raster converti en 5 minutes produisant un fichier de 1,2 Go, mais dans l'ordre : ZXY et non XYZ. MIKE ne permet pas de changer l'ordre des colonnes, je dois donc changer l'ordre des colonnes. Aucune idée de comment faire. J'ai réessayé Access 2007, mais j'ai échoué sur les données d'importation.

  2. Script Raster2XYZ ver. 1.1 du site Web d'ESRI (en VB). Impossible de l'installer correctement maintenant (donne une erreur), je l'ai utilisé avant et cela a fonctionné il y a 6 mois. Cependant, je me souviens que cela fonctionnait très lentement à l'époque. Je ne suis pas vraiment un programmeur et je ne trouve pas le bogue.

  3. Grass GIS et r.out.xyz ont un bug. Problème d'écriture double ou flottante (je ne me souviens plus maintenant).

  4. J'ai un script R qui exporte .asc vers .xyz. Il faut 2,5h pour exporter 40 000 000 de cellules. Le fichier de sortie fait 4,3 Go. MIKE ne l'avalera pas.

Avez-vous des idées sur la façon d'exporter un tel raster vers .xyz ? Ou comment réorganiser le fichier du point 2 pour recevoir XYZ au lieu de ZXY ?

J'ai toujours utilisé Access pour convertir des données (c'est-à-dire… dbf en .txt (.xyz)), mais maintenant cela ne semble pas être une option. N 'y a-t-il pas une autre solution?

J'ai une station de travail HP Z600 (Xeon 2,4 Ghz, 8 Go de RAM, GF Quadro FX 3800).

Des suggestions?


Vous dites que

  1. "Calculatrice raster et échantillon (). Cela a très bien fonctionné. Raster converti en 5 minutes produisant un fichier de 1,2 Go, mais dans l'ordre: ZXY et non XYZ. MIKE ne permet pas de changer l'ordre des colonnes, je dois donc changer l'ordre des colonnes. Non idée de comment le faire."

Pour réorganiser les colonnes du fichier texte, je suggérerais des expressions régulières. Vous pouvez utiliser des expressions régulières dans divers éditeurs de texte (j'utilise EditPad Pro), ou en Python, ou dans l'outil de ligne de commande sed disponible pour Windows également.

Votre expression régulière

Je suppose que votre sortie "Raster Calculator and Sample()" ressemble à ceci, où 567,89 est la valeur z que vous souhaitez décaler à la fin de chaque ligne :

567.89 123.45 345.67

L'expression régulière pour récupérer la ligne avec les trois coordonnées ressemblerait à ceci :

^([0-9]+.[0-9]+)s+([0-9]+.[0-9]+)s+([0-9]+.[0-9 ]+)$

^ signifie le début de la ligne [0-9]+ signifie un ou plusieurs chiffres . signifie un point (échappé) s+ signifie un ou plusieurs caractères d'espacement $ signifie que les crochets de fin de ligne créent des références arrière

Vous remplacez la ligne par

2 3 1

où les numéros font référence aux trois références arrière. Dans l'exemple ci-dessus, ils sont séparés par des blancs. Si vous voulez les séparer par des onglets, utilisez : 2 3 1 - ce que MIKE21 préfère.

Le résultat du remplacement serait

123.45 345.67 567.89

Si vous utilisez sed pour Windows

Sur la ligne de commande, vous pouvez utiliser sed pour Windows. Sed est un éditeur de flux et n'aura pas de problèmes avec les gros fichiers.

La syntaxe sed pour Windows pour la recherche et le remplacement avec des expressions régulières est

sed -i "s/RECHERCHE/REMPLACER/g" fichier texte.txt

Dans sed, vous devez échapper aux parenthèses rondes et au signe plus. Donc, si votre fichier texte d'origine s'appelle "cells.txt", l'expression régulière enveloppée dans la ligne de commande sed se développe en :

sed -i "s/^([0-9]+.[0-9]+)s+([0-9]+.[0-9]+ )s+([0-9]+.[0-9]+)$/2 3 1/g" cells.txt

Cette expression effectue le remplacement sur place, faites donc une sauvegarde de votre fichier d'origine. Sed créera un fichier temporaire à côté de votre fichier d'origine, que vous pourrez supprimer par la suite, assurez-vous simplement qu'il y a suffisamment d'espace sur votre disque.

Ressources supplémentaires pour les expressions régulières

débordement de pile

Regular-Expressions.info de Jan Goyvaerts


GDAL 1.8 (ou version ultérieure) peut convertir les fichiers DEM aux formats de fichier XYZ ASCII.

Sur un système où GDAL est installé (à partir des sources, FWTools, OSGeo4W, etc.), accédez au shell et essayez la commande suivante sur votrefichier.dem(ou peu importe):

gdal_translate -of XYZ fichier.dem fichier.xyz

Je n'ai pas testé un raster de cette taille, mais je suppose que votre fichier xyz sera proche de 2 Go. En outre, il existe des options si vous avez besoin d'un en-tête (la valeur par défaut est NON) ou comment séparer les colonnes (la valeur par défaut est un espace).


Vous pouvez essayer StarSpan. J'ai récemment rayé un fichier image avec 49 982 109 pixels dans un csv. Je n'avais que x et y, mais il a beaucoup d'options.


Vous pouvez également mosaïquer le DEM et traiter les mosaïques en XYZ. Si vous envoyez 50 000 000 de lignes dans un fichier texte, la sortie sera toujours importante. La mosaïque peut être votre seule option pour réduire au minimum la taille des fichiers texte.

La digestion d'entrées plus petites peut également réduire vos temps de chargement. Au moins, vous pourrez suivre vos progrès pendant que vous chargez les tuiles dans MIKE21.

Juste un peu.


Vous pouvez utiliser GRASS GIS. J'ai pris un DEM et exporté autant de cellules dans x y z. Il prend 2 minutes 45 secondes sur mon ordinateur portable de deux ans, créant 1,4 Go. La commande est :

r.stats -1g élévation > my_xyz.txt

Vous pouvez essayer FME. Cela ferait l'affaire.

Utilisez simplement un lecteur DEM (quel que soit le format) et écrivez au format Point Cloud XYZ. Ajoutez un transformateur GeometryCoercer entre les deux pour contraindre les données à un nuage de points.

Je viens d'essayer cela sur un fichier 1201 x 1201 (1,4 m points) et cela n'a pris que 24 secondes, j'espère donc que cela traitera vos points de 50 m dans un temps pas trop déraisonnable.

Malheureusement, je ne pense pas que l'extension d'interopérabilité dans ArcGIS ferait cela. Il ne gère pas les données raster. Mais s'il s'agissait d'un format source Esri, vous pourrez peut-être le lire avec ModelBuilder et le pousser dans un modèle ETL de cette façon.

Quoi qu'il en soit, cependant, je ne sais pas comment la sortie serait (ou pourrait) être plus petite que le fichier généré par votre script R. Vous pourriez donc être bloqué par le volume considérable de données.


Voir la vidéo: Vw t3 doka restoration project - motorhome camper conversion XXX (Octobre 2021).