SOFTWARE. Herramientas SIG. Consejo Superior de Investigaciones Científicas. 2010

Conversor MDT → XYZ & ASCII Surfer * 1.

Presentación de la herramienta

El conversor MDT transforma automáticamente un archivo con formato MDT en dos archivos, uno de puntos XYZ y otro de ASCII surface. Hay dos versiones del conversor, la primera permite transformar un fichero MDT en sus dos correspondientes XYZ y ASCII surface, la otra versión permite seleccionar un directorio y transformar todos los archivos MDT que se encuentren en el de manera iterativa. La siguiente figura muestra de manera gráfica está conversión.

MDT

XYZ

FN.H28

ASCII

XYZ-FN.TXT

ASCII-FN.TXT

Figura 1. Conversión La diferencia fundamental con otras herramientas, es que se puede instalar como una Toolbox en ArcMAP o ejecutar desde línea de comandos. Además se presenta el código fuente en Python (versión 2.5) para poder ajustar las herramientas si fuera necesario.

2.

Instalación Para instalar la herramienta hay que realizar los siguientes pasos: 1. Descargar el fichero ‘TOOLBOX_csic_mdt_ascii_xyz.exe’ de http://digital.csic.es. Este es un archivo comprimido.

* Diseñado y desarrollado en la Unidad de Sistemas de Información Geográfica - Centro de Ciencias Humanas y Sociales http://humanidades.cchs.csic.es/cchs/sig/ Contacto: [email protected], [email protected], [email protected]

1

2. Ejecutar el fichero con las opciones por defecto. Esto creará el directorio ‘c:csic’ en el que se copiará la Toolbox para ArcMAP, los archivos y librerias necesarias.

Figura 2. Añadir directamente la Toolbox desde ArcMAP

3.

Funcionamiento

3.1.

Conversión de un solo fichero

Existen dos opciones: 1. Ejecutar desde línea de comandos el fichero ‘csic_mdt_to_ascii_xyz.exe’ con los parámetros: Fichero MDT de entrada, Directorio de salida y tamaño de celda. Si el tamaño de celda indicado es -1, la herramienta lo detectará automaticamente. La salida por defecto desde línea de comando será:

C:\csic>csic_mdt_to_ascii_xyz.exe c:\mdt\M0001-2N.H29 c:\mdtconvertidos -1 Cell size detected: 25 ================================================================ Starting conversion MDT 25 (ING format) to XYZ and ASCII surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

. . . ================================================================ Process time : 2.54699993134 sec. Processed points : 209825 Files generated : c:\mdtconvertidos\XYZ_M0001-2N.H29.txt dos\ASC_M0001-2N.H29.asc Process finished.

and

c:\mdtconverti

Press any key to exit ... 2. Añadir ‘CSIC Mdt to ascii and xyz.tbx’ desde arcmap y ejecutarla.

Figura 3. Ejecución de la Toolbox para un archivo desde ArcMAP

3.2.

Conversión de un directorio de ficheros MDT

Existen dos opciones: 1. Ejecutar desde línea de comandos el fichero ‘csic_dir_mdt_to_ascii_xyz.exe’ con los parámetros: Directorio de entrada que contiene ficheros MDT, Directorio de salida. La salida por defecto desde línea de comando será:

C:\csic>csic_dir_mdt_to_ascii_xyz.exe c:\mdtdos c:\mdtconvertidos ================================================================ Processing file M0001-2N.H29 Cell size detected: 25 ================================================================ Starting conversion MDT 25 (ING format) to XYZ and ASCII surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ================================================================ 3

================================================================ Processing file M0001-3N.H29 ================================================================ Starting conversion MDT 25 (ING format) to XYZ and ASCII surface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ================================================================ Process time Processed files Processed points Files generated in Process finished.

: : : :

2.48399996758 sec. 2 207645 c:\mdtconvertidos

Press any key to exit ... 2. Añadir ‘CSIC Mdt to ascii and xyz.tbx’ desde arcmap y ejecutarla.

Figura 4. Ejecución de la Toolbox para un archivo desde ArcMAP

4.

Requisitos

Para el caso de la herramienta que convierte los ficheros MDT de un directorio iterativamente, se requiere que todos los ficheros tengan el formato propio de MDT, si uno no lo tiene, la iteración fallará.

5.

Licencia

Attribution-NonCommercial 3.0 Unported. La licencia se puede consultar en la siguiente dirección. http://creativecommons.org/licenses/by-nc/3.0/

4

A.

1 2 3 4 5

6 7 8 9

# # # # # # # # #

APÉNDICE: Código conversor Archivo MDT → fichero XYZ y ASCII Surface Author : Email : Date :

ROBERTO MAESTRE MARTINEZ ROBERTO . MAESTRE CCHS . CSIC . ES , RMAESTRE GMAIL .COM 2010/11/24

A t t r i b u t i o n −Noncommercial 3 . 0 U n p o r t e d − h t t p : / / c r e a t i v e c o m m o n s . o r g / l i c e n s e s / by−nc / 3 . 0 / C o n s e j o S u p e r i o r de I n v e s t i g a c i o n e s C i e n t i f i c a s C e n t r o de C i e n c i a s Humanas y S o c i a l e s Unidad de s i s t e m a s de i n f o r m a c i o n g e o g r a f i c a

10 11

i m p o r t s y s , s t r i n g , os , t i m e

12 13 14 15 16 17 18 19 20

21

i f l e n ( s y s . a r g v ) >= 4 : fname = s y s . a r g v [ 1 ] fnames = sys . argv [ 2 ] j = i n t ( sys . argv [ 3 ] ) else : print ’ ’ p r i n t ’ Wrong number o f p a r a m e t e r s ’ p r i n t ’ Usage : > p y t h o n i n p u t _ d i r o u t p u t _ d i r c e l l _ s i z e [−1 f o r a u t o m a t i c detection ] ’ sys . e x i t ( )

22 23 24

c o m d i r = fname . s p l i t ( ’ \ \ ’ ) i n p u t n a m e = c o m d i r [ l e n ( c o m d i r ) −1]

25 26 27 28 29 30 31 32 33 34 35 36 37 38

f n a m e s x y z = f n a m e s + ’ \ XYZ_ ’ + i n p u t n a m e + ’ . t x t ’ f n a m e s a s c = f n a m e s + ’ \ ASC_ ’ + i n p u t n a m e + ’ . a s c ’ try : f = open ( fname , ’ r ’ ) except : print ’ Input f i l e error . ’ sys . e x i t ( ) try : f s x y z = open ( fnamesxyz , "w" ) f s a s c = open ( f n a m e s a s c , "w" ) except : p r i n t ’ Output f i l e e r r o r . ’ sys . e x i t ( )

39 40 41

t = time . time ( )

42 43

f l =True

5

44 45 46 47 48 49 50 51 52 53 54 55 56

lines = f . readlines () l = lines [0]. split ( ’ ’) laux = [ ] for i l a u x in range (0 , len ( l ) ) : i f ( l [ ilaux ]!= ’ ’ ) : l a u x . append ( l [ i l a u x ] ) l =laux x1= f l o a t ( l [ 2 ] ) x2= f l o a t ( l [ 4 ] ) y1= f l o a t ( l [ 3 ] ) y2= f l o a t ( l [ 5 ] . s p l i t ( ’ ’ ) [ 0 ] ) y r a n g e = i n t ( y2−y1 ) x r a n g e = i n t ( x2−x1 )

57 58 59 60 61 62 63 64 65 66 67 68 69

print ’ ’ i f ( j −1 and ( y r a n g e % j < >0) ) : p r i n t ’ WARNING: May be , t h e c e l l s i z e c h o o s i n g " ’ , i n t ( j ) , ’ " i s n o t c o r r e c t ’ i f ( j ==−1) : cent=False j a u x =25 w h i l e ( ( j a u x = 3 : d i r = sys . argv [1] fnames = sys . argv [ 2 ] j =−1 else : print ’ ’ p r i n t ’ Wrong number o f p a r a m e t e r s ’ p r i n t ’ Usage : > p y t h o n i n p u t _ d i r o u t p u t _ d i r ’ sys . e x i t ( )

22 23 24

comdir= d i r . s p l i t ( ’ \ \ ’ ) i n p u t n a m e = c o m d i r [ l e n ( c o m d i r ) −1]

25 26 27 28

f i l e s c o u n t =0 d i r L i s t =os . l i s t d i r ( d i r ) f o r fname i n d i r L i s t :

29 30 31

p r i n t ’ ================================================================ ’ p r i n t ’ P r o c e s s i n g f i l e ’ , fname ,

32 33 34 35 36 37 38 39 40 41 42 43 44

f n a m e s x y z = f n a m e s + ’ \ XYZ_ ’ + fname + ’ . t x t ’ f n a m e s a s c = f n a m e s + ’ \ ASC_ ’ + fname + ’ . a s c ’ try : f = open ( d i r + ’ \ \ ’ +fname , ’ r ’ ) except : print ’ Input f i l e error . ’ sys . e x i t ( ) try : f s x y z = open ( fnamesxyz , "w" ) f s a s c = open ( f n a m e s a s c , "w" ) except : p r i n t ’ Output f i l e e r r o r . ’

8

45

sys . e x i t ( )

46 47 48

t = time . time ( )

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

f l =True lines = f . readlines () l = lines [0]. split ( ’ ’) laux = [ ] for i l a u x in range (0 , len ( l ) ) : i f ( l [ ilaux ]!= ’ ’ ) : l a u x . append ( l [ i l a u x ] ) l =laux x1= f l o a t ( l [ 2 ] ) x2= f l o a t ( l [ 4 ] ) y1= f l o a t ( l [ 3 ] ) y2= f l o a t ( l [ 5 ] . s p l i t ( ’ ’ ) [ 0 ] ) y r a n g e = i n t ( y2−y1 ) x r a n g e = i n t ( x2−x1 )

64 65 66 67 68 69 70 71 72 73 74 75 76

print ’ ’ i f ( j −1 and ( y r a n g e % j < >0) ) : p r i n t ’ WARNING: May be , t h e c e l l s i z e c h o o s i n g " ’ , i n t ( j ) , ’ " i s n o t c o r r e c t ’ i f ( j ==−1) : cent=False j a u x =25 w h i l e ( ( j a u x