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