Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

Introducción a
Programación y
Fundamentos con
chaowei yang
Traducido del inglés al español - www.onlinedoctranslator.com
https://www.onlinedoctranslator.com/es/?utm_source=onlinedoctranslator&utm_medium=pdf&utm_campaign=attribution
Introducción a SIG
Programación y
Fundamentos con
Python y ArcGIS®
http://taylorandfrancis.com
Introducción a SIG
Programación y
Fundamentos con
Python y ArcGIS®
chaowei yang
Con la colaboración de
Manzhu Yu
Qunying Huang
Zhen Long Li
Sol mínimo
kai liu
yongyao jiang
Jizhe Xia
Prensa CRC
Grupo Taylor & Francis
6000 Broken Sound Parkway NW, Suite 300 
Boca Raton, FL 33487-2742
© 2017 por Taylor & Francis Group, LLC
CRC Press es un sello de Taylor & Francis Group, una empresa de Informa
No reclamar obras originales del gobierno de EE. UU.
Impreso en papel libre de ácido
Libro estándar internacional número 13: 978-1-4665-1008-1 (tapa dura)
Este libro contiene información obtenida de fuentes auténticas y de gran prestigio. Se han realizado esfuerzos 
razonables para publicar datos e información confiables, pero el autor y el editor no pueden asumir responsabilidad 
por la validez de todos los materiales o las consecuencias de su uso. Los autores y editores han intentado localizar a los 
titulares de los derechos de autor de todo el material reproducido en esta publicación y se disculpan con los titulares de 
los derechos de autor si no se ha obtenido el permiso para publicar de esta forma. Si algún material con derechos de 
autor no ha sido reconocido, por favor escríbanos y háganoslo saber para que podamos rectificar en cualquier 
reimpresión futura.
Salvo que lo permita la Ley de derechos de autor de EE. UU., ninguna parte de este libro puede reimprimirse, 
reproducirse, transmitirse o utilizarse de ninguna forma por ningún medio electrónico, mecánico o de otro tipo, ahora 
conocido o inventado en el futuro, incluidas las fotocopias, microfilmaciones y grabaciones, o en cualquier sistema de 
almacenamiento o recuperación de información, sin el permiso por escrito de los editores.
Para obtener permiso para fotocopiar o usar material electrónico de este trabajo, acceda awww. derechos de 
autor.com(http://www.copyright.com/) o comuníquese con Copyright Clearance Center, Inc. (CCC), 222 
Rosewood Drive, Danvers, MA 01923, 978-750-8400. CCC es una organización sin fines de lucro que 
proporciona licencias y registros para una variedad de usuarios. Para las organizaciones a las que la CCC les 
haya otorgado una licencia de fotocopia, se ha dispuesto un sistema de pago separado.
Aviso de marca registrada:Los nombres de productos o empresas pueden ser marcas comerciales o marcas 
comerciales registradas, y se usan solo para identificación y explicación sin intención de infringir.
Visite el sitio Web de Taylor & Francis en 
http://www.taylorandfrancis.com
y el sitio web de CRC Press en 
http://www.crcpress.com
http://www.copyright.com/
http://www.copyright.com/
http://www.copyright.com/
http://www.taylorandfrancis.com
http://www.crcpress.com
Para los padres de Chaowei Yang, Chaoqing Yang y Mingju Tang,
por inculcar continuamente la curiosidad y el espíritu explorador
http://taylorandfrancis.com
Contenido
Prefacio................................................. .................................................... ..................XV 
Agradecimientos .................................................. .............................................xxx 
Editor................................................. .................................................... ................XXIII 
Colaboradores.................................................. .................................................... .....xiv
Sección IVisión general
1. Introducción.................................................... .................................................... .3
1.1 Hardware y software de la computadora ............................................... .......3
1.2 SIG y Programación ............................................... ..........................5
1.3 Pitón................................................... .................................................... ...7
1.4 Clase y objeto .................................................. ......................................9
1.5 Modelos de datos SIG ............................................... .....................................10
1.6 UML .............................................. .................................................... ....11
1.7 Experiencia práctica con Python......................................... ......14
1.8 Resumen del capítulo.................................................... ................................dieciséis
Problemas................................................. .................................................... .......17
2. Programación Orientada a Objetos.................................................... ...............19
2.1 Lenguaje de Programación y Python ............................................... .19
2.2 Clase y objeto .................................................. .....................................21
2.2.1 Definición de clases ............................................. .......................21
2.2.2 Generación de objetos ............................................. .....................23
2.2.3 Atributos .............................................. ....................................23
2.2.4 Herencia ............................................... ................................25
2.2.5 Composición .................................................. ...............................26
2.3 Punto, polilínea y polígono ............................................... ...................27
2.4 Experiencia práctica con Python......................................... ......30
2.5 Resumen del capítulo................................................... ................................30
Problemas................................................. .................................................... .......31
Sección II PitónProgramación
3. Introducción a Python.................................................... ...............................35
3.1 Soporte orientado a objetos ............................................... .......................35
3.2 Sintaxis .................................................. .................................................... .36
3.2.1 Sensibilidad entre mayúsculas y minúsculas ............................... .........................36
3.2.2 Caracteres especiales ............................................. .....................36
viii
viii Contenido
3.2.3 Indentación ............................................... ................................36
3.2.4 Palabras clave .............................................. ....................................37
3.2.5 Asignaciones Múltiples ............................................. ..............38
3.2.6 Espacio de nombres.................................... ................................38
3.2.7 Alcance .............................................. ..........................................38
3.3 Tipos de datos .................................................. .............................................40
3.3.1 Tipos de datos básicos ............................................. ........................40
3.3.2 Tipos de datos compuestos ............................................. ...............42
3.4 Misceláneos .............................................. ......................................48
3.4.1 Variables .............................................. .....................................48
3.4.2 Estilo de código ............................................. ....................................49
3.5 Operadores................................................ .............................................................50
3.6 Declaraciones .............................................. ............................................533.7 Funciones .................................................. .............................................................54
3.8 Experiencia práctica con Python......................................... ......56
3.9 Resumen del capítulo................................................... ................................56
Problemas................................................. .................................................... .......57
4. Estructura de control del lenguaje Python, entrada/salida de archivos,
y manejo de excepciones.................................................... ..........................61
4.1 Toma de decisiones .............................................. ................................61
4.2 Bucles ................................................ .................................................... ...64
4.3 Otras estructuras de control ............................................... .....................66
4.4 Entrada/salida de archivos ........................................... ....................................67
4.5 Excepciones .............................................. ............................................69
4.6 Experiencia práctica con Python......................................... ......70
4.6.1 Encuentre la distancia más larga entre dos puntos cualesquiera .......70
4.6.2 Experiencia práctica: E/S, crear y leer un archivo .........70
4.6.3 Experiencia práctica: E/S, control de flujo y archivo .........72
4.6.4 Experiencia práctica: Ingresar datos de puntos GIS
desde archivo de texto .................................................. ..........................74
4.7 Resumen del capítulo.................................................... ................................75
Problemas................................................. .................................................... .......75
5. Pensamiento de programación y visualización de datos vectoriales.....................77
5.1 Problema: visualización de datos GIS ........................................... .............77
5.2 Transformación del sistema de coordenadas ........................................... .......80
5.2.1 ¿Cómo determinar el valor de la relación? ..........................................82
5.3 Visualización de datos vectoriales ............................................... .......................84
5.4 Punto, Polilínea, Polígono ............................................... ..........................86
5.5 Pensamiento de programación.................................................. ......................87
5.5.1 Análisis de problemas ............................................. ......................88
5.5.2 Pensar en la programación ........................................... .............88
5.5.3 Igualar patrones de lenguaje de programación
y estructura .................................................. ......................89
Contenido ix
5.5.4 Implementar el programa ............................................. ..................89
5.6 Experiencia práctica con Python......................................... ......90
5.6.1 Lectura, análisis sintáctico y análisis de datos de archivos de texto ..................90
5.6.2 Crear Objetos GIS y Verificar Intersección .......................92
5.7 Resumen del capítulo.................................................... ................................95
Problemas................................................. .................................................... .......95
6. Manejo de archivos de forma.................................................... .....................................97
6.1 Manipulación de datos binarios ............................................... ...................97
6.2 Introducción al archivo de forma ........................................... .......................101
6.3 Estructura e interpretación del archivo Shapefile ..................................102
6.3.1 Estructura del archivo principal de un Shapefile ...............................102
6.3.1.1 Encabezado del archivo principal .................................. ......102
6.3.1.2 Registro de funciones ........................................... .........104
6.3.2 Estructura del archivo de índice (.shx) .................................. ...........105
6.3.3 El archivo .dbf ............................................... ...............................107
6.4 Secuencia de Programación General para el Manejo de Shapefiles.........107
6.5 Experiencia práctica con Mini-GIS ............................................... ..108
6.5.1 Visualizar polilíneas y polígonos.......................................108
6.5.2 Interpretar archivos de forma de polilínea .................................. ..109
6.6 Resumen del capítulo.................................................... ...............................113
Problemas................................................. .................................................... .....113
7. Entorno de programación Python.................................................... .....115
7.1 IDE general de Python .................................................. ............................115
7.1.1 Ventanas de programación Python .......................................115
7.1.1.1 GUI de línea de comandos ........................................... .115
7.1.1.2 Interfaz gráfica de usuario interactiva ............................... ........115
7.1.1.3 Programación basada en archivos ...............................116
7.1.2 Configuración del IDE de Python .................................. ................117
7.1.2.1 Resaltar ............................................... ...........117
7.1.2.2 Configuración General de la Ventana de 
Programación......................................... .......................118
7.1.2.3 Configuración de fuentes para la codificación ..................................118
7.1.3 Depuración ............................................... ...............................118
7.1.3.1 Error de sintaxis ............................................... .............120
7.1.3.2 Excepciones de tiempo de ejecución ..................................121
7.1.3.3 Manejo de excepciones ...............................................122
7.1.3.4 Agregar identificadores de excepción y acciones de limpieza a la 
lectura/escritura de archivos ..................123
7.2 Módulos de Python ............................................... ..................................124
7.2.1 Introducción al módulo ............................................. ..............125
7.2.2 Configurar módulos ............................................. ........................125
7.2.3 Módulos integrados del sistema ........................................... ...........126
7.3 Gestión de paquetes y Mini-GIS ............................................... ..127
X Contenido
7.3.1 Organización regular de datos GIS....................................127
7.3.2 Paquete Mini-GIS ............................................... .....................128
7.4 Experiencia práctica con Mini-GIS ............................................... ..131
7.4.1 Gestión de paquetes y Mini-GIS ..................................131
7.4.2 Ejecute y practique el paquete Mini-GIS...........................132
7.5 Resumen del capítulo.................................................... ...............................135
Problemas................................................. .................................................... .....135
8. Algoritmos de datos vectoriales.................................................... ..........................137
8.1 Centroide................................................... .............................................................137
8.1.1 Baricentro de un triángulo ............................................... ..............137
8.1.2 Baricentro de un rectángulo.................................................. ............137
8.1.3 Baricentrode un polígono ............................................... ...............138
8.2 Área.................................................. .................................................... ...139
8.2.1 Área de un polígono simple........................................... ..........139
8.2.2 Área de un Polígono con Agujero(s) ........................................... ....140
8.3 Longitud.................................................. ..........................................................141
8.3.1 Longitud de un segmento de línea recta....................................141
8.3.2 Longitud de una polilínea ........................................... ..................142
8.4 Intersección de línea.................................................... ..................................142
8.4.1 Líneas paralelas ............................................. ..........................145
8.4.2 Líneas verticales ............................................. ..........................145
8.5 Punto en Polígono ............................................... ....................................146
8.5.1 Un escenario especial ............................................. ...................146
8.6 Experiencia práctica con Python......................................... ....148
8.6.1 Usar Python para dibujar un polígono y calcular
el baricentro ................................................ ..........................148
8.6.2 Usar Python para dibujar polígonos y calcular
el área del polígono .............................................. ...............148
8.6.3 Uso de Python para dibujar segmentos de línea y
Calcular la intersección .................................................. ....148
8.7 Resumen del capítulo.................................................... ...............................150
Problemas................................................. .................................................... .....150
Sección III Algoritmos SIG Avanzados y su 
Programación enArcGIS
9. Programación ArcGIS.................................................... ...............................153
9.1 Programación de ArcGIS ............................................... .......................153
9.2 Introducción al Paquete ArcPy ............................................... ..........154
9.2.1 Funciones, clases y módulos de ArcPy ...........................154
9.2.2 Programación con ArcPy en ArcMap....................................155
9.2.3 Programación con ArcPy en la ventana de Python
fuera de ArcMap................................................... .....................156
Contenido xi
9.2.4 Uso de los documentos de ayuda.................................... ...........157
9.3 Automatización de ArcTools con Python ............................................... ...158
9.4 Acceso y edición de datos con cursores ..................................160
9.4.1 Cursor de búsqueda ............................................... ..........................160
9.4.2 Actualizar Cursor ............................................... .........................164
9.4.3 Insertar cursor.................................................... ............................164
9.4.4 NúmPy .............................................. .....................................165
9.5 Describir y enumerar objetos ............................................... ..........166
9.5.1 Describir.................................................... ....................................166
9.5.2 Lista .............................................. ............................................167
9.6 Manipulación de objetos complejos ............................................... ........169
9.7 Automatización de la producción de mapas ............................................... ............172
9.8 Creación de ArcTools a partir de secuencias de comandos......................... ..........172
9.9 Manejo de errores y mensajes ............................................... .........176
9.10 Documentos externos y recursos de video ..................................177
9.11 Implementación de cálculos de relaciones espaciales
Uso de ArcGIS ................................................. .....................................178
9.12 Resumen.................................................. ............................................180
9.13 Asignación ................................................ ........................................182
10. Algoritmo de datos ráster.................................................... ............................185
10.1
10.2
Datos ráster .................................................. .............................................185
Almacenamiento y compresión de ráster ............................................... ......186
10.2.1
10.2.2
Formatos de datos ráster .............................................. ..........................189
10.3.1
10.3.2
10.3.3
10.3.4
10.3.5
10.3.6
10.3.7
10.3.8
10.3.9
Representación de color y reproducción de trama ..................................191
10.4.1
10.4.2
Análisis de ráster................................................. ....................................196
Experiencia práctica con ArcGIS.................................................... ...198
10.6.1
10.6.2
Codificación de la longitud de ejecución ................................. ..............187
Árbol cuádruple ................................................. ...............................188
10.3
TIFF .................................................. .............................................189
GeoTIFF .................................................. ................................190
I.M.G.................................................. .............................................190
NetCDF.................................................. ..................................190
BMP.................................................. .............................................190
SVG.................................................. ........................................191
jpeg .................................................. ......................................191
GIF.................................................. .............................................191
PNG.................................................. .............................................191
10.4
Representación del color.................................................. ...........191
Representación ráster................................................. ..................194
10.5
10.6
Práctica práctica 10.1: Representaciones de color ráster ..................198
Práctica práctica 10.2: Análisis de datos ráster: 
Encuentre el área con el rango de elevación entre
60 y 100 y el Tipo de Cobertura Terrestre como “Bosque” ...........199
xi Contenido
10.6.3 Práctica práctica 10.3. Acceda a la información de atributos del 
conjunto de datos ráster y calcule el área .....200
Resumen del capítulo................................................ .............................205
Problemas................................................. .................................................... .....205
10.7
11. Algoritmos de datos de red.................................................... ......................207
11.1 Representación de la red ............................................... ...................207
11.1.1 Representación básica de la red .............................................207
11.1.2 Redes dirigidas y no dirigidas...................................207
11.1.3 La Matriz de Adyacencia ............................................... .............209
11.1.4 Representación de red en SIG ...............................................209
11.2 Encontrar el camino más corto.................................................. .....................210
11.2.1 Enunciado del Problema ............................................. ..................210
11.2.2 Un enfoquede fuerza bruta para el más corto
Algoritmo de ruta ................................................. .....................211
11.2.3 Algoritmo de Dijkstra ............................................... ..................212
11.3 Tipos de análisis de red ............................................... ................214
11.3.1 Enrutamiento .............................................. .....................................214
11.3.2 Instalación más cercana ............................................. ........................214
11.3.3 Áreas de servicio ............................................. ..........................214
11.3.4 Matriz de costos de OD ........................................... ........................216
11.3.5 Problema de generación de rutas para vehículos ............................... ........216
11.3.6 Ubicación-Asignación ............................................. ..................217
11.4 Experiencia práctica con ArcGIS.................................................. ....218
11.5 Resumen del capítulo.................................................... ...............................221
Problemas................................................. .................................................... .....222
12. Algoritmos de datos de superficie.................................................... .........................223
12.1 Superficie 3D y modelo de datos ............................................. ..................223
12.1.1 Datos de superficie ............................................. .............................223
12.1.2 Modelo de datos de superficie ........................................ ..................223
12.1.2.1 Datos discretos ............................................... ............223
12.1.2.2 Datos continuos ............................................... ......225
12.2 Crear datos de modelo de superficie ............................................. ..................228
12.2.1 Crear modelo de superficie de cuadrícula .................................. ......228
12.2.2 Creación de un modelo de superficie TIN .................................. ...229
12.2.3 Conversión entre TIN y RasterSuperficie
Modelos .................................................. ....................................229
12.3 Análisis de datos de superficie ........................................... .........................230
12.3.1 Elevación ............................................... ....................................230
12.3.2 Pendiente ............................................... .............................................231
12.3.3 Aspecto ............................................... ......................................232
12.3.4 Análisis hidrológico.................................................. ...............234
12.4 Experiencia práctica con ArcGIS.................................................. ....236
Contenido XIII
12.4.1 Práctica práctica 12.1: Conversión entre DEM,
TIN y Contornos ............................................................. ..................236
12.4.2 Práctica práctica 12.2: Generar pendiente y aspecto .....239
12.4.3 Práctica práctica 12.3: Dirección del flujo ...........................239
12.5 Resumen del capítulo.................................................... ...............................242
Problemas................................................. .................................................... .....242
Sección IV AvanzadaTemas
13. Técnicas para mejorar el rendimiento.................................................... ....247
13.1 Problemas ................................................ .............................................247
13.2 Acceso al disco y administración de la memoria ..................................248
13.2.1 Gestión de archivos ............................................... .....................249
13.2.2 Consideración integral ..................................................249
13.3 Procesamiento paralelo y subprocesamiento múltiple ..................................251
13.3.1 Ejecución Secuencial y Concurrente..................................251
13.3.2 Hilos múltiples ............................................... .......................251
13.3.3 Cargar varios Shapefiles al mismo tiempo
Uso de subprocesos múltiples .............................................. ..........252
13.3.4 Procesamiento en Paralelo y Cluster, Grid,
y computación en la nube .............................................. .........253
13.4 Cálculo de relaciones e índice espacial....................................254
13.4.1 Cuadro delimitador en GIS ............................................... ................255
13.4.2 Índice espacial ............................................... ............................256
13.5 Experiencia práctica con Mini-GIS ............................................... ..257
13.5.1 Carga de datos con RAM como búfer de archivos ..................257
13.5.2 Carga de datos con subprocesos múltiples ..................................258
13.5.3 Comprobación del cuadro delimitador para acelerar la intersección ........258
13.5.4 Intersección de líneas usando el índice R-Tree..................................261
13.6 Resumen del capítulo.................................................... ...............................262
Problemas................................................. .................................................... .....263
14. Temas avanzados.................................................... .............................................265
14.1 Estructura de datos espaciales ............................................... ........................265
14.1.1 Estructura de datos ráster en NetCDF/HDF ...........................265
14.1.2 Aplicación de NetCDF/HDF en el estudio del clima .............266
14.2 Algoritmos y modelado GIS.................................................... ...........270
14.2.1 Datos .............................................. ..........................................270
14.2.2 Análisis de densidad ............................................. .....................271
14.2.3 Análisis de regresión (OLS y GWR) ...............................272
14.3 SIG distribuido.................................................... ....................................275
14.3.1 Arquitectura del sistema ............................................. ...............276
14.3.2 Interfaz de usuario................................................ ..........................277
xiv Contenido
14.4 Pensamiento y computación espaciotemporal....................................280
14.4.1 Problema: simulación y computación de polvo
Desafíos .................................................. ........................280
14.4.2 Metodología 1: Uso de computación de alto rendimiento para 
respaldar la simulación de polvo ...............281
14.4.3 Metodología 2: Utilización del pensamiento espaciotemporal
para optimizar la computación de alto rendimiento ..................281
14.4.3.1 Características del agrupamiento de tormentas de polvo:
Métodos de programación ............................................282
14.4.3.2 Continuidad espacio-temporal de las tormentas de polvo: método de 
descomposición .................................. ..283
14.4.3.3 Los eventos de tormentas de polvo están aislados:
Modelo anidado ................................................ ........284
14.4.4 Metodología 3: Utilización de la computación en la nube
para respaldar el pronóstico de tormentas de polvo ...............................284
14.5 Resumen del capítulo ............................................... ...............................285
Problemas................................................. .................................................... .....286
Referencias.................................................... .................................................... .......287
Índice........................................................................................................ ..................291
Prefacio
¿Por qué otro texto de programación SIG?
El sistema de información geográfica (GIS, por sus siglas en inglés) se ha convertido en una 
herramienta popular que sustenta muchos aspectos de nuestra vida diaria, desde la ruta para 
el transporte hasta la búsqueda de un restaurante y la respuesta a emergencias. Las prácticas 
herramientas GIS se desarrollan con diferentes niveles de programación, desde secuencias de 
comandos, usando python para ArcGIS, hasta la creación de nuevos conjuntos de herramientas 
desde cero. La cantidad de programación que se necesita para los proyectos depende en gran 
medida del software GIS, los tipos de aplicaciones y la estructura del conocimiento y los 
antecedentes del diseñador y desarrollador de la aplicación. Por ejemplo, las secuencias de 
comandos simples integran aplicaciones de mapas en línea que utilizan mapas de Google. Las 
aplicaciones de análisis espacial personalizadas utilizan ArcGIS de forma rutinaria con una 
programación mínima. Muchos desarrollan una aplicación que aprovecha el software de código 
abierto para administrar big data, modelar fenómenos complejos, o respondiendo a usuarios 
simultáneos para sistemas en línea populares. El mejor diseño y desarrollo de dichas 
aplicaciones requiere que los diseñadores y desarrolladores tengan un conocimiento profundo 
de los principios GIS, así como la habilidad para elegir entre opciones de software comerciales y 
de código abierto. Para la mayoría de los profesionales de SIG, esto es un desafío porque la 
mayoría son usuarios finales de herramientas SIG o profesionales de tecnología de la 
información (TI) con una comprensión limitada de SIG.
Para llenar este vacío, durante la última década, Chaowei Yang lanzó un curso introductorio 
de programación GIS que fue bien recibido. La inscripción continúa aumentando y los 
estudiantes informan comentarios positivos una vez que están en el lugar de trabajo y utilizan 
el conocimiento desarrollado en la clase. Para beneficiar a un espectro más amplio de 
estudiantes y profesionales que buscan materiales de capacitación para desarrollar 
capacidades de programación GIS, este libro está escrito para integrar y refinar el conocimiento 
de los autores acumulado a través de cursos y proyectos de investigación asociados.
La audiencia de este libro es tanto profesionales de TI para aprender los principios SIG como 
usuarios de SIG para desarrollar habilidades de programación. Por un lado, este libro 
proporciona un puente para que los estudiantes y profesionales de SIG aprendan y practiquen 
la programación. Por otro lado, también ayuda a los profesionales de TI con experiencia en 
programación a adquirir los fundamentos de GIS para perfeccionar sus habilidades de 
programación para el desarrollo de GIS.
En lugar de intentar competir con la literatura de programación GIS actual, los autores 
se esfuerzan por interpretar GIS desde un ángulo diferente mediante la integración de 
algoritmos y programación GIS. Como resultado, este libro proporciona un conocimiento 
práctico que incluye principios SIG fundamentales, habilidades básicas de programación, 
desarrollo SIG de código abierto, desarrollo ArcGIS y desarrollo avanzado.
XV
xvi Prefacio
temas Estructurado para desarrollar funciones, aplicaciones y sistemas GIS.s, Se espera 
que este libro ayude a los estudiantes y profesionales de SIG/TI a ser más competitivos en 
el mercado laboral de la industria de SIG y TI con las habilidades de programación 
necesarias.
¿Qué se incluye en el texto?
Este libro tiene cuatro secciones. Sección I (Capítulos 1y2) es una descripción general 
de la programación SIG e introduce la informática y la programación desde una 
perspectiva práctica. La programación Python (lenguaje de programación integral 
para ArcGIS) se presenta ampliamente en la Sección II (Capítulos 3mediante8) en el 
contexto del diseño y desarrollo de un Mini-GIS usando experiencia práctica 
siguiendo explicaciones de conceptos fundamentales de SIG. Sección III (Capítulos 9
mediante12)se enfoca en algoritmos GIS avanzados e información sobre cómo 
invocarlos para programar en ArcGIS. Los temas avanzados y la optimización del 
rendimiento se presentan en la Sección IV (Capítulos 13y14) utilizando el Mini-GIS 
desarrollado.
Capítulo 1introduce computadoras, programación de computadoras y GIS. 
Además, se analiza el Lenguaje de marcado unificado (UML) para capturar modelos 
GIS implementados a través de la programación simple de Python.Capitulo 2 
presenta características y programación orientada a objetos con ejemplos de tipos 
básicos de datos vectoriales GIS de punto, polilínea y polígono.
Capítulo 3presenta la sintaxis de Python, los operadores, las declaraciones, las 
características misceláneas de las funciones y el soporte de Python para la 
programación orientada a objetos. Usando ejemplos SIG,Capítulo 4presenta 
estructuras de control del lenguaje Python, entrada/salida de archivos y manejo de 
excepciones.Capítulo 5 presenta el pensamiento de programación utilizando la 
visualización de datos vectoriales como un ejemplo del flujo de trabajo de este 
proceso crítico en la programación. Capítulo 6presenta el entorno de programación 
integrado (IDE) de Python, los módulos, la administración de paquetes y el paquete 
Mini-GIS.Capítulo 7analiza los formatos de archivos de forma y los pasos sobre 
cómo manejar los archivos de forma dentro del Mini-GIS.Capítulo 8introduce 
algoritmos de procesamiento de datos vectoriales e incluye intersección de línea, 
centroide, área, longitud y punto en polígono. Esta presentación incluye cómo Mini-
GIS/ArcGIS admite estos algoritmos.
Capítulo 9une las Secciones II y III al presentar la programación de ArcGIS en Python 
usando ArcPy, el entorno de programación de ArcGIS, herramientas de automatización, 
acceso a datos, descripción de objetos y corrección de errores.Capítulo 10 presenta 
algoritmos de datos ráster, incluido el formato, el almacenamiento y la compresión de 
datos ráster con experiencia práctica en el uso de ArcGIS.Capítulo 11aborda algoritmos 
de datos de red para representar redes y calcular la ruta más corta en principios y usar 
ArcGIS.Capítulo 12explora la superficie o
Prefacio xvii
Representación de datos 3D de datos 3D, conversión de formatos de datos y análisis 3D 
para elevación, pendiente, aspecto y dirección de flujo con ejemplos en programación 
ArcGIS.
Capítulo 13introduce técnicas de mejora del rendimiento e incluye acceso y 
gestión de almacenamiento, procesamiento paralelo y subprocesos múltiples, índice 
espacial y otras técnicas para acelerar GIS como se demuestra en Mini-GIS. Los 
temas avanzados, incluidos algoritmos y modelado GIS, estructura de datos 
espaciales, GIS distribuido, pensamiento espaciotemporal y computación, se 
presentan encapitulo 14.
Experiencia práctica
Como texto práctico para desarrollar habilidades de programación, este libro hace todo 
lo posible para garantizar que el contenido sea lo más funcional posible. Para cada 
principio, algoritmo y elemento fundamental de SIG presentado, se explora un ejemplo 
como una experiencia práctica usando Mini-GIS y/o ArcGIS con Python. Este flujo de 
trabajo de aprendizaje ayuda a desarrollar una comprensión profunda de los 
fundamentos y, naturalmente, se relaciona con los fundamentos y las habilidades de 
programación.
Para el desarrollo de sistemas y código abierto, se presenta un desarrollo paso a 
paso de un Mini-GIS basado en python. Para el desarrollo de aplicaciones, se adopta 
ArcGIS para ilustración.
El Mini-GIS es un software de código abierto desarrollado para este texto y se puede 
adoptar para construir otras aplicaciones GIS. ArcGIS, un producto comercial de ESRI, se 
utiliza para experimentar software comercial de última generación. Para fines de 
aprendizaje, ArcGIS está disponible de forma gratuita en ESRI.
Materiales en línea
Este libro viene con los siguientesmateriales en línea:
• Diapositivas instructivas para instructores que utilizan este texto para la educación en 
el aula y profesionales para ayudar en el aprendizaje de la programación GIS.
• Códigos de Python para ejercicios de clase y experiencias prácticas y 
estructurados y etiquetados por capítulo para codificar la secuencia del capítulo.
• Mini-GIS como un paquete de código abierto para aprender los fundamentos 
de GIS y para ejemplificar los principios y algoritmos de GIS.
• Respuestas a problemas para que los instructores verifiquen sus soluciones.
xviii Prefacio
La audiencia y cómo usar este texto
Este texto tiene dos funciones: un texto para la construcción sistemática de habilidades 
de programación SIG y una referencia para identificar una solución Python para 
algoritmos SIG específicos o funciones desde cero y/o ArcGIS. El texto está destinado a 
ayudar a cuatro categorías de lectores:
• Profesores que enseñan programación GIS o estudiantes GIS que aprenden 
con un enfoque específico en la experiencia práctica en el aula.
• Los programadores que deseen aprender a programar GIS 
escaneando la Sección I yCapítulos 3y4, seguido de un estudio paso 
a paso de los capítulos restantes.
• Los diseñadores de sistemas GIS más interesados en descripciones de 
algoritmos, implementación de algoritmos desde cero y ArcGIS para reunir un 
conocimiento práctico sobre la programación GIS para ayudar en la elección de 
GIS para el desarrollo futuro.
• Profesionales de TI con curiosidad de GIS por los principios de GIS pero 
omitiendo los ejercicios de programación.
La intención de los autores para una audiencia tan amplia se basa en el deseo de 
cultivar una fuerza laboral profesional competitiva en el desarrollo de SIG, mejorar la 
literatura de SIG y servir como una introducción práctica a la investigación de SIG.
¿Cómo desarrollamos este texto?
El material de texto fue desarrollado por primera vez por el profesor Chaowei Yang en 
2004 y se ofreció anualmente en un salón de clases durante la última década. Durante 
ese lapso de tiempo, muchos estudiantes desarrollaron y mejoraron sus habilidades de 
programación. Algunos se convirtieron en profesores y conferencistas en universidades y 
fueron invitados a escribir capítulos de libros específicos. Teniendo en cuenta a la 
audiencia, se invitó a varios profesores que enseñan programación GIS en diferentes 
entornos culturales y universitarios a revisar los capítulos del libro.
El siguiente es el flujo de trabajo de desarrollo del libro:
• Utilizando los materiales de su curso, el profesor Yang estructuró este libro 
con la ayuda de Irma Shagla, y se contrató la estructura del texto para 
publicarlo como libro. El profesor asistente Qunying Huang, de la 
Universidad de Wisconsin, Madison, exploró el uso de las versiones 
anteriores de los materiales del texto. Los Profesores Asistentes Huang y 
Zhenlong Li, Universidad de Carolina del Sur, desarrollaron la Sección II del 
texto en colaboración con el Profesor Yang.
Prefacio xix
• El Dr. Min Sun, la Sra. Manzhu Yu, el Sr. Yongyao Jiang y el Sr. Jizhe Xia 
desarrollaron la Sección III en colaboración con el Profesor Yang.
• El profesor Yang editó y revisó todos los capítulos para asegurar una estructura y 
composición comunes.
• La Sra. Manzhu Yu y el profesor Yang editaron las diapositivas del curso.
• El Profesor Asistente Li, el Sr. Kai Liu, la Sra. Joseph George y la Sra. Zifu 
Wang editaron Mini-GIS como software para el texto.
• Después de completar el texto anterior y los materiales del curso, se invitó a 
cuatro profesores y dos desarrolladores a revisar el contenido del texto.
• Los materiales reunidos para el texto finalmente fueron revisados por 
varios profesionales, incluidos la Sra. Alena Deveau, el Sr. Rob 
Culbertson y el profesor George Taylor.
• El texto fue formateado por la Sra. Minni Song.
• La Sra. Manzhu Yu y el profesor Yang completaron una revisión final de los capítulos, 
diapositivas, códigos, datos y todos los materiales relevantes.
http://taylorandfrancis.com
Expresiones de gratitud
Este texto es un proyecto a largo plazo que evoluciona del curso "Introducción a la 
programación GIS" desarrollado y perfeccionado durante la última década en la 
Universidad George Mason. Muchos estudiantes y profesores brindaron sugerencias 
constructivas sobre qué incluir, cuál es la mejor manera de comunicar y desafiar a los 
estudiantes, y quién debe ser considerado como audiencia del texto.
El resultado refleja la carrera de programación del profesor Yang desde sus 
tesis de pregrado en la Universidad del Noreste de China bajo la tutoría del 
profesor Jinxing Wang. El profesor Yang fue asesorado en programación en el 
dominio GIS por los profesores Qi Li y Jicheng Chen. Sus mentores académicos 
en los Estados Unidos, los profesores David Wong y Menas Kafatos, le 
brindaron apoyo durante muchas décadas y le dieron la oportunidad de 
impartir el curso que finalmente condujo a este texto.
El profesor Yang agradece a los estudiantes brillantes y entusiastas de sus clases 
en la Universidad George Mason. Sus preguntas y críticas perfeccionaron sus 
habilidades de enseñanza, mejoraron el contenido y estimularon este esfuerzo de 
desarrollar un texto.
El profesor Yang agradece a su amada esposa, Yan Xiang, y a sus hijos, 
Andrew, Christopher y Hannah, por complacerlo al robarle un tiempo valioso a 
la familia para completar el texto.
La Sra. Manzhu Yu extiende su gratitud a los muchos colegas que 
brindaron apoyo y leyeron, escribieron, comentaron y ayudaron en la 
edición, revisión y formato del texto.
La profesora asistente Huang agradece a su maravilloso esposo, Yunfeng Jiang, ya 
su encantadora hija, Alica Jiang.
La Dra. Min Sun agradece a su supervisor de doctorado, el profesor David Wong, por 
educarla. También agradece a David Wynne, su supervisor en ESRI, donde trabajó como 
pasante, y a sus otros compañeros de trabajo que, en conjunto, la ayudaron a obtener 
una comprensión más completa de la programación con productos de ESRI. Por último, 
pero no menos importante, agradece a sus padres y al adorable perro que la acompañó 
cuando estaba escribiendo el texto.
Yongyao Jiang agradece a su esposa Rui Dong, a su hija Laura ya sus 
padres Lixia Yao y Yanqing Jiang.
xxx
http://taylorandfrancis.com
Editor
chaowei yanges profesor de ciencias de la información geográfica en la Universidad 
George Mason (GMU). Su interés de investigación es la utilización de principios 
espaciotemporales para optimizar la infraestructura informática para respaldar los 
descubrimientos científicos. Fundó el Centro de Computación Espacial Inteligente y el 
Centro de Innovación Espaciotemporal de la NSF. Se desempeñó como PI o Co-I para 
proyectos por un total de más de $ 40 millones y financiados por más de 15 agencias, 
organizaciones y empresas. Ha publicado más de 150 artículos y ha desarrollado varios 
cursos y programas de capacitación en SIG. Ha asesorado a más de 20 estudiantes de 
posdoctorado y doctorado que se desempeñan como profesores y científicos en 
instituciones estadounidenses y chinas muy aclamadas. Recibió muchos premios 
nacionales e internacionales, como el Premio Presidencial de Administración de 
Protección Ambiental de EE. UU. en 2009. Todos sus logros se basan en su conocimiento 
práctico de SIG y sistemas de información geoespacial. Este libro es una colección de 
conocimientos prácticos sobre cómo desarrollar herramientas GIS desde una perspectiva 
de programación. El contenido se ofreció en sus clases de programación y algoritmos GIS 
durante los últimos 10 años (2004–2016) y ha sido adoptado por sus estudiantes y 
colegas que se desempeñan como profesores en muchas universidades de los Estados 
Unidos e internacionalmente.
XXIII
http://taylorandfrancis.com
Colaboradores
fei hues candidato a doctorado en el NSF Spatiotemporal Innovation Center, George Mason 
University. Está interesado en utilizar tecnologías de computación enla nube de alto 
rendimiento para administrar y extraer grandes datos espaciotemporales. Más 
específicamente, ha optimizado el sistema de almacenamiento distribuido (p. ej., HDFS) y el 
marco informático paralelo (p. ej., Spark, MapReduce) para administrar, consultar y analizar de 
manera eficiente grandes conjuntos de datos basados en matrices multidimensionales (p. ej., 
datos climáticos y sensores remotos). datos). Su objetivo es proporcionar a los científicos 
capacidades analíticas de datos bajo demanda para liberarlos de las tareas computacionales 
que consumen mucho tiempo.
Qunying Huanges profesor asistente en el Departamento de Geografía de la Universidad 
de Wisconsin, Madison. Sus campos de especialización incluyen la ciencia de la 
información geográfica (GIScience), la infraestructura cibernética, la extracción de datos 
grandes espaciotemporales y el modelado y simulación ambiental a gran escala. Está muy 
interesada en aplicar diferentes modelos informáticos, como clúster, grid, GPU, 
computación ciudadana y, especialmente, computación en la nube, para abordar los 
desafíos informáticos y de big data contemporáneos en la ciencia GIS. Más 
recientemente, está aprovechando y extrayendo datos de redes sociales para diversas 
aplicaciones, como respuesta a emergencias, mitigación de desastres y movilidad 
humana. Ha publicado más de 50 artículos científicos y editado dos libros.
yongyao jianges candidato a doctorado en sistemas terrestres y ciencias de la geoinformación 
en el Centro de Innovación Espaciotemporal NSF, Universidad George Mason. Obtuvo una 
Maestría (2014) en Ciencias SIG en la Universidad de Clark y una Licenciatura en Ciencias (2012) 
en teledetección en la Universidad de Wuhan. Su investigación se centra en el descubrimiento 
de datos, la minería de datos, la semántica y la computación en la nube. Jiang recibió el premio 
NSF EarthCube Visiting Graduate Student Early-Career Scientist Award (2016), el Microsoft Azure 
for Research Award (2015) y el primer premio en el Robert Raskin CyberGIS Student 
Competition (2015). Se desempeña como líder técnico de MUDROD, un proyecto de motor de 
búsqueda y descubrimiento semántico financiado por el programa AIST de la NASA.
Zhen Long Lies profesor asistente en el Departamento de Geografía de la Universidad de 
Carolina del Sur. La investigación del Dr. Li se centra en la computación espacial de alto 
rendimiento, el procesamiento/minería de macrodatos y la ciberinfraestructura 
geoespacial en el área de datos y ciencias GIS computacionales intensivas. La 
investigación del Dr. Li tiene como objetivo optimizar la infraestructura informática 
espacial mediante la integración de tecnologías informáticas de vanguardia y principios 
espaciales para respaldar aplicaciones de dominio como el cambio climático y la gestión 
de riesgos.
xiv
xxi Colaboradores
kai liues estudiante de posgrado en el Departamento de Geografía y Ciencias de la 
Geoinformación (GGS) en la Facultad de Ciencias de la Universidad George Mason. 
Anteriormente, fue académico visitante en el Centro de Computación Espacial Inteligente 
para la Ciencia del Agua/Energía (CISC) y trabajó durante 4 años en la Oficina de 
Topografía y Cartografía de Heilongjiang en China. Obtuvo una licenciatura en ciencias de 
la información geográfica en la Universidad de Wuhan, China. Su investigación se centra 
en la semántica geoespacial, la gestión de metadatos geoespaciales, la computación en la 
nube espaciotemporal y la ciencia ciudadana.
Sol mínimoes profesor asistente de investigación en el Departamento de Geografía y 
Ciencias de la Geoinformación de la Universidad George Mason. Sus intereses de 
investigación incluyen medir la incertidumbre de los atributos en datos espaciales, 
desarrollar análisis visuales para respaldar la exploración de datos, WebGIS y 
computación en la nube. Es experta en programación de ArcGIS y también se desempeña 
como subdirectora del Centro de Innovación Espaciotemporal de la NSF de EE. UU.
Jizhe Xiaes profesor asistente de investigación en la Universidad George Mason. Obtuvo 
un doctorado en sistemas terrestres y ciencias de la geoinformación en la Universidad 
George Mason en la primavera de 2015. Los intereses de investigación del Dr. Xia son la 
computación espaciotemporal, la computación en la nube y sus aplicaciones en ciencias 
geográficas. Propuso una variedad de métodos para utilizar patrones espaciotemporales 
para optimizar el acceso a big data, la evaluación de la calidad del servicio (QoS) y la 
aplicación de computación en la nube.
Manzhu Yues candidato a doctorado en el Departamento de Geografía y Ciencias 
de la Geoinformación de la Universidad George Mason. Sus intereses de 
investigación incluyen metodología espaciotemporal, detección de patrones y 
aplicaciones espaciotemporales en desastres naturales. Recibió una Beca 
Presidencial de 2012 a 2015. Ha publicado aproximadamente 10 artículos en revistas 
de renombre, comoMás unoyIJGIS, y contribuyó como autor importante en varios 
capítulos de libros.
Sección I
Visión general
http://taylorandfrancis.com
1
Introducción
Este capítulo presenta los conceptos básicos de computadora, hardware, software y 
programación, y establece el contexto para la programación SIG.
1.1 Hardware y software informático
Acomputadoraes un dispositivo que tiene la capacidad de realizar diferentes tipos de tareas 
automatizadas basadas en instrucciones específicas predefinidas por interacciones con los 
usuarios finales o a través de ellas. Por ejemplo, al hacer clic en el icono de ArcGIS se ejecutará 
el software ArcGIS. Podemos seleccionar un destino y un punto de partida para activar un 
análisis de enrutamiento para identificar una ruta de manejo usando Google Maps. Las 
computadoras son algunas de las tecnologías de más rápida evolución, como lo refleja la 
capacidad de procesamiento de las pequeñas calculadoras a las supercomputadoras. El tamaño 
de los dispositivos se ha reducido desde computadoras que ocupan un edificio hasta 
dispositivos móviles en bolsillos (Figura 1.1). Las interacciones del usuario van desde escribir 
tarjetas perforadas (primeras computadoras) hasta la interacción humano-computadora, como 
hablar para invocar una acción o tarea.
Hay dos componentes importantes de una computadora (Hwang y Faye 1984): (1) el 
dispositivo físico que puede realizar el procesamiento automatizado y (2) los paquetes de 
instrucciones que se pueden configurar para proporcionar una funcionalidad específica, 
como el procesamiento de textos o el procesamiento de información geográfica. . El 
primer componente de una computadora, elhardware, es tocable como máquinas físicas. 
El segundo componente, elsoftware, puede comprarse con el hardware en forma de 
sistema operativo o instalarse descargándolo en línea. El hardware de la computadora se 
puede configurar o programar para realizar diferentes tareas; por lo tanto, una 
computadora también puede llamarse un dispositivo de propósito general. El software 
varía mucho, ya sea que proporcione capacidad de procesamiento de documentos, 
gestión financiera, procesamiento de declaraciones de impuestos o simulaciones 
científicas como el cambio climático o la propagación de enfermedades. Según el tipo de 
software, se adquiere públicamente (freeware) o es propietario (requiere compra y 
licencia). Según el uso, el software puede clasificarse como software de sistema, software 
de aplicación o software integrado (Figura 1.2). El software del sistema se refiere al 
software básico que debe instalarse para que una computadora funcione. Windows y 
Linux son ejemplos de software de sistema operativo (SO), un componente esencial de 
una computadora. Soporte de software de aplicación
3
4 Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
(a) (b)
FIGURA 1.1
(a) Supercomputadora de la NASA. (De la supercomputadora de la NASA enhttp://www.nas.nasa.gov/hecc/
resources/pleiades.html.) (b) Otras computadoras: computadora personal(PC), laptop, pad. (De diferentes 
computadoras enhttp://www.computerdoc.com.au/cuáles-son-los-diferentes-tipos-de-computadoras.)
grupos específicos de tareas, como Microsoft Word para el procesamiento de 
documentos y Microsoft Outlook para correos electrónicos. El software integrado es un 
tipo de firmware que se graba en el hardware y se convierte en parte de ese hardware. El 
software integrado existe más tiempo en una computadora que cualquier otro software. 
El firmware siempre vendrá con el hardware cuando compre una computadora, por lo 
que no tendrá que cambiar el firmware con tanta frecuencia, especialmente cuando 
actualice un navegador web o Turbo Tax Return de forma rutinaria.
Sistema de información geográfica(GIS) es un tipo de software de aplicación que 
trata principalmente con información geográfica (Longley et al. 2001). El sistema de 
posicionamiento global (GPS, Misra y Enge 2006) se utiliza para ubicar lugares 
geográficos y se puede instalar tanto en automóviles como en teléfonos inteligentes 
para enrutamiento. El software SIG incluye dos categorías: SIG profesional y SIG 
ligero. El software GIS profesional, como ArcGIS, proporciona la mayor
Software de la aplicacion
Word, navegador web, ArcGIS
Software del sistema
Windows, Linux,...
software integrado
Hardware
FIGURA 1.2
Diferentes tipos de software.
http://www.nas.nasa.gov/hecc/resources/pleiades.html
http://www.nas.nasa.gov/hecc/resources/pleiades.html
http://www.computerdoc.com.au/what-are-the-different-types-of-computers
Introducción 5
conjunto completo de funcionalidades GIS para profesionales en el dominio GIS. El 
software GIS menos intenso, pero popular, que se utiliza para ver el entorno 
geográfico es la aplicación de mapas en línea, como Google Maps y Google Earth.
1.2 SIG y Programación
GIS se origina en varios dominios y se refiere al sistema diseñado para capturar, 
observar, recopilar, almacenar y administrar datos geográficos y proporcionar 
herramientas para análisis y visualización espacial (Longley et al. 2001). Los SIG pueden 
ayudar a obtener datos geográficos que se utilizarán para la toma de decisiones, como la 
elección de rutas para la respuesta a emergencias. Se sabe que GIS comenzó a partir del 
programa informático canadiense de inventario de recursos naturales dirigido por Roger 
Tomlinson en la década de 1960. GIS se está volviendo cada vez más popular en 
dispositivos móviles como un medio para analizar información y patrones relacionados 
con el tráfico y el clima.
Acuñado por Mike Goodchild, el término "GIS" también puede referirse al campo 
de la ciencia de la información geográfica ociencia SIG—el estudio de los principios y 
tecnologías SIG aplicados científicamente (Goodchild 1992). Según los científicos de 
SIG,ciencia SIGinvolucra sensores remotos, sistemas globales de navegación por 
satélite y GIS. Además, en varios dominios,Geoinformáticapuede aplicarse a la 
teledetección, el sistema mundial de navegación por satélite y la información GIS. 
Estos temas, sin embargo, no serán explorados en este libro.
GIS es el sistema que comprende hardware (computadora, dispositivos móviles, GPS), 
software (ArcGIS o mapeo en línea) y datos (información geográfica) que se pueden 
utilizar para lograr un conjunto de funcionalidades para un grupo de usuarios. Los tres 
componentes deben utilizarse para que GIS funcione de manera efectiva. Una diferencia 
significativa entre GIS y otras aplicaciones de software es su capacidad para administrar y 
manipular el gran volumen y la complejidad de los datos geográficos, que comprenden 
información espaciotemporal y de atributos incrustada. El carácter complejo de los datos 
GIS exige un conjunto específico de software para extraer información para la toma de 
decisiones. Los paquetes de software maduros están disponibles públicamente, incluido 
el conjunto más actualizado de software ArcGIS y la última edición del software de mapas 
web Google Maps.
El proceso de desarrollo de software se denominaprogramación. La programación le indica a 
la computadora que realice una tarea en función de las órdenes. Hay muchos tipos diferentes 
de niveles de programación (Mitchell 1996). El nivel más bajo para programar se basa en las 
instrucciones de hardware específicas admitidas por las unidades centrales de procesamiento 
(CPU) y utilizadas por los desarrolladores de instrumentos inteligentes. Debido a que las 
instrucciones de la CPU se procesan como una secuencia de 0 y 1, el lenguaje ensamblador se 
desarrolla para ayudar a los desarrolladores a recordar esas instrucciones. Ambos lenguajes se 
consideran de bajo nivel y son específicos del hardware. Se han desarrollado lenguajes 
avanzados para facilitar la
6 Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
comprensión, pero todavía están restringidos por las instrucciones del hardware. Por 
ejemplo, el lenguaje de programación C se usa comúnmente para desarrollar software 
(Kernighan y Ritchie 2006). Para hacer que la organización de la programación sea más 
similar a cómo vemos el mundo, se propuso C++ para admitir la programación orientada 
a objetos basada en C (Stroustrup 1995). Desde entonces, se han desarrollado y se 
utilizan muchos lenguajes de programación diferentes en la programación GIS. Por 
ejemplo, Java es un lenguaje para el desarrollo de aplicaciones multiplataforma 
propuesto por Sun Microsystems (Arnold et al. 2000). JavaScript se utiliza para realizar 
una programación de secuencias de comandos (más simple) para manipular objetos 
dentro de un navegador web. Además de Java y JavaScript, ArcGIS ha agregado 
recientemente Python a su lista de lenguajes de programación (Van Rossum 2007).
¿Por qué necesitamos la programación GIS? El software GIS maduro y las plantillas de 
aplicaciones brindan muchas herramientas para realizar nuestras tareas diarias; sin 
embargo, para comprender los fundamentos de cómo funciona GIS y personalizar el 
software para problemas específicos, se requiere programación. La siguiente lista 
proporciona ejemplos de programación:
• Software de personalización para la aplicación.: El Servicio de Parques Nacionales 
está desarrollando una sencilla aplicación web de mapas para permitir que el público 
en general seleccione y vea de forma interactiva la información de un Parque 
Nacional en particular. El uso de una herramienta de mapeo en línea como Google 
Maps y la selección de un parque con el mouse activará una consulta de la 
información seleccionada para ese parque. En este escenario, necesitamos 
información geográfica sobre los parques, un programa para la interacción del 
usuario front-end y un lenguaje de consulta de base de datos que generará 
resultados para el parque seleccionado.
• Automatización de un proceso: suponga que hay 100 conjuntos de datos geográficos 
recopilados en formato de archivo de texto y necesitamos convertirlos en un archivo de 
forma, un formato de archivo de datos nativo utilizado por ArcView y ArcGIS, para su 
posterior procesamiento. ArcGIS puede realizar la conversión una por una, pero hacerlo 
manualmente 100 veces es monótono. Por lo tanto, una herramienta de secuencias de 
comandos simple para leer y procesar automáticamente los 100 conjuntos de datos en 
archivos de forma sería beneficioso. El uso de secuencias de comandos de Python en 
ArcGIS brinda la capacidad de hacerlo.
• Satisfaciendo necesidades GIS simples: Supongamos que hay una empresa de 
transporte que necesita realizar un seguimiento de las posiciones de los vehículos de 
su empresa en intervalos de 5 minutos. Sin embargo, la empresa no puede 
permitirse comprar una licencia de software GIS profesional. Para resolver el 
problema, la empresa puede usar Python para crear un mapa que muestre la región 
de servicio de la empresa y las ubicaciones de los vehículos cada 5 minutos. Esta 
programación puede incluir características de Zoom In/Out y Move/Pan, animaciones 
basadas en ubicaciones y una selección de uno o varios vehículos.Introducción 7
• Cultivando profesionales GIS avanzados: Suponga que se le pide a un grupo de 
estudiantes que invente un algoritmo de enrutamiento basado en las 
condiciones de tráfico pronosticadas y la información de tráfico en tiempo real. 
Los estudiantes deberán organizar la información de la red de carreteras 
comparando la velocidad de la red en tiempo real y prevista. Es esencial utilizar 
la información prevista más precisa en el proceso de enrutamiento. Se necesita 
programación a lo largo de todo el proceso para la gestión y el enrutamiento de 
la red, y para reconstruir los resultados en forma de mapa o instrucciones 
escritas.
La información geográfica se ha vuelto cada vez más importante en todos los ámbitos de la vida humana, ya sea 
para el descubrimiento científico, el pronóstico de desastres naturales, el avance de las tecnologías de observación o la 
creación de conciencia pública sobre la ubicación y la ruta. Mientras que algunas aplicaciones requieren tecnologías GIS 
completas para producir resultados valiosos, muchas aplicaciones de información geográfica no requieren sistemas de 
información geográfica sofisticados. Para el último caso, se utiliza un software de información geoespacial pequeño o 
de código abierto, mientras que los sistemas GIS comerciales como ArcGIS están disponibles para el primer caso. Para 
abordar mejor ambas necesidades, es esencial comprender los fundamentos de cómo funciona GIS y su procesamiento 
básico de información geográfica. En este capítulo se presenta la estructura de fondo para construir tales capacidades: 
hardware y software informático, GIS y programación, modelos de datos GIS y lenguaje de marcado unificado (UML, 
Fowler 2004) y Python. Se necesita experiencia práctica en programación para comprender los conceptos y desarrollar 
las habilidades esenciales utilizadas por los profesionales SIG en su trabajo e investigación. Basado en los fundamentos 
de SIG, este libro lo ayudará a desarrollar y mejorar las habilidades de programación sistemática y le brindará una 
comprensión más profunda de los fundamentos de SIG. Debido a su popularidad dentro de la comunidad GIS, Python 
será el lenguaje de programación principal que se utilizará en este libro. Basado en los fundamentos de SIG, este libro 
lo ayudará a desarrollar y mejorar las habilidades de programación sistemática y le brindará una comprensión más 
profunda de los fundamentos de SIG. Debido a su popularidad dentro de la comunidad GIS, Python será el lenguaje de 
programación principal que se utilizará en este libro. Basado en los fundamentos de SIG, este libro lo ayudará a 
desarrollar y mejorar las habilidades de programación sistemática y le brindará una comprensión más profunda de los 
fundamentos de SIG. Debido a su popularidad dentro de la comunidad GIS, Python será el lenguaje de programación 
principal que se utilizará en este libro.
1.3 pitón
Python fue desarrollado originalmente por un programador holandés, Guido van 
Rossum, en 1990. Según los informes, Van Rossum era fanático de la serie de 
comedia británica,El circo volador de Monty Python, y al desarrollar el lenguaje de 
programación de código abierto, tomó prestado el nombre "Python" para el 
lenguaje y su institución sin fines de lucro, Python Software Foundation.
Similar a los lenguajes de programación C++ y Java, Python es un lenguaje orientado a 
objetos e interactivo. Python es dinámico en el sentido de que utiliza un mecanismo 
automático de administración de memoria para asignar y liberar memoria para
8 Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
datos (variables). Python y ArcGIS lanzan regularmente nuevas versiones de sus 
programas; este libro está basado en la versión 2.7 de Python y ArcGIS 10.1.
Hay muchas razones para elegir Python, incluidas las siguientes:*
• Es excelente para principiantes en programación, pero excelente para expertos.
• La sintaxis de Python es muy simple y fácil de aprender. Cuando te 
familiarices con ellos, sentirás que es realmente muy útil.
• Es altamente escalable y muy adecuado para proyectos grandes y pequeños.
• Está en una fase de rápido desarrollo. Casi cada medio año, hay un nuevo 
lanzamiento importante.
• Es multiplataforma portátil. Esto significa que un programa escrito en 
Windows se puede ejecutar con los sistemas operativos Linux o Mac.
• Es fácilmente extensible. Siempre puede agregar más funciones de clase a su 
proyecto actual.
• Dispone de potentes bibliotecas estándar.
• Muchos terceros también ofrecen paquetes altamente funcionales 
para su uso. En lugar de desarrollar funciones GIS desde cero, 
simplemente puede descargar el código fuente e integrarlo en su 
proyecto.
• Es totalmenteorientado a objetoslenguaje, simple pero elegante, estable y 
maduro.
Hay varios pasos para aprender Python para la programación GIS:
• Familiarizarse con el concepto de clase y objeto (Capítulos 1y2).
• Aprenda la sintaxis de Python, incluidas variables, tipos de datos, 
estructuras, controles, instrucciones y otras estructuras de 
programación (Capítulos 1mediante4).
• Cree programas de Python desde cero e integre bibliotecas de código 
abierto para facilitar la programación (Capítulo 5).
• Familiarizarse con el entorno de programación de Python (intérprete de 
Python o editor de texto de Python,Capítulo 6).
• Resolver problemas GIS escribiendo código para algoritmos GIS (Capítulos 7 
mediante13).
Estos componentes se presentan en el orden anterior a lo largo de este libro. 
Este capítulo presenta conceptos importantes como la programación orientada 
a objetos, UML y modelos GIS.
* http://pythoncard.sourceforge.net/what_is_python.html.
http://pythoncard.sourceforge.net/what_is_python.html
Introducción 9
1.4 Clase y Objeto
Dentro de esta sección, discutiremos dos tipos de conceptos fundamentales: clase y objeto 
(Rumbaugh et al. 1991). La clase utiliza un conjunto de atributos y comportamientos para 
representar una categoría de fenómenos del mundo real. Por ejemplo,Figura 1.3 muestra cómo 
extraer los atributos y comportamientos de los estudiantes.
Otro ejemplo son las compras en línea en Amazon o eBay. Tanto los clientes 
como los productos en línea deben resumirse en clases:
• Los clientes tendrían una identificación de cliente, una dirección de envío y una 
dirección de facturación. El comportamiento del cliente incluiría agregar o eliminar 
un producto del carrito de compras.
• Los productos tendrían un ID de producto, un nombre de producto y un precio de 
producto. El comportamiento del producto incluiría establecer el precio y sumar la 
cantidad/cantidad del producto.
Un objeto es una instancia específica de una clase. Podemos considerar objetos 
como instancias de clases asignando valores a sus atributos. Específicamente, una 
clase es la abstracción de una categoría o colección de entidades del mundo real, 
mientras que un objeto es una entidad específica del mundo real dentro de la clase. 
Dentro de una computadora, una clase es la plantilla y un objeto es la entidad 
específica que ocupa la memoria de la computadora. La computadora puede operar 
tanto en los atributos como en los comportamientos de un objeto. Por ejemplo, 
cuando un estudiante inicia sesión en el sistema web de su universidad con un 
nombre de usuario y una contraseña, el sistema creará un nuevo objeto de 
estudiante. La computadora lee a cada estudiante como un objeto independiente 
con varios atributos diferentes (por ejemplo, nombre de usuario, contraseña e ID de 
estudiante). Después de iniciar sesión, un estudiante puede buscar, registrarse,
Capitulo 2presentará cómo definir clases y objetos usando Python.
FIGURA 1.3
Un ejemplo de representación de estudiantes con la clase Student.
10Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
1.5 Modelos de datos SIG
Los modelos de datos GIS se utilizan para capturar elementos geoespaciales esenciales de un 
problema específico (Longley et al. 2001).Hay tres tipos de modelos de datos: datos vectoriales, 
datos raster y datos especiales. Los modelos de datos vectoriales constan de tipos de modelo 
de punto, polilínea y polígono. Los datos ráster incluyen celdas igualmente divididas de 
imágenes y modelos de elevación digitales. Los datos especiales se componen de datos lineales 
y de red. Este libro destaca diferentes tipos de modelos de datos GIS, pero se centrará 
principalmente en modelos de datos vectoriales.
Un punto puede hacer referencia a una clase de datos vectoriales representados por 
un par de coordenadas x, y en un espacio bidimensional (2D) o una tupla de coordenadas 
x, y y z en un espacio tridimensional (3D). Por ejemplo, una ciudad se representa como un 
punto en un mapamundi. Cada ciudad tiene un grupo de atributos, que incluiría el 
nombre de la ciudad, la población, el ingreso familiar promedio y los acro-nombres. Otro 
ejemplo que usa puntos es un mapa que muestra todos los restaurantes dentro de una 
determinada región. Además de su ubicación puntual, cada restaurante contendrá otra 
información relevante, incluido su nombre, la capacidad de la sala, la cocina y el año en 
que abrió. En estos casos, el punto es una clasificación general, mientras que la ciudad o 
el restaurante es un tipo de clase más específico que contiene diferentes atributos. Al 
diseñar, cada punto del rectángulo puede representar una clase (Figura 1.4). Este 
diagrama también se conoce como diagrama de clases UML. La primera fila se refiere al 
nombre de la clase:Ciudad; la segunda fila se refiere a los atributos de la clase:nombrey
ingreso promedio; la tercera fila se refiere a un conjunto de métodos:obtenerNombre,
obtenerIngresoPromedio, yescoger un nombre.
Las polilíneas son una clase de datos vectoriales representados por una lista de puntos. 
Por ejemplo, un río se puede representar como una polilínea en un mapa, que luego se 
puede categorizar como un tipo de clase de polilínea. Una clase de polilínea puede incluir 
coordenadas de puntos, atributos relevantes y un conjunto de métodos. Otro ejemplo de 
dataset de polilínea pueden ser carreteras, autopistas e interestatales. Ambos ejemplos 
son categorías de polilíneas. Los ríos se pueden representar usando UML (Figura 1.5). La 
primera fila del UML es el sujeto de la clase:Río; la segunda fila incluye los atributos del 
río:nombreycoordenadas; y la tercera fila se refiere a los métodos que usará el 
programador:obtenerNombre,establecer coordenadas, yescoger un nombre.
FIGURA 1.4
Un diagrama UML para la clase City.
Introducción 11
FIGURA 1.5
La clase River incluye tres partes.
FIGURA 1.6
La clase County incluye tres partes.
Los polígonos son otra clase de datos vectoriales que también están representados por una 
lista de puntos; sin embargo, con los polígonos, el primer y el último punto son los mismos. Por 
ejemplo, en el mapa del estado de Virginia, un condado específico, como el condado de Fairfax, 
se puede representar como un polígono. El condado es un tipo de clase de polígono, que 
incluye una lista de puntos, atributos relevantes y un conjunto de métodos. Los países en un 
mapa mundial también se pueden representar como polígonos. En cualquier caso, tanto el 
condado como el país son tipos de polígonos. Como se muestra enFigura 1.6, la primera fila es 
el nombre del asunto:Condado; la segunda fila son los atributos del sujeto:nombreypoblación; y 
la tercera fila se refiere a los métodos:obtenerNombre,conjuntoPoblación, yescoger un nombre
.
Desarrollar más métodos requerirá agregar más métodos y atributos a cada 
clase para capturar la evolución de los modelos de datos y la funcionalidad del 
software; Los diagramas UML se utilizan para estandarizar su representación. 
Esta sección utiliza diagramas de clases y estándares UML relevantes para las 
clases de puntos, polilíneas y polígonos.
1.6 UML
En 1997, el Grupo de Gestión de Objetos (OMG)*creó el UML para registrar el diseño 
del software para la programación. Diseñadores y programadores de software
* Ver Dios mío enhttp://www.omg.org/.
http://www.omg.org/
12Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
use UML para comunicar y compartir el diseño. Similar al idioma inglés en el 
que nos comunicamos compartiendo nuestras ideas hablando o escribiendo, 
UML se usa para modelar una aplicación o problema de forma orientada a 
objetos. El modelado UML se puede utilizar para facilitar todo el diseño y 
desarrollo de software.
El diagrama UML se utiliza para capturar la lógica de programación. Hay dos tipos 
de diagramas que discutiremos específicamente: diagramas de clases y diagramas 
de objetos (Figura 1.7).
El diagrama de clases UML puede representar una clase usando tres partes: 
nombre, atributos y métodos. Los atributos y métodos tienen tres 
accesibilidades diferentes: pública (+), privada (-) y protegida (#). Los atributos y 
métodos normalmente se representan en el siguiente formato:
• Atributos: atributo de accesibilidad Nombre: tipo de datos del atributo, por 
ejemplo, +nombre: Cadena
• Métodos: nombre del método de accesibilidad (argumentos del método): tipo de 
devolución del método, por ejemplo, +setName(name:String): void
Público se refiere al método/atributos a los que pueden acceder otras 
clases. Ninguna otra clase puede acceder a métodos/atributos privados.
Otras clases no pueden acceder a los métodos/atributos protegidos, excepto aquellas 
clases heredadas de esta clase (se explica a continuación).
Hay varias relaciones fundamentales entre diferentes clases: dependencia, 
herencia, composición y agregación. La dependencia representa una clase 
dependiente de otra. La herencia es una relación importante en la que una clase es 
un subtipo de otra clase.Figura 1.8ilustra la dependencia entre la geometría y los 
sistemas de coordenadas en el sentido de que la existencia de la geometría 
depende de un sistema de coordenadas. Esta relación está representada por una 
línea discontinua y una flecha desde la geometría hasta la clase del sistema de 
coordenadas. La relación entre un punto, una línea y un polígono se clasifican 
dentro de la clase de geometría.
La agregación y la composición son otras dos relaciones importantes en UML. 
La agregación representa la relación "tiene un" en UML. Por ejemplo, un estado 
es una agregación de varios condados (Figura 1.9a). La composición representa, 
o “posee” la relación. Por ejemplo, una clase multipunto puede estar compuesta 
por dos o más puntos (Figura 1.9b).
La relación se puede cuantificar por el número de elementos involucrados. Por 
ejemplo, una línea incluye más de 2 puntos y un estado incluye más de 0 condados. 
Hay seis tipos diferentes de esta relación de multiplicidad (Figura 1.10). Un 
multipunto se compone de dos o más puntos (Figura 1.9b) y un estado se agrega 
por cero o más condados.
Un objeto es uninstanciaciónde una clase El diagrama de objetos muestra una vista completa o 
parcial de la estructura del sistema modelo en un momento específico. Entonces, el estado
Introducción 13
D
ia
gr
am
a
Es
tr
uc
tu
ra
di
ag
ra
m
a
Co
m
po
rt
am
ie
nt
o
di
ag
ra
m
a
Cl
as
e
di
ag
ra
m
a
Co
m
po
ne
nt
e
di
ag
ra
m
a
O
bj
et
o
di
ag
ra
m
a
Ac
tiv
id
ad
di
ag
ra
m
a
ca
so
 d
e 
us
o
di
ag
ra
m
a
Co
m
pu
es
to
es
tr
uc
tu
ra
di
ag
ra
m
a
Es
ta
do
m
áq
ui
na
di
ag
ra
m
a
Pe
rf
il
di
ag
ra
m
a
D
es
pl
ie
gu
e
di
ag
ra
m
a
Pa
qu
et
e
di
ag
ra
m
a
In
te
ra
cc
ió
n
di
ag
ra
m
a
In
te
ra
cc
ió
n
vi
si
ón
 g
en
er
al
di
ag
ra
m
a
Se
cu
en
ci
a
di
ag
ra
m
a
Co
m
un
ic
ac
ió
n
di
ag
ra
m
a
M
om
en
to
di
ag
ra
m
a
N
ot
ac
ió
n:
 U
M
L
FI
G
U
RA
 1
.7
El
 d
ia
gr
am
a 
de
 c
la
se
s 
y 
el
 d
ia
gr
am
a 
de
 o
bj
et
os
 u
til
iz
ad
os
 e
n 
es
te
 li
br
o.
14Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
Geometría Sistema coordinado
Punto Línea Polígono
FIGURA 1.8
Herencia y dependencia.
(a)(b)
Composición
condados Agregación
0..*
Estado Punto multipunto
2..*
Hueco
diamante
Lleno
diamante
FIGURA 1.9
(a) La agregación y (b) la composición son dos relaciones polares entre clases.
FIGURA 1.10
Relación multiciudad entre clases.
de un objeto se puede cambiar.Figura 1.11El nombre de clase de es worldMap y su 
objeto es el sistema de coordenadas que cambió de WGS 1972 a WGS 1984 después 
de realizar la reproyección.
1.7 Experiencia práctica con Python
Un punto es el modelo de datos básico dentro de GIS. Esta sección examinará 
cómo crear una clase de punto, incluidas las coordenadas y los cálculos de la
Introducción 15
FIGURA 1.11
worldMap es un objeto de la clase Map y el estado cambia con diferentes operaciones.
distancias entre puntos. Aprenderá a crear objetos de punto a partir de la clase 
de punto.
1. Abra el programa (Figura 1.12): ventanas→Todos los 
programas→ArcGIS→Pitón 2.7 o
ventanas→Todos los programas→Pitón 2.7→INACTIVO (GUI de Python)
FIGURA 1.12
Inicie la ventana de programación de Python (GUI).
dieciséisIntroducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > importarMatemáticas
> > > clasePunto(): definitivamente__en eso__
(uno mismo):
self.x = 0
self.y = 0
definitivamenteestablecerXY(uno mismo,x,y):
self.x = x
self.y = y
definitivamenteCalDis(uno mismo,p):
devolvermatemáticas.sqrt((self.xp.x)**2+(self.yp.y)**2)
> > > p1 = Punto()
> > > p2 = Punto()
> > > p1.establecerXY(1,2)
> > > p2.establecerXY(2,3)
> > > p1.calDis(p2)
1.4142135623730951
> > >
CÓDIGO 1.1
Creando una clase de punto y generando dos puntos, luego calculando la distancia entre los 
dos puntos.
2. Escriba los códigos de clase de puntos como se muestra en el Código 1.1.
Consejos de programación:
1. La codificación debe ser exactamente igual a la que muestra la figura.
2. El método init se define con cuatro guiones bajos: dos "_" antes y dos 
después de "init".
3. Python distingue entre mayúsculas y minúsculas, por lo que las mayúsculas y minúsculas de la 
misma letra marcarán la diferencia.
4. No hay necesidad de entender cada declaración por ahora; se 
explicarán gradualmente en los siguientes capítulos.
1.8 Resumen del capítulo
Este capítulo introdujo brevemente la programación GIS e incluyó
• Una introducción general al hardware y software de la computadora
• Definiciones de SIG y programación
• Python en un contexto práctico
• Conocimiento práctico sobre varios modelos de datos GIS
Introducción 17
• El lenguaje de modelado unificado para modelar datos GIS orientados a 
objetos
• Experiencia práctica relevante
PROBLEMAS
• Definir computación, programación, software y SIG.
• ¿Cuáles son los diferentes métodos para clasificar el software?
• ¿Cuáles son los tres modelos de datos GIS que se encuentran en el diagrama UML?
• Explicar por qué necesitamos aprender a programar SIG.
• Usar el diagrama UML para modelar la relación entre polilíneas.
• Usar el diagrama UML para modelar la relación entre polígonos.
• Practica PythonCapítulo 3tutorial:https://docs.python.org/3/tutorial/
introduction.html.
• Utilice Python para calcular la distancia entre el Punto (1, 2) y el Punto (2, 
2).
• Discutir cómo identificar las clases usadas en un mapa mundial y cómo usar 
UML para capturar esas clases.
https://docs.python.org/3/tutorial/introduction.html
https://docs.python.org/3/tutorial/introduction.html
http://taylorandfrancis.com
2
Programación orientada a objetos
Este capítulo presenta la programación orientada a objetos con respecto al lenguaje de 
programación Python, las clases y los objetos, la generación de objetos, la herencia, las 
clases y los objetos GIS y una experiencia general de programación.
2.1 Lenguaje de programación y Python
El lenguaje de programación se define como un lenguaje artificial utilizado para 
escribir instrucciones que pueden traducirse a lenguaje de máquina y luego 
ejecutarse por una computadora. Esta definición incluye cuatro aspectos 
importantes: (1) lenguaje artificial, un tipo de lenguaje de programación creado 
únicamente para la comunicación informática; (2) basado en instrucciones, un 
lenguaje de programación con instrucciones limitadas respaldadas por una 
computadora o CPU específica; (3) traducción, la conversión de instrucciones 
humanas a un programa informático técnico o CPU; y (4) traductor, del cual hay dos 
tipos: intérprete y compilador (Aho y Ullman 1972).
Hay dos métodos diferentes que utilizan los programadores de 
computadoras para convertir idiomas a un formato legible en la computadora. 
Un método requiere que un programador de computadoras compile un grupo 
de declaraciones escritas en un lenguaje específico y las convierta a un formato 
legible por máquina antes de ejecutar el programa. El otro método implica 
traducir simultáneamente el idioma mientras se ejecuta el programa. Por 
ejemplo, en la programación C, necesitamos usar el compilador C para traducir 
el programa a códigos de máquina antes de la ejecución. De manera similar, C+
+ y Java son lenguajes de programación de tipo compilación. El lenguaje de 
programación BASIC es un lenguaje de interpretación (Lien 1981), en el que el 
intérprete traducirá el programa mientras se ejecuta. Asimismo, Python, Perl y 
PHP se consideran lenguajes de interpretación. Por lo tanto, para usar con éxito 
Python en una computadora,
Los lenguajes de programación han evolucionado considerablemente desde los lenguajes de 
máquina y ensamblador hasta los lenguajes intermedios y avanzados (Rawen 2016). Las 
instrucciones en lenguaje máquina se representan en una secuencia específica utilizando 0 y 1. 
Un solo dígito, o número, se llama bit. Una combinación de tres bits se denomina número octal 
(una combinación de ocho dígitos que utiliza los números del 0 al 7), mientras que una 
combinación de cuatro bits se denomina número hexadecimal.
19
20Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 2.1
Imprima 'A' 1000 veces usando diferentes tipos de idiomas.
(una combinación de 16 dígitos usando los números 0–15). Los lenguajes ensambladores 
representan las operaciones de bits de la máquina con representaciones de texto fáciles 
de recordar. Los lenguajes intermedios suelen ser más potentes y fáciles de codificar. Los 
lenguajes avanzados son más similares al lenguaje humano, no tienen acceso a funciones 
de hardware específicas y se ejecutan en varios tipos de hardware diferentes.
El ejemplo utiliza diferentes representaciones para la "letra impresa 'A' 1000 
veces" (Figura 2.1).
Los lenguajes de máquina se vuelven cada vez más difíciles de entender para los 
humanos, por lo que solo las CPU específicas pueden leer el lenguaje con precisión 
(Hutchins 1986). Por lo tanto, en la programación GIS, normalmente usamos 
lenguajes avanzados como C, Java o Python en lugar de lenguaje de máquina o 
ensamblador.
C es un lenguaje de procedimiento típico que se desarrolló entre 1969 y 1973 y 
estuvo disponible para el público en general entre 1977 y 1979. Fue estandarizado 
oficialmente por el comité ANSI X3J11 a mediados de la década de 1980 y se ha 
convertido en uno de los lenguajes más utilizados en la industria informática. Las 
primeras ediciones de GRASS (Geographic Resource Analysis Support System, 
Neteler y Mitasova 2013) GIS*El software de código abierto y ArcGIS se desarrollaron 
utilizando C. Bjarne Stroustrup de Bell Laboratories expandió C a C ++ para admitir 
funciones orientadas a objetos. C++ admite características de C en llamadas a 
funciones y clases/objetos orientados a objetos. Tanto C como C++ son complejos 
para los programadores principiantes. Desde 1999, ISO/ANSI ha
* http://grass.osgeo.org/.
http://grass.osgeo.org/
Programación orientada a objetos 21
C++ estandarizado para mejorar y mantener la calidad de vanguardia 
dentro de la industria. C y C ++ se usan comúnmente en Linux y han 
influido en otros lenguajes como C # y Java.
Desarrollado por Sun en SunWorld'95, Java es un lenguaje puro orientadoa 
objetos desarrollado para aplicaciones de Internet y multiplataforma. Con el tiempo, 
Java se ha vuelto cada vez más popular entre las empresas de TI como Microsoft, 
Borland/Eclipse, IBM y Sun. El recurso oficial de Java se puede encontrar en 
java.sun.com y se puede encontrar un entorno de programación/compilador de 
código abierto en el sitio web de la Fundación Eclipse enwww.eclipse.com.
Python es un sistema de programación de lenguaje interactivo creado por Guido van 
Rossum en 1990. Python está escrito de forma dinámica y utiliza una gestión de memoria 
automática. La Python Software Foundation, una organización sin fines de lucro, actualiza 
y administra constantemente este proyecto de código abierto. Python está 
completamente desarrollado en el sentido de que puede escribir una vez y ejecutarse 
muchas veces en diferentes plataformas. Este libro analizará y explicará cómo se aplica 
Python a GIS y ArcGIS.*programación. Puede descargar cualquier versión del sitio web de 
Python; sin embargo, no todas las versiones funcionan de forma interactiva con ArcGIS. 
Python es fácil de aprender y usar, y es compatible con ArcGIS, razón por la cual lo hemos 
elegido como lenguaje de programación para este libro.
2.2 Clase y Objeto
Clasesyobjetosson ampliamente utilizados en Python. Clase define la plantilla para una 
categoría de objetos con nombre, atributos y métodos. Los objetos son instancias de 
clases con atributos y métodos. Se puede hacer referencia a los atributos y métodos 
usando un '.'. Por ejemplo, se puede hacer referencia a los atributos de coordenadas y al 
método calDis de un objeto de punto creado a partir de una clase Point mediante point.x, 
point.y y point.calDis().
2.2.1 Definición de clases
Python proporciona el mecanismo para definir una clase utilizando la palabra clave 
class con la sintaxis de 'class className:', por ejemplo, 'class Point:', 'class Polyline:' 
o 'class Polygon:'. Los atributos y métodos se pueden definir para una clase usando 
la palabra clave 'def'.Figura 2.2muestra el código de Python para definir una clase 
Point con los atributos name, x, y definidos y el método setName() definido. En el 
método __init__, se pasó "0, 0" como valor para x, y y nombre.
Muchas clases definen un método especial llamado __init__() para crear/construir 
objetos. El método será llamado cuando creamos un objeto usando la clase
* http://www.esri.com/software/arcgis.
http://www.esri.com/software/arcgis
www.eclipse.com
22Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
Colón para la inauguración del
cuerpo de clase
palabra clave para
definir todas las clases
Nombre de esta clase
Función de inicio Colón para la apertura
del cuerpo del método
el primer argumento
siempre es uno mismo
Palabra clave utilizada para
definir función
El valor predeterminado para
argumento xEl segundo
el nombre del argumento es x
nombre del método
Asignar valor
Punto solía llamar
el atributo
FIGURA 2.2
Un ejemplo de definición de una clase Point con Python.
(como la clase Point aquí). El método __init__ tiene cuatro '_', dos antes y dos después de 
'init', para convertirlo en el método de construcción que se usará al crear un objeto. Para 
todos los métodos definidos por una clase, el primer parámetro siempre es 'self', que se 
refiere al objeto mismo. Esto se puede utilizar para referirse a los atributos y métodos de 
los objetos. Por ejemplo, el método __init__ creará un objeto de punto con self como el 
primer parámetro y valores iniciales de nombre x, y para el objeto. De forma 
predeterminada (sin especificar los valores), los valores de x, y y el nombre serán 0, 0 y 
una cadena en blanco, respectivamente. Las dos primeras declaraciones del Código 2.1 
crean dos objetos de punto (punto0 y punto1). El objeto point0 se crea con valores 
predeterminados y point1 se crea con argumentos
> > > clasePunto:
definitivamente__en eso__(yo, x=0, y=0, nombre=''):
self.x = x
self.y = y
self.nombre = nombre
definitivamenteescoger un nombre(yo, nombre):
self.nombre = nombre
> > > punto0 = Punto()
> > > punto1 = Punto(1,1,'primer punto')
> > > punto0.x, punto0.y, punto0.nombre (0, 
0, '')
> > > punto1.x, punto1.y, punto1.nombre (1, 
1, 'primer punto')
> > > punto1.establecerNombre('segundo punto')
> > > punto1.nombre 
'segundo punto'
> > >
CÓDIGO 2.1
Crear un punto puede pasarle valor al objeto a través de parámetros.
Programación orientada a objetos 23
de 1, 1 y 'primer punto'. Si no se proporcionan parámetros al crear el punto 0, se 
utilizarán los valores predeterminados 0, 0 y ' '. Cuando los valores (1, 1, 'primer 
punto') reciben parámetros, el método __init__ asignará los valores pasados a los 
atributos del punto1.
2.2.2 Generación de objetos
Para crear un objeto, escribanombre del objeto=nombre de la clase()con ninguno o 
múltiples parámetros, que se pasarán a los atributos declarados en los métodos __init__().
nombre del objeto=className(valor1,valor2,…)
En Code 2.1, generamos dos objetos, point0 y point1. Al declarar el objeto point0, no se 
pasa ningún parámetro mientras que se utilizan tres valores (1, 1, 'primer punto') para 
generar point1.
Para referirnos al atributo o método de un objeto, comenzamos con elnombre del objeto, 
seguido de un punto y luego finaliza con el nombre del atributo o el nombre del método.
nombre_objeto.nombre_atributo 
nombre_objeto.nombre_método()
El código 2.1 usa .x, .y y .name después de los objetos point0 y point1 para 
referirse a los atributos x, y y name. La instrucciónpunto1.establecerNombre()se 
llama para cambiar el nombre del punto 1 a 'segundo punto'.
2.2.3 Atributos
Cada clase puede tener uno o más atributos. La Sección 1.4 explica cómo los atributos 
pueden ser públicos, privados o protegidos para indicar una accesibilidad diferente por 
parte de otros objetos. ¿Cómo se especifican explícitamente los atributos públicos y 
privados al declarar una clase?
• Público:Los atributos en Python son, por defecto, "públicos" todo el tiempo.
• Privado:Atributos que comienzan con un doble guión bajo (“_”). Estos atributos 
se pueden proteger como privados porque no se puede acceder a ellos 
directamente. Sin embargo, se puede acceder a ellos porobjeto._ClassName 
_attributeName, por ejemplo, test._Test_foobar, donde test es un objeto de la 
clase Test y _foobar es un atributo privado (Código 2.2).
• Proteger:Prefijo de atributos con un solo guión bajo "_" por convención. Sin 
embargo, aún se puede acceder a ellos fuera de la clase en Python.
Otro atributo importante en Python es el atributo estático, que se utiliza para 
almacenar datos persistentes e independientes de cualquier objeto de la clase.
24Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > clasePrueba:
definitivamente__en eso__(uno mismo):
self.__foobar ="atr privado" self.foobar 
="atractivo publico"
> > > prueba = prueba()
> > > prueba.foobar 
'atr público'
> > > prueba.__foobar
Rastreo (llamadas recientes más última):
Archivo "<pyshell#23>", línea 1, en <módulo>
prueba.__foobar
AttributeError: la instancia de prueba no tiene el atributo '__foobar'
> > > prueba._Test__foobar 
'atr privado'
> > >
CÓDIGO 2.2
Declare los atributos public, private y protect.
(Código 2.3). Por ejemplo, podemos crear un mapa que incluya diferentes capas, y la escala de 
la capa puede ser estática y la misma para todos los objetos de la capa.
Una clase (y un objeto instanciado) puede tener atributos integrados especiales. Los 
atributos de clase especiales incluyen un nombre de clase y una descripción de la clase 
(Código 2.4).
> > > clasePrueba: versión 
= 1.0
> > > Versión de prueba
1.0
> > > t1 = Prueba()
> > > t2 = Prueba()
> > > versión t1
1.0
> > > versión t2
1.0
> > > Prueba.versión = 2.0
> > > versión t1
2.0
> > > versión t2
2.0
> > > t1.versión = 3.0
> > > versión t1
3.0
> > > Versión de prueba
2.0
> > > versión t2
2.0
> > >
CÓDIGO 2.3
Declarar atributos estáticos.
Traducido del inglés al español - www.onlinedoctranslator.comhttps://www.onlinedoctranslator.com/es/?utm_source=onlinedoctranslator&utm_medium=pdf&utm_campaign=attribution
Programación orientada a objetos 25
> > > clasePunto:
"""Definición de clase de punto""" 
definitivamente__en eso__(uno mismo):
self.x = 0.0
self.y = 0.0
definitivamenteobtenerDistancia():
pasar## ignorar aquí
> > > Punto.__nombre__ 
'Punto'
> > > Punto.__doc__ 'Definición 
de clase de punto'
> > > Punto.__módulo__ 
'__principal__'
> > >
CÓDIGO 2.4
Atributos de clase especiales.
> > > p1 = Punto()
> > > p1.__clase__
<clase __principal__.Punto en 0x02A100D8>
> > > p1.__dict__ {'y': 0.0, 'x': 
0.0}
> > >
CÓDIGO 2.5
Atributos de objetos especiales.
• _name_: nombre de la clase
• _doc_: descripción
• _bases_: clases padres
• _dict_: atributos
• _module_: módulo donde se define la clase
Los atributos de objetos especiales incluyen un nombre de clase y los atributos de un objeto 
(Código 2.5).
• _class_: clase desde la que se instancia el objeto
• _dict_: atributos del objeto
2.2.4 Herencia
Capítulo 1introduce tres relaciones importantes entre objetos en la programación 
orientada a objetos: herencia, encapsulación y polimorfismo. La herencia es una 
forma eficiente de ayudar a reutilizar una clase desarrollada. Si bien los atributos y 
métodos privados no se pueden heredar, las subclases pueden heredar 
automáticamente todos los demás atributos y métodos públicos y protegidos.
26Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 2.3
Un ejemplo de herencia (Estacionamientola clase hereda de la clasePolígono, yPolígonohereda 
deRasgo).
Para heredar una superclase en Python, incluya el nombre de la superclase entre paréntesis 
después del nombre de la clase.
class NombreDeClaseDerivada(SuperClase1)
También podemos heredar varias clases en Python ingresando más de un nombre 
de clase entre paréntesis.
class NombreDeClaseDerivada(SuperClase1, SuperClase2, SuperClase3)
Figura 2.3muestra un ejemplo de herencia. Suponiendo que tenemos una 
clase Rasgo, que incluye un métododibujar(), entonces la clase Polygon 
heredará de la claseRasgo. Con esta herencia, la clase Polygon tendrá el 
métododibujar() también. Cuando definimos laEstacionamientoclase con la 
herencia delPolígono, laEstacionamientotendrá atributos de coordenadas x e y 
así como el métododibujar(). losPolígonoyEstacionamientopuede tener 
diferentes implementaciones de dibujo; sin embargo, puede utilizar eldibujar() 
función tanto para elPolígonoyEstacionamiento. Este método particular que usa 
diferentes implementaciones para diferentes subclases se llama polimorfismo.
2.2.5 Composición
La composición es una forma eficiente de ayudarnos a reutilizar los objetos creados 
y de mantener la relación de parte a todo entre los objetos. para mantener el
Programación orientada a objetos 27
FIGURA 2.4
Ejemplo de composición (unPolígonola clase incluye puntos de atributo como objetos generados a partir de la clase 
Punto).
relación de composición, debe definir una clase con un atributo que puede 
incluir una serie de otros objetos de clase.
Figura 2.4muestra un ejemplo de composición. La clasePuntoy la clase Polígono
heredar de la claseRasgo. La clasePolígonoEl borde está definido por una secuencia 
de puntos formados en un anillo y es capturado por atributos de puntos. Las 
coordenadas de los puntos se mantienen en los objetos de punto. Esto no sólo 
muestra cómo unPolígonoobjeto requiere un número dePuntoobjetos, sino también 
la relación de composición entrePuntoyPolígono.
2.3 Punto, polilínea y polígono
En GIS, existen tres tipos básicos de datos vectoriales, que incluyen Punto, Polilínea y Polígono 
(Chang 2006). Podemos abstraer esas características y definir una clase para que cada una de 
ellas sea reutilizada. También podemos definir una clase de entidad como una superclase para 
punto, polilínea y polígono. Los siguientes son ejemplos de las cuatro clases:
• Rasgo:Normalmente, unRasgoclase (Figura 2.5) tiene un nombre para mantener el 
nombre de la función y un métododibujar() para dibujar la característica en un mapa. 
El método de dibujo debe incluir al menos dos parámetros, self y map. Uno mismo se 
refiere al objeto que accede a los datos del objeto de función mientras se dibuja, 
mientras que un mapa se refiere al fondo sobre el que dibujaremos la función.
28Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 2.5
Diseño UML paraRasgoclase para definir atributos comunes y métodos dePunto,Polilínea, y 
Polígono.
> > > claseRasgo:
definitivamente__en eso__(yo, nombre =''):
self.nombre = nombre
definitivamentedibujar(uno mismo,mapa):
pasar
> > >
CÓDIGO 2.6
Defina una clase de entidad como una superclase para punto, polilínea y polígono.
FIGURA 2.6
Diseño UML paraPuntoclase para mantener los datos vectoriales de puntos.
Por ejemplo, el Código 2.6 es un ejemplo de definiciónRasgocomo una clase 
en Python:
• Punto:Una clase de punto (Figura 2.6) debe tener al menos dos atributos 
espaciales, x e y, para representar las coordenadas de un punto. Otro 
atributo no espacial podría incluir el nombre. Una clase Point también 
podría usar CalDis() para calcular la distancia entre dos puntos. El 
argumento de laCalDisEl método es el objeto de punto actual "yo" y otro 
objeto de punto "punto". El valor devuelto para la distancia entre dos 
puntos se designa como flotante.
Por ejemplo, Code 2.7 es un ejemplo de definición de Point como una clase en 
Python:
Después de declarar una clase Point, podemos iniciar objetos. Por 
ejemplo, podemos llenar dos puntos con datos (1, 2), (2, 2) y luego calcular 
la distancia entre los dos puntos (Código 2.8).
• Polilínea:Definir una clase de polilínea requiere diferentes atributos para 
mantener los datos de polilíneas y métodos por polilíneas. Por ejemplo, se 
pueden usar dos listas de coordenadas x, y o una lista de puntos para mantener
Programación orientada a objetos 29
> > > importarMatemáticas
> > > clasePunto(Rasgo):
definitivamente__en eso__(uno mismo, x = 0.0, y = 0.0):
self.x = x
self.y = y
definitivamenteCalDis(yo, punto):
devolvermath.sqrt((self.x-point.x)**2+(self.y-point.y)**2)
> > >
CÓDIGO 2.7
Defina una clase Point en Python.
> > > p1 = Punto(1,2)
> > > p2 = Punto(2,2)
> > > p1.calDis(p2)
1.0
> > >
CÓDIGO 2.8
Calcula la distancia entre (1, 2) y (2, 2).
las coordenadas x, y dependiendo del diseño. Para fines orientados a objetos, 
podemos usar el segundo enfoque (Figura 2.7a). Para un mejor rendimiento del 
sistema, los puntos de datos en polilíneas son diferentes de los objetos reales 
en GIS, por lo que usamos el primer enfoque (Figura 2.7b).
• Polígono:APolígonoclase (Figura 2.8) podría tener un atributo, "puntos", para 
representar la lista de todos los puntos usados para definir el borde o dos 
listas: las coordenadas x e y para todos esos puntos. APolígono la clase también 
puede tener un métodoobtenerLongitud() para calcular el borde
(a) (b)
FIGURA 2.7
(a) La clase UML Polyline usa la lista de objetos de puntos para mantener las coordenadas de las polilíneas. (b) La clase Polilíneas de UML utiliza 
listas x e y para mantener los datos de las coordenadas de las polilíneas.
FIGURA 2.8
Diseño UML paraPolígonoclase para mantener los datos vectoriales de polígonos.
30Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > # importar módulo matemático desde Python
> > > importarMatemáticas
> > > clasePolilínea(Rasgo):
# Método de inicio para un objeto de polilínea 
definitivamente__en eso__(uno mismo, puntos = []):
self.puntos = puntos
# Un método para establecer puntos 
definitivamentepuntos de ajuste(yo, puntos):
self.puntos = puntos
# Un método para obtener la longitud del objeto polilínea definitivamente
obtenerLongitud(uno mismo):
longitud = 0,0
porienrango(Len(puntos.propios)-1):
longitud+=math.sqrt((puntos[i].x-puntos[i+1].x)**2+
(puntos[i].y-puntos[i+1].y)**2)
devolverlongitud
> > >
CÓDIGO 2.9
Una clase Polyline tiene un atributo (puntos),dos métodos (puntos de ajuste(), yobtenerLongitud()).
longitud del polígono sin argumentos. El valor devuelto para la longitud del 
borde del polígono se designa como flotante.
2.4 Experiencia práctica con Python
El Código 2.9 define una clase de polilínea y crea un objeto de polilínea. Escriba 
el ejemplo en su computadora y describa qué define cada línea y por qué se 
incluye en el código.
2.5 Resumen del capítulo
Este capítulo trata sobre la programación orientada a objetos y sobre cómo 
programar objetos, clases y relaciones. Después de leer, debería poder 
hacer lo siguiente:
• Comprender la programación orientada a objetos usando Python.
• Definir una clase y saber cómo crear objetos usando Punto, Polilínea y 
Polígono.
• Practica heredar superclases.
• Saber reutilizar el código y sus funciones necesarias.
Programación orientada a objetos 31
PROBLEMAS
1. Elija tres puntos, por ejemplo, (1, 100), (25, 60) y (1, 1). ¿Podrías formar 
una polilínea o polígono usando estos tres puntos?
2. Cree un algoritmo para calcular la distancia entre dos puntos, por 
ejemplo, (x1, y1), (X2, y2).
3. Lea el Tutorial de Python 6.2 y 6.3. (Utilice la ventana de línea de comandos de 
Python para 6.2).
4. Definir y programar tres clases paraPunto,Polilínea, yPolígono.
5. Agregue el cálculo de distancia entre cada dos puntos y programe para 
calcular la distancia entre los tres puntos dados.
6. Agrega elobtenerLongitud() método enPolilíneayPolígono; crea una 
polilínea y un polígono usando los tres puntos dados; calcular la longitud 
de la polilínea y el perímetro del polígono.
http://taylorandfrancis.com
Sección II
Programación Python
http://taylorandfrancis.com
3
Introducción a Python
Aprender un lenguaje de programación es un viaje práctico y progresivo. 
Comenzará con lo básico y aumentará gradualmente sus habilidades en la 
codificación compleja. Este capítulo presentará los componentes fundamentales de 
Python, incluidas clases y objetos, sintaxis, tipos de datos, operadores, funciones, 
control de flujo, excepciones, entrada/salida y módulos. Varias bibliotecas están 
disponibles para desarrollo específico, incluidas interfaces gráficas de usuario, bases 
de datos, Internet y programación web. Para facilitar el proceso de aprendizaje, 
utilizará su comprensión de GIS para comenzar a crear un paquete mini-GIS 
mientras aprende el lenguaje de programación.
3.1 Soporte orientado a objetos
Una de las características más importantes de Python es la estructura orientada a 
objetos. La programación fundamental de Python requiere la comprensión de conceptos 
sobre clases y objetos, herencia, composición, paquetes y uso compartido de clases. 
Python proporciona el mecanismo para definir una clase y crear objetos a partir de esa 
clase.
Las clases y los objetos son ampliamente utilizados en Python. Los objetos son 
instancias de clases. Los objetos tienen atributos y métodos. Dot(.) se refiere a los 
atributos y métodos de un objeto. EnCapitulo 2, este libro definióPuntoclase y 
creadop1como objeto puntual. Puedes usarp1.xyp1.calDis() para llamar al atributo y 
método del objeto. La herencia le ayuda a reutilizar los atributos y métodos de una 
clase (superclase) mediante el uso de la superclase para definir nuevas clases en el 
formato 'clase subclase (superclase)'. Todos los atributos y métodos públicos y 
protegidos son heredados por las subclases automáticamente. Los atributos y 
métodos privados no se heredarán. Por ejemplo, tres clases de vectores (Punto,
Polilínea, yPolígono) se definen al heredar el método de la clase Featuredibujar() 
como se detalla enCapitulo 2. La composición ayuda a mantener la relación parte-
todo, donde un objeto de una clase incluye objetos de otras clases. Python usa la 
referencia a objetos para implementar la relación de composición. Como se discutió 
en Capitulo 2, se utiliza una lista de puntos para mantener las coordenadas de un 
borde de polilínea o polígono.
Cuando se desarrollan clases y métodos para software, las clases/métodos 
similares se agrupan en el mismo módulo para facilitar la organización. Así que todo
35
36Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
Las clases de datos GIS se pueden poner en un gran módulo. Los submódulos incluyen clases/
métodos para tipos de datos vectoriales, ráster y especiales. Si otras clases necesitan acceder a 
las clases/métodos en un módulo, primero se debe importar el módulo. Por ejemplo, el módulo 
matemático en Code 2.5 y Code 2.6 se importa para acceder a todos los métodos matemáticos 
(p. ej., math.sqrt).
3.2 Sintaxis
3.2.1 Sensibilidad a mayúsculas y minúsculas
pitón esdistingue mayúsculas y minúsculas, lo que significa que las letras mayúsculas y 
minúsculas representan identificadores diferentes. Puede definir una variable myList con 
mayúsculasLy almacene la lista de elementos "1, 2, 3 y 4". Si obtiene el primer valor de la lista 
usando mi lista[0]con minúsculasyo, verás unError de nombre, lo que demuestra quemi lista no 
está definido porque definiste myList usando una L mayúscula (Código 3.1).
3.2.2 Caracteres especiales
Python tiene una lista de caracteres especiales con significados especiales.Tabla 3.1
enumera algunos caracteres especiales comunes y sus respectivas funciones.
3.2.3 Sangría
En Python, la sangría es importante para agrupar código. Las líneas sangradas comienzan en 
diferentes posiciones o columnas; los números no están permitidos, desencadenarán unError 
de sangría.Puede usar un número diferente de espacios o columnas para sangrar diferentes 
niveles de declaraciones; sin embargo, se recomiendan 4 u 8 espacios. Por lo tanto,espacio y 
pestañasdesempeñan un papel importante en la organización de los códigos. Los diferentes 
editores de programas (p. ej., la línea de comandos y la GUI de Python) usan "pestaña" de 
diferentes maneras. Dependiendo de su editor de texto, puede representar diferentes números 
de espacios.
> > > miLista = [1,2,3,4]
> > > miLista[0]
1
> > > mi lista[0]
Rastreo (llamadas recientes más última):
Archivo "<pyshell#2>", línea 1, en <módulo>
mi lista[0]
NameError: el nombre 'mylist' no está definido
> > >
CÓDIGO 3.1
Distingue mayúsculas y minúsculas.
Introducción a Python 37
TABLA 3.1
Caracteres especiales en Python
simbolos
\
Función Ejemplo
Caracteres de escape que tienen un
significado especial
> > > impresión''prueba'' 
prueba
> > > impresión'\'prueba\'' 
'prueba'
> > > impresión'\\prueba' 
\prueba
\norte Nueva línea > > > impresión'primera línea\nsegunda línea' 
primera linea
segunda linea
\t Pestaña > > > impresión'str1\tstr2' str1 
str2
: Ir al siguiente nivel de declaraciones > > > clasePolilínea: definitivamente
obtenerLongitud():
pasar
#
;
Indicar comentarios de Python > > > # este es un comentario
Unir varias declaraciones en un
linea sola
> > > importarMatemáticas; x = matemáticas.pow(2,3)
> > > importarmatemática y = matemática.pow(2,3) 
Error de sintaxis: sintaxis invalida
3.2.4 Palabras clave
Las palabras clave, como def y del, son palabras reservadas y no se pueden utilizar para 
ningún otro fin (p. ej., como nombres de variables, clases y objetos); de lo contrario, un
Error de sintaxisocurrirá (Código 3.2).Cuadro 3.2enumera las palabras clave en Python.
> > > x =y
Error de sintaxis: sintaxis invalida
> > >
CÓDIGO 3.2
Ejemplo de SyntaxError de palabras clave.
TABLA 3.2
Palabras clave de Python
y
afirmar
descanso
clase
Seguir
Def
Supr
elif
más
excepto
ejecutivo
finalmente
por
de
global
si
importar
en
es
lambda
no
o
pasar
impresión
elevar
devolver
probar
tiempo
38Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > un = segundo = c = 0
> > > a1,b1,c1= 1, 1.0,'c1'
> > > (a1,b1,c1)=(2, 2.0,'c2')
> > > (a2,b2,c2)=(2, 2.0,'c2')
> > > un, segundo, c, a1, b1, c1, a2, b2, c2 (0, 0, 0, 
2, 2.0, 'c2', 2, 2.0, 'c2')
> > >
CÓDIGO 3.3
Múltiples asignaciones.
3.2.5 Asignaciones Múltiples
Las asignaciones múltiples son útiles para declarar variablessimultáneamente.
En Código 3.3,
• La primera línea de código asigna el mismo valor a múltiples variables 
usando “a=b=C=valor.”
• La segunda y tercera líneas de código asignan diferentes valores a 
diferentes variables usando "a1, b1, c1 = v1, v2, v3" o "(a2, b2, c2) = (v1, 
v2, v3)".
3.2.6 Espacio de nombres
un espacio de nombreses un lugar en el que reside un nombre. Las variables dentro de un espacio de nombres son 
distintas de las variables que tienen los mismos nombres pero se encuentran fuera del espacio de nombres. Es muy 
fácil confundir nombres en diferentes espacios de nombres. La estratificación del espacio de nombres se denomina 
alcance. Un nombre se coloca dentro de un espacio de nombres cuando a ese nombre se le asigna un valor. Usar
directoriopara mostrar los nombres disponibles dentro de un espacio de nombres indicado. Por ejemplo,directorio() 
puede encontrar nombres de espacios de nombres actuales,directorio(sistema)
Espacio de nombres incorporado
(nombres integrados, como int()) Más exterior
alcance
Espacio de nombres global
(nombres globales) Global
alcance
Espacio de nombres local
(nombres locales) Local
alcance
FIGURA 3.1
Jerarquía de espacios de nombres.
Introducción a Python 39
encontrará todos los nombres disponibles desistema, ydirectorio(Matemáticas) encontrará todos los nombres 
disponibles deMatemáticas. Un programa típicamente incluye tres capas de alcance (Figura 3.1):
• La capa superior es un espacio de nombres integrado en el sistema, que incluye 
nombres definidos dentro de Python mismo; siempre están disponibles en su 
entorno de programación.
• La capa intermedia es un espacio de nombres global definido dentro de un archivo o módulo.
• La capa inferior es el espacio de nombres local, que incluye nombres definidos dentro 
de una función o un método de clase.
3.2.7 Alcance
Alcancese refiere a una parte del código y se utiliza para identificar la eficacia de las 
variables. El alcance es importante en funciones, módulos, clases, objetos y datos 
devueltos. Los módulos con función y datos actúan de forma similar a los objetos. 
Por ejemplo, al definirPuntoclase, usop1como una variable dentro de la CalDis() 
función de la clase; o usarp1para hacer referencia a un objeto más tarde al crear un 
objeto de punto. El primerop1sólo es eficaz en el ámbito de laPuntoclase' CalDis() 
función. El segundop1solo es efectivo al mismo nivel que el programa general sin 
sangría.
Las variables pueden ser locales o globales:
• Las variables locales se declaran dentro de una función y solo son accesibles 
dentro de la función. Una vez que se ejecuta la función, la variable quedará 
fuera del alcance.
• Las variables globales no son locales y se puede acceder a ellas dentro o fuera de las 
funciones.
En el ejemplo deFigura 3.2, global_x es una variable global y local_y es una 
variable local. Si usa la variable local_y fuera de la función, obtendrá un error. Para 
obtener más información sobre los espacios de nombres y el alcance, consulte 
Raschka (2014).
FIGURA 3.2
Variables locales y globales.
40Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
3.3 Tipos de datos
en pitón,tipos de datosson dinámicos para que no tenga que definir el tipo de datos 
de una variable. El tipo de variable se asignará cuando se asigne un valor. El cambio 
en los valores cambiará el tipo de variables. Hay dos categorías de tipos de datos: 
tipos de datos básicos (entero, flotante, largo, complejo, cadenas, tipo y función) y 
tipos de datos compuestos (listas, tuplas y diccionarios).
3.3.1 Tipos de datos básicos
Los tipos de datos básicos incluyen categorías de números y cadenas. La categoría de 
números incluye enteros, enteros largos y flotantes (Cuadro 3.3).
• Enteros
Los números enteros son equivalentes a los números enteros en el lenguaje de programación C. El rango 
de un entero está limitado de la siguiente manera:
− 231∼232(−2147483648∼4294967296)
El valor entero se puede representar en formato decimal, octal y 
hexadecimal. Por ejemplo,010es una representación octal de 8 y
buey80es un hexadecimal de 8.
• Números enteros largos de longitud no limitada
El rango de enteros largos solo está limitado por la memoria de la computadora. Un 
número entero largo se denota agregando una "L" mayúscula o minúscula. También 
se puede representar en formato decimal octal y hexadecimal.
• Flotar
Los números flotantes son equivalentes a los dobles en lenguaje C. Un 
valor flotante se denota con un punto decimal (.) en el lugar apropiado y
CUADRO 3.3
Tipos de datos básicos
Variable básica
Tipos
Conversión
(Encasillar)Rango
− 231∼232
Descripción Ejemplos
número entero decimales, octales,
y hexadecimal
formato
20, −20, 010,
buey80
int(), por ejemplo, int(2.0),
int('2'), int(2L)
Largo
entero
Limitado solo por
memoria
Denotado por(L)
o(l).
20L, −20L,
010L, buey80L
largo(), por ejemplo,
largo(2), largo('2')
flotar Depende de la máquina
arquitectura y
intérprete de pitón
denotado por un
punto decimal(.)
0,0, −77,0, 1,6,
2.3e25, 4.3e-2
float(), por ejemplo,
flotar(2),
Cuerda N / A Denotado por(''),
(“”)
'prueba prueba" str(), por ejemplo, str(2.0)
Introducción a Python 41
> > > x =En t(2.01)
> > > X
2
> > > flotar(2)
2.0
> > >
CÓDIGO 3.4
Conversión de tipos de datos.
un sufijo "e" opcional (ya sea en minúsculas o mayúsculas) que representa 
la notación científica. La precisión, o el rango del flotador, depende de la 
arquitectura de una máquina, así como del intérprete de Python utilizado.
• Conversión de números
losint(), largo(), flotante()Las funciones integradas se utilizan para convertir de 
cualquier tipo numérico a otro (Código 3.4).
Puntas
Encasillar:Convierta datos de un tipo a otro, por ejemplo, flotante ('3.14'), que convierte 
un tipo de datos de cadena en flotante.
La asignación de tipo conversado puede resultar en una pérdida de precisión, por ejemplo
y = 3.14
x = int(y)
donde x perderá los valores de precisión y tendrá como resultado un valor de 3.
• Cuerdas
Los datos de cadena se denotan con comillas simples '' o comillas dobles "".
• Otros tipos incorporados
Hay varios otros tipos de datos incorporados, como tipo, Ninguno, función 
y archivo. El código 3.5 ilustra los siguientes tipos:
Tipo de función ()toma un objeto como argumento y devuelve el 
tipo de datos del objeto.
Ningunaes el objeto nulo y no tiene atributo.
boolobjeto tiene dos valores potenciales:VerdaderoyFalso. Las expresiones 
condicionales darán como resultado un valor booleano comoVerdaderooFalso.
Puntas
A diferencia del lenguaje C o Java, Python no admite los tipos de datos Byte, 
Boolean, Char, Pointer.
42Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > x =escribe(1)
> > > X
<escriba 'int'>
> > > X ==En t
Verdadero
> > > x =escribe(Verdadero)
> > > X
<escriba 'bool'>
> > > X ==En t
Falso
Expresión condicional
> > > escribe(Ninguna) 
<escriba 'NingunoTipo'>
> > >
CÓDIGO 3.5
Tipo de función, tipo Ninguno y tipo bool.
3.3.2 Tipos de datos compuestos
Otra categoría de tipos de datos variables integrados se denomina tipo de datos compuestos (
Tabla 3.4). Los tipos de datos compuestos se ordenan y se puede acceder a ellos 
secuencialmente a través de compensaciones de índice en el conjunto. Este grupo, también 
conocido como secuencias, generalmente incluye listas, tuplas, diccionarios y conjuntos. Una 
lista son diferentes tipos de datos separados por comas y se incluyen en un par de corchetes, 
por ejemplo, [1, 2, 3, 4]. Las tuplas son listas de diferentes tipos de datos, como (1, "los 
primeros productos calificados", "leche") entre paréntesis. Los diccionarios son listas de claves y 
pares de valores, como se muestra en el siguiente ejemplo {'john':'3-1111', 'phil':'3-4742', 
'david':'3-1212'}
• Lista
El tipo de datos compuestos más utilizado e importante eslista, que se 
puede utilizar para agrupar diferentes valores. Usarlistapara mantener una 
serie de puntos, polilíneas y polígonos en programasGIS.
Definir: Se puede crear un objeto de lista a partir de:[v1, v2, v3, ….], donde 
los elementos están entre corchetes (p. ej., como en el Código 3.6).
Operadores:Los tipos de datos compuestos son buenos para expresar operaciones 
complejas en una sola instrucción.Tabla 3.4enumera los operadores comunes compartidos 
por tipos de datos complejos.
• seq[index]: obtiene un valor para un elemento específico. El índice inicial de todos 
los datos de secuencia es 0 y el índice final es uno menos que el número de 
elementosnorteen la secuencia (es decir,norte-1) (Código 3.6a).
CUADRO 3.4
Tipos de datos compuestos y operadores comunes
Envase Definir Rasgo Ejemplos Operadores comunes
Lista
tupla
Delimitado por [ ]; mudable
inmutable
['a B C']
('a B C')
seq[índice],
seq[índice1: índice2],
seq * expr,
seq1 + seq2, obj en 
seq, obj no en seq, 
len(seq) etc.
Denotado por
paréntesis ()
diccionario {clave: valor, clave:
valor , …}
mudable {'Alicia': '7039931234',
'Beth': '7033801235'}
Introducción a Python 43
> > > a = [1,2,3,4]
> > > a
[1, 2, 3, 4]
> > > b = [x*3porXena]
> > > b
[3, 6, 9, 12]
> > > un[0]
1
> > > un[3]
4
> > > un[4]
Rastreo (llamadas recientes más última):
Archivo "<pyshell#27>", línea 1, en <módulo>
un[4]
IndexError: índice de lista fuera de rango
> > > Len(a)
4
> > > un[1:3]
[2, 3]
> > > delun[0]
> > > a
[2, 3, 4]
> > > un*3
[2, 3, 4, 2, 3, 4, 2, 3, 4]
> > > a+b
[2, 3, 4, 3, 6, 9, 12]
> > > a = [1,4,7,9]
> > > suma= 0
> > > poriena: suma
+=yo
> > > suma
21
> > >
CÓDIGO 3.6
Ejemplo de lista.
Si intenta acceder a un elemento con un índice mayor que el 
número total de elementos, obtendrá unIndexError, lo que indica 
que el índice está fuera de rango (Código 3.6b).
• len[lista]: obtiene la longitud de los elementos (calcula el número total del 
elemento) (Código 3.6c).
> > > a = [1,2,3,4]
> > > un[0]
1
> > > un[3]
4
CÓDIGO 3.6a
Una operación de lista.
44Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > a = [1,2,3,4]
> > > un[4]
Rastreo (llamadas recientes más última):
Archivo "<pyshell#27>", línea 1, en <módulo>
un[4]
IndexError: índice de lista fuera de rango
CÓDIGO 3.6b
Listar operación fuera de rango.
> > > a = [1,2,3,4]
> > > Len(a)
4
CÓDIGO 3.6c
Longitud de la lista.
• seq[index1: index2]: genera una nueva secuencia de tipo de datos con 
elementos secuenciados de index1 a index2 (Código 3.6d).
• delseq[index]: borra los elementos secuenciados comoíndice(Código 3.6e).
• seq * expr (Código 3.6f)
• seq1 + seq2: une dos objetos de secuencia (Código 3.6g)
> > > a = [1,2,3,4]
> > > un[1:3]
[2, 3]
CÓDIGO 3.6d
Subconjunto de una lista.
> > > a = [1,2,3,4]
> > > a
[1, 2, 3, 4]
> > > delun[0]
> > > a
[2, 3, 4]
CÓDIGO 3.6e
Eliminar un elemento de una Lista.
> > > a = [1,2,3,4]
> > > un*3
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
CÓDIGO 3.6f
List multiplica un entero.
Introducción a Python 45
> > > a = [1,2,3,4]
> > > a = [11,12,13,14]
> > > a + b
[1, 2, 3, 4, 11, 12, 13, 14]
CÓDIGO 3.6g
Unión de dos objetos de secuencia.
> > > a = [1,4,7,9]
> > > suma= 0
> > > poriena: suma
+=yo
> > > suma
21
CÓDIGO 3.6h
Bucle cada objeto en los datos complejos.
• obj in seq (obj not in seq): recorre cada objeto en los datos 
complejos y realiza una operación con cada elemento. El ejemplo 
pasa por cada objeto en la lista a, y suma el valor de cada objeto a 
la suma obj (Código 3.6h).
El tipo de datos de cadena también pertenece al tipo de datos de secuencia, y esos 
operadores se pueden aplicar a un objeto de cadena.
Métodos:Como se vio en las clases creadas en los capítulos anteriores, una lista es una clase 
integrada en el sistema. Los objetos creados a partir de la lista tienen muchos métodos. Los 
métodos más importantes incluyenadjuntar(),insertar(),retirar(),estallido(),clasificar(), y reverso()
(Código 3.7).
> > > a = [1,2,3,4]
> > > a.añadir(10)
> > > a
[1, 2, 3, 4, 10]
> > > a.insertar(2,15)
> > > a
[1, 2, 15, 3, 4, 10]
> > > Un estallido()
10
> > > a
[1, 2, 15, 3, 4]
> > > un tipo()
> > > a
[1, 2, 3, 4, 15]
> > >
Agregue el elemento 10 en la última posición
Insertar elemento 15 en la posición de índice
Mostrar el último elemento
ordenar la lista
CÓDIGO 3.7
Lista de métodos.
46Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
Funciones integradas:Hay tres funciones integradas comunes para manejar 
una lista, que son útiles en la programación GIS (Khalid 2016):
• filtrar(función, lista): el filtro se utiliza para extraer una lista de objetivos de la lista original. 
Por ejemplo, puede usar la función de filtro para seleccionar todas las ciudades dentro de 
Virginia, o seleccionar los restaurantes y hoteles dentro de la ciudad de Fairfax.
• mapa(func, list): Map se usa para convertir la lista original en una nueva 
lista usando la función. Por ejemplo, puede convertirlo de grados a metros.
• reducir(func, list): Reduce es otro método útil para problemas GIS del mundo 
real. Para calcular la longitud total de calles o caminos del condado de Fairfax,
reducirpuede invocar una funciónfunciónde forma iterativa sobre cada 
elemento de la lista, devolviendo un solo valor acumulativo.
• Tupla
Similar a las listas,tuplaes otro tipo de datos complejo. Una diferencia obvia 
entre tupla y lista es que se denota mediante el uso de paréntesis. Otra 
diferencia es que el tipo de datos de tupla es inmutable (Tabla 3.4), lo que 
significa que el elemento no se puede modificar una vez definido. Se 
producirá un error si el valor de untuplase modifica el elemento (Código 
3.8).
• Diccionario
Un diccionario es mutable y un tipo de datos de contenedor que puede almacenar 
cualquier objeto de Python, incluidos otros tipos de contenedor. Un diccionario se 
diferencia de los contenedores de tipo secuencia (listas y tuplas) en cómo se almacenan y 
se accede a los datos.
> > > a = [1,2,3,4]
> > > a
[1, 2, 3, 4]
> > > un[0]=5
> > > a
[5, 2, 3, 4]
> > > x = (1,2,3,4)
> > > X
(1, 2, 3, 4)
> > > x[0]=5
Inmutable, no se puede cambiar.
Rastreo (llamadas recientes más última):
Archivo "<pyshell#55>", línea 1, en <módulo>
x[0]=5
TypeError: el objeto 'tuple' no admite la asignación de elementos
> > >
CÓDIGO 3.8
Operación tupla.
Introducción a Python 47
> > > estacionamientos = {'A': [-101.12, 32.13,'estacionamiento A', 
'Estacionamiento general'],'B': [-101.14, 32.56,'estacionamiento B', 'Solo 
cosas'] }
> > > estacionamientos
{'A': [-101.12, 32.13, 'estacionamiento A', 'Estacionamiento 
general'], 'B': [-101.14, 32.56, 'estacionamiento B', 'Solo cosas']}
> > > estacionamientos['A']
[-101.12, 32.13, 'estacionamiento A', 'Estacionamiento general']
> > >
CÓDIGO 3.9
Operación de diccionario.
Definir:La sintaxis utilizada para definir una entrada de diccionario es {clave:valor, clave:valor, …..}, 
donde todos los elementos están encerrados entre llaves. Es conveniente almacenar objetos de 
características espaciales para que cada objeto incluya un ID de objeto único, atributos espaciales 
(coordenadas) y atributos no espaciales (p. ej., Nombre). Donde se pueden usar ID únicos como clave, 
todos los atributos se pueden usar como valor. Las claves son números enteros o cadenas, mientras 
que los valores pueden ser cualquier tipo de datos, comolistaodiccionario(Código 3.9).
En Código 3.9,estacionamientosse declara como un tipo de datos de diccionario que incluye 
dos elementos. La identificación única y la secuencia del estacionamiento 'A' y 'B' se utilizan 
como claves, y la información de atributo de cada clave se mantiene en una lista distinta.
• Establecer
Establecerse utiliza para construir y manipular colecciones desordenadas de 
elementos únicos. Aestablecerel objeto puede ser creado desde {v1, v2, v3,….} 
donde los elementos están rodeados por llaves, o de unconjunto (lista) donde el 
argumento es unlista(Código 3.10).
Operaciones:Set admite varias operaciones (Cuadro 3.5), incluyendo unión (|), 
intersección (&), diferencia (-) y diferencia simétrica (̂ ) (Linuxtopia 2016).
Métodos:Estableceres una clase incorporadadel sistema. Varios métodos importantes 
están respaldados por unestablecerobjeto, incluidos add(), remove() y pop(). También
> > > s = {1,3}
> > > s
conjunto ([1, 3])
> > > a = [2,4,3,1]
> > > s =establecer(a)
> > > s
conjunto ([1, 2, 3, 4])
> > >
CÓDIGO 3.10
Ajuste la operación.
48Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
TABLA 3.5
Operaciones entre dosEstablecerObjetos,syt
Operación
diferencia
Operador
−
Función Uso
Crear un nuevo conjunto con
elementos enspero no ent
intersección & Crear un nuevo conjunto con
elementos comunes a
syt
Obtenga objetos espaciales con ambos
coincidieron las condiciones, como encontrar 
los restaurantes dentro de Fairfax, así como 
con estilo francés
simétrico
diferencia
^ Crear un nuevo conjunto con
elementos en cualquierasot 
pero no ambos
Unión | Crear un nuevo conjunto con
elementos en ambossyt
Combine las ciudades de dos estados para obtener
recopilación
> > > s =establecer(['A B C D'])
> > > t =establecer(['A', 'B', 'E', 'F'])
> > > S t
conjunto (['C', 'D'])
> > > S t
conjunto (['A', 'B'])
> > > Mierda
conjunto (['C', 'E', 'D', 'F'])
> > > mierda
conjunto (['A', 'C', 'B', 'E', 'D', 'F'])
> > > s.diferencia(t) 
conjunto (['C', 'D'])
CÓDIGO 3.11
Establecer operaciones.
admite cuatro métodos: difference(),intersection(), symmetric_difference() y 
union() (Código 3.11).
3.4 Varios
3.4.1 Variables
Una variable es un espacio de memoria reservado para almacenar datos y al que se hace 
referencia por su nombre. Antes de su uso, se debe asignar un valor a una variable. Las 
variables tienen diferentes tipos de valores. Los tipos básicos de valores de variables incluyen 
byte, short, int, long, text, float y double, como se presentó en la Sección 3.4.1. Algunos tipos de 
datos se pueden convertir mediante typecast. Por ejemplo, float(“3.14”) convertirá los textos en 
un número flotante 3.14.
Introducción a Python 49
FIGURA 3.3
Tipo de datos dinámicos.
En Python, los tipos de variables son dinámicos, y el tipo solo se define cuando se 
asigna su valor. Esto significa que una variable puede cambiar a un tipo de datos 
diferente. Por ejemplo (Figura 3.3), x = float(1) asignará x como flotante, pero x = 'x tiene 
un tipo dinámico' cambiará la variable x de un tipo flotante a un tipo de cadena. Aquí, 
usamos 'p1' como un nombre de variable de objeto.
Se requiere un nombre para cada variable. El nombre de la variable debe ser un 
identificador legal, que es una serie de combinación limitada de letras del alfabeto, 
dígitos y guiones bajos. El nombre debe comenzar con un carácter o guión bajo, pero no 
puede comenzar con un dígito. Por lo tanto, 'punto1' es un nombre legal, pero '1punto' es 
ilegal. Además, no se permiten espacios en blanco en el nombre de la variable. Palabras 
reservadas de Python (Cuadro 3.2) no se puede utilizar como nombre de variable.
3.4.2 Estilo de código
Hay varias pautas para el estilo de programación de Python.
Nombres significativos:Utilice nombres significativos para variables, clases y
paquetes Si el significado no está claro, agregue un comentario para identificar 
qué significa el nombre.
Espacio en blanco en expresiones y declaraciones:Siempre rodea
Operadores con un solo espacio a ambos lados.
Sangría:Los códigos sangrados se utilizan para organizar el código, tal como se introdujo
en la Sección 3.2.3.
Comentarios:Los comentarios se utilizan para documentar o explicar el código.
Python admite dos tipos de comentarios:
# comentarios
50Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 3.4
Estilo de codificación.
El compilador ignora todo, desde el#hasta el final de la línea.
línea de comentarios """ 1
línea de comentarios 2
"""
Este estilo de comentario indica cadenas de documentación (también conocidas como "docstrings"). Una 
cadena de documentación es la primera declaración en una definición de módulo, función, clase o método. 
Todos los módulos deben tener cadenas de documentación, y todas las funciones y clases exportadas por un 
módulo deben tener cadenas de documentación (Figura 3.4).
3.5 Operadores
Los operadores incluyen caracteres básicos, división y conversión de tipos, 
módulo, negación, asignación aumentada y operaciones booleanas. Estos 
operadores se clasifican en varios tipos:
• Operadores aritméticos (Tabla 3.6)
• Operadores bit a bit y de desplazamiento (Tabla 3.7): Los operadores Bitwise&Shift 
pueden ser muy complejos. Debe comprenderse una idea general acerca de estos 
operadores y este libro utilizará la representación de datos binarios.
• Operadores de Asignación (Cuadro 3.8): Los operadores de asignación se utilizan 
para asignar valores a las variables. La asignación más común utiliza el símbolo 
“=”. Un ejemplo es a = b, lo que significa asignar el valor b a la variable a. Las 
asignaciones pueden integrar operadores aritméticos y Bitwise&Shift, lo que 
genera asignaciones complejas como “+=” (Agregar AND) (Código 3.12).
Introducción a Python 51
TABLA 3.6
Operadores aritméticos (Asumir variableaCapacidad para 5 y VariablebSostiene 2)
Operadores aritméticos
+
Descripción Ejemplo
Suma > > >a + b
7
− Sustracción > > > un - segundo
3
* Multiplicación > > > un * segundo
10
/ División > > >un/b
2.5
* * Exponenciación: Realiza exponencial (potencia)
cálculo de operadores
> > > un ** segundo
25
% Módulo: divide el operando de la izquierda por el de la derecha
operando y devuelve el resto
> > > un % segundo
1
// División de piso: La división de operandos donde el
resultado es el cociente en el que se eliminan los dígitos 
después del punto decimal
> > > un // segundo
2
> > >5.0 // 2.0
2.0
• Operadores de comparación (Tabla 3.9): Los operadores de comparación se 
utilizan para comparar dos variables u objetos, para comprobar si son iguales o 
diferentes.
• Operadores Lógicos (Tabla 3.10): Los operadores lógicos se utilizan junto con si, de lo 
contrario, mientraspalabras clave para crear sentencias de control lógico (Sección 
3.4). Las declaraciones con operadores lógicos son verdaderas o falsas. El código 3.13 
muestra un ejemplo.
TABLA 3.7
Operadores bit a bit y de desplazamiento (asumir variableaCapacidad para 5 y VariablebSostiene 2)
Artículo
> >
Descripción Ejemplo
Operador binario de desplazamiento a la derecha. El valor del operando izquierdo se mueve
derecho por el número de bits especificado por el operando derecho.
a >> b dará 1,
que es 0000 0001
<< Operador binario de desplazamiento a la izquierda. El valor del operando izquierdo se mueve
izquierda por el número de bits especificado por el operando derecho.
a << b dará 20,
que es 0001 0100
& El operador AND binario copia un bit al resultado si existe en
ambos operandos.
a & b darán 0,
que es 0000 0000
| El operador OR binario copia un bit si existe en cualquiera de los operandos. un | b dará 7,
que es 0000 0111
^ El operador binario XOR copia el bit si está configurado en un operando
pero no ambos.
a ^ b dará 7,
que es 0000 0111
52Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
TABLA 3.8
Operadores de asignación (asumir variableaCapacidad para 5 y Variableb 
Sostiene 2)
Asignación
Operadores Nombre Cómo utilizar Equivalente Resultado
=
+ =
− =
* =
/=
%=
* * =
|=
^=
<<=
> > =
Asignación igual
Añadir Y
Restar Y
Multiplica Y
Dividir Y
Módulo Y
Exponente Y
Binario O Y
Binario XOR Y
Desplazamiento a la izquierda Y
Desplazamiento a la derecha Y
un = segundo
a+ = segundo
a− = segundo
a* = segundo
un/ = segundo
un % = segundo
un ** = segundo
un| = segundo
un = segundo
un<< = segundo
a>> = b
Establecer a como b
a = a+b
un = un - segundo
un = un * segundo
a = a/b
a = a % b
a = a ** b
un = un | b
un = un ^ segundo
a = a << b
a = a>>b
2
7
3
10
2
1
25
7
7
20
1
> > > b=3
> > > a=b
> > > a
3
> > > a+=b
> > > a
6
CÓDIGO 3.12
Añadir Y ejemplo.
TABLA 3.9
Operadores de comparación (asumir variableaCapacidad para 5 y VariablebSostiene 2)
Comparación
Operadores Cómo utilizar Comparar(o comprobar) Resultados
= =
<
>
> =
<=
!=
es
no es
en
no en
un = = segundo
un < segundo
a > b
un > = segundo
un <= segundo
un != segundo
a es b
a no es b
a en el rango (b)
a no está en el rango (b)
a es igual a b
a es menor que ba 
es mayor que b
a es mayor o igual que ba es 
menor o igual que ba no es 
igual a b
a y b son el mismo objeto a y b 
son objetos diferentes a es 
miembro de [1, 2, …,b] a no es 
miembro de [1, 2, …,b]
(a == b) no es cierto. (a 
< b) no es cierto. (a > b) 
es verdadera.
(a >= b) es verdadera. (a 
<= b) no es cierto. (a != b) 
es verdadera.
(a es b) no es cierto. (a 
no es b) es verdadera.
(a en el rango (b)) no es cierto. (a no 
está en el rango (b)) es verdadero.
Introducción a Python 53
TABLA 3.10
Operadores lógicos (asumir variableaSe mantiene verdadero y variablebSe mantiene cierto)
Operadores Lógicos
Y
Cómo utilizar Resultados
(a y b) es verdadera.Operador lógico AND. Si ambos operandos son
verdadero, entonces la condición se vuelve verdadera.
O Operador lógico OR. Si cualquiera de los dos operandos
son distintos de cero, entonces la condición se vuelve verdadera.
(a o b) es verdadera.
No Operador lógico NOT. Úselo para invertir la lógica.
estado de su operando. Si una condición es 
verdadera, el operador Lógico NO la hará falsa.
No (a y b) es falso.
x =En t(Datos crudos('Ingrese su entrada para x: ')) y =En t(
Datos crudos('Ingrese su entrada para y: ')) six>5yy > 5:
impresión'tanto x como y son mayores que 5' siX 
> 5oy > 5:
impresión'ya sea x o y es mayor que 5' x > y:
impresión'x es más grande que y' 
nox > y:
impresión'x es más pequeño que y'
si
si
CÓDIGO 3.13
Operaciones lógicas.
3.6 Declaraciones
Una declaración es una combinación de variables y operadores. La declaración debe 
cumplir con el uso del operador. Si asigna un valor, debe usar el operador de 
asignación. Si accidentalmente usa operadores de comparación, debe esperar un 
error. Preste atención a la precisión de la declaración. Por ejemplo (Código 3.14), la 
primera y la segunda i parecen estar asignadas con valores similares usando 
operaciones idénticas de división y suma. Sin embargo, generan resultados 
diferentes.
> > > yo = 1/2+1/2
> > > i
0
> > > yo = 1,0/2 + 1,0/2
> > > i
1.0
> > >
CÓDIGO 3.14
Ejemplos de declaraciones.
54Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
3.7 Funciones
Las funciones están definidas por la palabra clavedefinitivamenteseguido del nombre de la 
función con varios argumentos de entrada. Similar a los métodos definidos dentro de una clase, 
la cantidad de argumentos puede ser de cero a muchos. Los métodos de clase son funciones 
especiales con el primer argumento como 'self'.
def funcName(arg1, arg2, …): 
Bloques de instrucciones
Una función se define mediante un nombre de función y otros argumentos de entrada 
necesarios, como funcName(arg1, arg2, …). Los argumentos pasados a una función al 
llamar a una función deben coincidir con lo declarado. Una función puede devolver 
ninguno, uno o más argumentos (Código 3.15).
Cuando declara argumentos predeterminados para métodos de clase (Sección 2.1), también 
puede configurar valores predeterminados para argumentos de función y hacer que esos 
argumentos sean opcionales para la persona que llama. El ejemplo (Código 3.16) muestra cómo 
calcular la función de costo (calCost) y taxRate como argumento predeterminado. Por lo tanto, 
cuando la función calCost se configura con el parámetro 100, la variable taxRate usa 0.05 como 
su valor.
Puntas
Use la palabra clave lambda para declarar una versión de una línea de una función. 
Por lo general, estas funciones son anónimas porque no están definidas de manera 
estándar. El cuerpo de la declaración de la función lambda se debe dar en la misma 
línea, como en la función add() (Código 3.17).
> > > # No devuelves nada
> > > definitivamenteHola():
impresión'¡Hola Mundo!'
> > > hola = hola() 
¡Hola Mundo!
> > > impresiónhola
Ninguna
> > > # Devuelve un valor
> > > definitivamenteagregar
(x,y): devolverx+y
> > > z = suma(1,2)
> > > impresiónz
3
> > >
CÓDIGO 3.15
Valor de retorno de una función.
Introducción a Python 55
> > > # Argumentos predeterminados
> > > definitivamentecostocal(precio, tasa de impuestos = 0.05): 
devolverprecio + precio*tasa de impuestos
> > > costocal(100)
105.0
> > > costocal(100,0.075)
107.5
> > >
CÓDIGO 3.16
Argumentos predeterminados.
> > > definitivamenteagregar
(x,y): devolverx+y
> > > sumar(1,2)
3
> > > un =lambdax,y:x+y
> > > b = a(1,2)
> > > impresiónb
3
CÓDIGO 3.17
ejemplo lambda
El intérprete de Python tiene funciones integradas que siempre están 
disponibles. Se enumeran en orden alfabético enFigura 3.5. Las funciones 
escritas en rojo ya se han introducido. Las funciones escritas en azul son 
importantes y se presentarán en capítulos posteriores.
FIGURA 3.5
Funciones integradas del sistema. (De Python. 2001a. Funciones integradas. https://docs.python.org/3/library/
index.html (consultado el 3 de septiembre de 2016).)
56Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > números =rango(1,101,1)
> > > suma1, suma2, suma3 = 0, 0, 0
> > > poriennúmeros: 
suma1=suma1+i
> > > impresión
suma1 5050
> > > yo = 0
> > > tiempo(i<101): si
(i%2==0):
suma2=suma2+i
i+=1
> > > impresión
suma2 2550
> > > porienrango(100): si
(i%2==1):
suma3+=i
> > > impresión
suma3 2500
> > >
CÓDIGO 3.18
Cálculos sumatorios.
3.8 Experiencia práctica con Python
El programa Python (Código 3.18) calcula la suma de 1 a 100, todos los números 
impares entre 1 y 100 y todos los números pares entre 1 y 100. ¿Puede resolver 
cada uno de esos cálculos? Intente codificar en Python GUI y explique cómo 
funciona cada cálculo y la estructura de los códigos.
3.9 Resumen del capítulo
Este capítulo introduce
• Sintaxis de Python
• Tipos de datos de Python
• Operadores
• Qué es una función y cómo declarar una función
Introducción a Python 57
PROBLEMAS
1. Palabras clave: marque las siguientes palabras clave (Cuadro 3.2.) y explíquelos 
brevemente (conceptos, cuándo/cómo usar palabras clave [use la función help() 
para obtener ayuda sobre cada palabra clave, por ejemplo, help('if')], y diseñe/
programe un ejemplo de cómo usar las palabras clave ). Por ejemplo, palabras 
clave if, elif, else.
una. Explique
if, elif, else son las palabras clave utilizadas para tomar decisiones……
b. Ejemplos (Código 3.19)
2. Operadores: Las cinco categorías de operadores incluyen operadores 
aritméticos, operadores de cambio y bit a bit, operadores de asignación, 
operadores de comparación y operadores lógicos. Para cada par indicado a 
continuación, explique las diferencias entre los dos operadores y luego 
diseñe e ingrese un ejemplo en el intérprete de Python para demostrar la 
diferencia.
una. “+” frente a “+=”
b. “%” frente a “/”
C. “*” frente a “**”
d. “==” frente a “es”
mi. “!=” frente a “no es”
F. “en” vs. “no en”
gramo. “y” contra “o”
H. “no en” vs. “no”
3. Conceptos de clase y objeto
una. Describa brevemente el argumento "self" en el método de clase y proporcione 
un ejemplo.
> > > X = [1,2,3,4,5]
> > > y = 8
> > > z = [6,7,8,9]
> > > siyenX:
impresióny,'es en', X elif
yenz:
impresióny,'está en z', z
más:
impresióny,'no está ni en x ni en z', x, z
8 está en z [6, 7, 8, 9]
> > >
CÓDIGO 3.19
Si…elif…else ejemplo.
58Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
b. Diseñe una clase simple que incluya al menos un atributo estático, uno 
privado, uno protegido y uno público (que también podría ser un 
método).
C. Cree un objeto y luego acceda e imprima esos atributos.
4. Tipos de datos y funciones
En Python, los siete tipos de datos comunes son los siguientes: entero, entero 
largo, flotante, cadena, lista, tupla y diccionario. Los tres tipos básicos de datos 
vectoriales son Punto, Polilínea y Polígono. Intente implementar el siguiente 
diseño de clase de Polygon en Python utilizando los tipos de datos de Python 
adecuados(utilice otros tipos de datos en lugar de float) para los atributos y 
métodos.
Descripción: una clase Point tiene dos atributos, x e y, para representar la 
coordenada de un punto. Una clase Point también tiene un método calDis () para 
calcular la distancia entre dos puntos. Los argumentos para el método calDis son el 
objeto de punto 'self' y el otro objeto de punto es "punto". El valor devuelto para la 
distancia entre dos puntos está diseñado como flotante.
El diseño UML para la clase Point para mantener los datos vectoriales de puntos es el siguiente:
Punto (Característica)
+ x: flotar
+ y: flotar
+ calDis(p: Punto): flotante
El siguiente Código 3.20 ejemplifica cómo implementar la clase Punto: 
Descripción: Una clase Polígono tiene un atributo "puntos" para representar la 
lista de coordenadas. Una clase Polygon también tiene un método getLength() para 
calcular el perímetro del Polygon. Los argumentos para el método getLength son el 
objeto Polygon actual 'self'. El valor devuelto para la longitud del borde de un 
polígono está diseñado como flotante.
> > > importarMatemáticas
> > > clasePunto:
definitivamente__en eso__(uno mismo, x = 0, y = 0):
self.x = x
self.y = y
definitivamenteCalDis(yo, punto):
devolvermath.sqrt((self.x-point.x)**2+(self.y-point.y)**2)
> > >
CÓDIGO 3.20
Definición de clase de punto.
Introducción a Python 59
El diseño UML para una clase Polygon que mantiene datos vectoriales de polígonos es el 
siguiente:
Polígono (Característica)
+ puntos: lista<Puntos>
+ getLength(): flotar
Asigne un polígono con los siguientes datos: [(1.0, 2.0), (3.0, 5.0), (5.0, 6.0), 
(1.0, 2.0)] y calcule la longitud del borde del polígono.
http://taylorandfrancis.com
4
Estructura de control del lenguaje Python, entrada/
salida de archivos y manejo de excepciones
En general, las declaraciones de los programas de computadora se ejecutan secuencialmente. 
Las estructuras de control ayudan a los programas de computadora a romper la secuencia 
saltando de un lado a otro para omitir un conjunto de declaraciones. Las estructuras de control 
hacen que los lenguajes de programación sean mucho más versátiles para resolver problemas 
del mundo real. Las estructuras de control incluyen toma de decisiones y bucles. Este capítulo 
presenta estructuras de control de Python de uso frecuente y demuestra métodos para operar 
objetos SIG. Este capítulo también lo ayuda a aprender cómo leer y/o escribir datos en un 
archivo local. Cuando un programa de Python encuentra un evento de error (también conocido 
como excepción), se bloqueará si no se maneja. Este capítulo cubre brevemente cómo capturar 
y manejar excepciones.
4.1 Toma de decisiones
Las decisiones son una de las formas más básicas de cambiar el flujo de ejecución del 
programa. Usan expresiones condicionales para evaluar si una afirmación es verdadera o 
falsa. Por ejemplo, suponiendo que a = 3 y b = 2, la expresión condicional a > b es 
verdadera, mientras que la expresión a < b es falsa.
Hay varias expresiones/valores que dan como resultado Falso:
• Cualquier número con un valor de cero (p. ej., 0, 0.0, 0L, 0j, Código 4.1 a la derecha)
• Una cadena vacía ('' o "")
• Un contenedor vacío, como lista (Código 4.1 a la izquierda), tupla, conjunto y 
diccionario
• Falso y Ninguno
Las expresiones condicionales constan de operadores y variables/valores relevantes. 
Los operadores lógicos y de comparación se utilizan para construir declaraciones y 
expresiones condicionales.
• Operadores de comparación: >,>=,<,<=,= =, !=,es, no es, en, no en
• Operadores Lógicos: y, o, no
61
62Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > si[]:
impresiónVerdadero
> > > si0:
impresiónVerdadero
más: más:
impresiónFalso impresiónFalso
Falso
> > >
Falso
CÓDIGO 4.1
Expresiones condicionales falsas: lista vacía (izquierda) y cero (derecha).
Los operadores lógicos se utilizan para proporcionar múltiples expresiones 
condicionales, por ejemplo, si x>0 e y>0: imprime 'x e y son positivos', o realiza la 
negación de expresiones usando not.
• si declaración: Cuando se usa una condición para controlar la ejecución de la 
declaración, unasi declaraciónse utiliza para ejecutar el bloque de instrucciones en 
función de los resultados de la evaluación de la expresión de condición. Cuando una 
expresión de condición es verdadera, se ejecutará el siguiente bloque de 
instrucciones; de lo contrario, se omitirá el siguiente bloque de instrucciones.
Sintaxis de declaraciones
si (expresión condicional):
Bloque de declaraciones
Ejemplo de declaración:
si a > b:
escribe "a es más grande que b"
• si... otra declaración: Cuando dos condiciones resultan en ejecuciones 
diferentes, elsi declaraciónse usa con elmáscláusula. Si la expresión condicional 
es verdadera, entonces el bloque de sentencias que siguesiserá ejecutado; de lo 
contrario, el bloque de declaración despuésmásserá ejecutado.
Sintaxis de la declaración:
si (expresión condicional):
Bloque de declaraciones
más:
Bloque de declaraciones
Ejemplo de declaración:
si a > b:
escribe "a es más grande que b"
Estructura de control del lenguaje Python, entrada/salida de archivos 63
más:
escribe "a es más pequeño que b"
• if….elif…else declaración: Cuando más de dos condiciones dan como resultado 
ejecuciones diferentes respectivamente, utilicesi,elif, omás. loselifdeclaración es 
similar a lamás siutilizado en C o Java. Esta declaración permitirá a los 
programadores verificar múltiples condiciones.
elif sintaxis:
si (expresión condicional 1):
Bloque de declaraciones 1
elif (expresión condicional 2):
Bloque de declaraciones 2
elif (expresión condicional 3):
Bloque de declaración 3
…
más:
Bloque de declaraciones n
Si la expresión condicional 1 (o 2, 3,...) es verdadera, entonces se ejecutará el bloque de 
instrucciones 1 (o 2, 3...) y se omitirá el otro bloque de instrucciones. Sin embargo, si 
todas las condiciones anteriores (1, 2, 3, …., n−1) no son verdaderas, los bloques bajo más
(se ejecutará el bloque de instrucciones n).
Puntas: declaración de aprobación (Código 4.2)
pasardeclaración es única en el sentido de que no realiza ninguna función. Se 
utiliza en el proceso de toma de decisiones, diciéndole al intérprete que no haga 
nada bajo ciertas condiciones.
En el proceso de desarrollo de software, puede servir como marcador de posición, para ser 
reemplazado más tarde con código escrito (Código 4.3).
a=b=0
sia>b:
pasar
más:
pasar
CÓDIGO 4.2
Pasar declaración en estructura if… else….
definitivamentedibujar():
pasar
CÓDIGO 4.3
Pass se usa como una declaración de marcador de posición escrita en método.
64Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
4.2 Bucles
Otro tipo de estructura de control es el bucle. Por lo general, un bucle ejecuta un bloque hasta 
que su condición se vuelve falsa o hasta que ha agotado todos los elementos de secuencia en 
un contenedor (por ejemplo, una lista). Puede interrumpir un ciclo para iniciar una nueva 
iteración (usando continuar) o finalizar el ciclo (usandodescanso). Ambas cosastiempoypor se 
puede usar para recorrer un bloque de instrucciones.
• para declaración:Paraloop se utiliza para ejecutar un bloque repetido de 
sentencias por un número definido de veces.Parase usa con tipos de datos 
compuestos (también conocidos como tipos de datos de secuencia), como 
cadena, lista y tupla en la siguiente sintaxis y ejemplo, que usa un bucle for para 
calcular la suma de 1 a 100 (Código 4.4):
sintaxis:
para artículo en secuencia:
Bloque de declaraciones
• mientras declaración:tiempoLa instrucción es muy flexible y puede repetir un bloque 
de código mientras la condición sea verdadera. lostiempoLa declaración 
generalmente se aplica cuando hay un número desconocido de veces antes de 
ejecutar el bucle. El código 4.5 muestra un ejemplo del usotiempobucle para calcular 
la suma de 1 a 100.
• función range() y función len(): Losrango(Pythoncentral 2011) y LenLas 
funciones se utilizana menudo enporytiempobucles Usandorango(inicio, fin, 
paso) genera una lista donde para cualquier k, inicio <= k < fin, y k itera de 
principio a fin con incrementos de paso. Por ejemplo, range(0,4,1) produce una 
lista de [0,1,2,3]; range(0,50,10) produce una lista de [0,10,20,30,40].rangoLa 
función toma 0 como valor inicial predeterminado y 1 como paso 
predeterminado. Por ejemplo, range(4) produce una lista de [0,1,2,3]. El código 
4.4 es un ejemplo que usa range(4) para producir una lista y usa la estructura de 
bucle for para imprimir cada elemento dentro de la lista.
> > > porienrango(4): 
impresióni
0
1
2
3
CÓDIGO 4.4
Use la función de rango con valores predeterminados de inicio y paso.
Estructura de control del lenguaje Python, entrada/salida de archivos sesenta y cinco
> > > yo=0
> > > total=0
> > > tiempoi<101: 
total +=i
i+=1
> > > impresióntotal 
5050
> > >
CÓDIGO 4.5
Cálculo de resumen de 1 a 100 usando while loop.
El siguiente ejemplo ilustra cómo usar la función de rango y cómo 
calcular la suma de 1 a 100 usando eltotalvariable para contener el 
resultado resumido para bucle (Código 4.6).
La funciónlargo()devuelve el número total de elementos en datos compuestos. 
Por ejemplo, len(polyline.points) puede devolver el número de puntos dentro de una 
polilínea. El siguiente ejemplo utilizatiempoylargo()para calcular la longitud de una 
polilínea (Código 4.7).
• descanso: Adescansose utiliza para interrumpir la ejecución de un ciclo, como 
encontrar si dos líneas se cruzan entre sí. El bucle se puede romper una vez que 
los dos segmentos de línea (de cada una de las dos líneas) se cruzan (Código 
4.8).
> > > totales = 0
> > > porienrango(1,101,1): 
total+=yo
> > > impresióntotal 
5050
CÓDIGO 4.6
Calcule el resumen de 1 a 100 usando rango y bucle for.
> > > definitivamenteobtenerLongitud(polilínea):
longitud, i=0.0, 0
tiempoyo<Len(polilínea.puntos)-1:
longitud+=math.sqrt((polilínea.puntos[i].x-
polilínea.puntos[i+1].x)**2 + (polilínea.puntos[i].y-
polilínea.puntos[i+1].y)**2)
CÓDIGO 4.7
Calcular la longitud de una polilínea usandotiempobucle yLen() método.
66Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > bIntersección =Falso
> > > definitivamenteintersecarse(línea1,línea2): porien
Len(línea1.segmentos de línea):
porjenlen(línea2.segmentos de línea):
si(línea1.segmentosdelínea[i].segIntersect
(línea2.segmentosdelínea[j])):
bIntersección =Verdadero
descanso
CÓDIGO 4.8
Prueba si dos líneas se cruzan entre sí usandodescansoyporcírculo.
> > > definitivamentedibujarMapa():
porienrango(Len(capas)):
si(capas[i].layerType =='Imagen'):
Seguir
capas[i].drawLayer()
CÓDIGO 4.9
Dibuja un mapa sin dibujar las capas de la imagen.
• Seguir: LosSeguirLa instrucción se usa con menos frecuencia que la instrucción 
break para omitir el resto del cuerpo de un bucle bajo una determinada 
condición. Esto puede eliminar las ejecuciones de valores de bucle específicos o 
categorías de valores. Por ejemplo, cuando se dibuja un mapa, puede 
desmarcar las capas con una imagen. El código (Código 4.9) salta todas las 
capas de la imagen:
4.3 Otras estructuras de control
• Combinación de loop y decisiones: El bucle y las decisiones se usan juntos para 
construir un control de flujo complejo:
for/while expresión condicional 1:
bloques de declaraciones 1
si expresión condicional 2
bloques de declaraciones 2
más:
romper/continuar
bloques de declaraciones 3
El siguiente ejemplo (Código 4.10) identifica los puntos compartidos entre dos polígonos 
(esto es útil para comprender la estructura de datos, aunque la tupla normalmente no se 
usa para contener coordenadas de puntos):
Estructura de control del lenguaje Python, entrada/salida de archivos 67
> > > p1, p2, p3, p4 = (0,0), (1, 1), (2, 2), (3, 3)
> > > polígono1= [p1, p2, p3]
> > > polígono2 = [p1, p2, p4]
> > > definitivamentegetCommonList(lista1, 
lista2): listacomún = []
porcadaValorenlista1:
sicadaValorenlista2:
commonList.append(eachVal)
devolverlista común
> > > resultados = getCommonList(polígono1, polígono2)
> > > impresión
resultados [(0, 0), (1, 1)]
CÓDIGO 4.10
Ejemplo de combinación de loop y decisiones.
> > > definitivamentedoble circuito():
porienrango(Len(puntos)-1):
porjenrango(Len(puntos)-i-1):
puntos[i].calDis(puntos[Len(puntos)-1-j])
CÓDIGO 4.11
Calcule la distancia entre puntos usando bucles dobles.
• Bucles anidados: Otra estructura compleja son los bucles anidados, 
especialmente los bucles dobles. Dada una lista de puntos, si tuviera que 
calcular la distancia de cada par de puntos en una lista de puntos, necesitará 
usar el bucle doble (Código 4.11).
4.4 Entrada/salida de archivos
Hay una serie de métodos integrados para operar archivos, como abrir, leer y 
escribir (PythonForBeginers 2012).
• Abriendo un archivo: Para operar un archivo, use la funciónabiertocon un nombre de 
archivo y un modo de operación de archivo como argumentos. En el ejemplo f = 
open(filename, mode), el modo podría ser
• 'r': cuando el archivo solo se leerá, y este es el valor 
predeterminado.
• 'w': solo para escritura (se borrará un archivo existente con el mismo 
nombre).
68Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
• 'a': abre el archivo para agregarlo; todos los datos escritos en el archivo se agregan 
automáticamente al final del archivo.
• 'r+': abre el archivo tanto para lectura como para escritura.
• leyendo un archivo: Losabierto() cargará el archivo desde el almacenamiento en disco a la 
memoria y lo devolverá como un objeto de archivo. Este objeto de archivo tiene tres métodos de 
lectura de archivos:
• leer(tamaño): devuelve el archivo completo cuando no se pasa ningún parámetro de tamaño 
(por defecto, el tamaño es igual a −1), o el contenido como una cadena en el tamaño de bytes 
especificado.
• línea de lectura(): lee y devuelve una línea como una cadena (incluido el 
final '\n').
• líneas de lectura(): lee y devuelve todas las líneas del archivo como una lista de 
cadenas (incluido el final '\n').
• escribiendo un archivo: Un objeto de archivo tiene dos métodos escritos:
• escribe(str): escribe la cadena 'str' en el archivo.
• líneas de escritura(lista): escribe una lista de cadenas en el archivo; cada elemento de cadena 
es una línea en el archivo.
losescribeLa función escribe el contenido de una cadena en un archivo. Sin embargo, existen 
otros tipos de datos, como float e integer. ¿Cómo se escriben los datos en un archivo? Dado que 
una cadena actúa como argumento de entrada, elcadena()yrepetir() La función convertirá un 
objeto que no sea una cadena en un objeto de cadena. Por ejemplo, si escribe un número 
flotante 3.14 en un archivo, puede usarescribe(calle(3.14)). Por lo general, un archivo de texto 
se organiza línea por línea, mientras que elescribe() escribe datos en un archivo y los cambia a 
una nueva línea usando los caracteres especiales "\n". Por lo tanto, escribir ("primera 
línea\nsegunda línea") generará dos líneas en el archivo como se muestra a continuación:
primera linea
segunda linea
El valor devuelto también es una cadena al leer los datos de un archivo con leer() ylínea 
de lectura(); por lo tanto, debemos formatear esos valores de cadena en el tipo de datos 
que prefiramos. Nosotros podemos usarflotar(str), por ejemplo,flotar('3.14'),En t(str), por 
ejemplo,En t('2.0'), ylargo(str), por ejemplo,largo('2.0l') para convertir cadenas en 
números.
• Cambiar la posición del puntero del objeto de archivo: Mientras leemos un archivo, es 
posible que necesitemos omitir varias líneas y leer información específica en el 
archivo. En tales circunstancias, podemos localizar líneas y palabras específicas de un 
archivo con los siguientes dos métodos:
Estructura de control del lenguaje Python, entrada/salida de archivos 69
• buscar(fuera de tamaño, de dónde): ir a una posición dentro de un archivo, con bytes 
fuera de tamañocompensardeDe dónde(0==comienzo del archivo, 1==ubicación actual 
o 2==fin del archivo).• decir(): devuelve la posición actual del cursor/puntero dentro de un archivo.
• cerrar un archivo: Después de que terminemos de manipular un archivo, debemos 
cerrar el archivo para liberarlo de la memoria con el método:
• cerca(): cerrar un archivo
Este es un paso muy importante cada vez que leemos o escribimos datos en un 
archivo. Sin este paso, el archivo se mantendrá en la memoria y puede agotar la 
memoria disponible del sistema (pérdida de memoria) si se abren demasiados 
archivos. Es posible que los datos no se conserven en el disco duro antes de cerrar un 
archivo.
4.5 Excepciones
Las excepciones (Python 2001b) son los errores encontrados al ejecutar programas 
de Python, por ejemplo, los errores para abrir un archivo que no existe, dividir por 
cero, concatenar objetos 'str' e 'int'. Estas excepciones se pueden manejar en 
programas de Python usando elprueba... excepto...declaración. Puede haber uno o 
másexceptocláusulas en la declaración. CadaexceptoLa cláusula se utiliza para 
capturar una excepción. Si una cláusula de excepción coincide con la excepción, el 
programa ejecutará laexceptocláusula. Si noexceptocoincide con la cláusula, el 
programa se pasará al exteriorprobardeclaraciones y dan el error de excepción. 
Code 4.12 maneja el ZeroDivisionError usando elprueba... excepto... declaración.
> > > definitivamentePendiente(x1,y1,x2,y2): 
probar:
devolver(y2-y1)/(x2-x1)
exceptoError de división cero:
impresión'Error: x1 es igual a x2' 
devolverNinguna
> > > pendiente (1,2,3,4) 
1
> > > pendiente (1,4,1,5) 
Error: x1 es igual a x2
> > >
CÓDIGO 4.12
Manejar ZeroDivisionError usandoprueba... excepto...declaración.
70Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
4.6 Experiencia práctica con Python
4.6.1 Encontrar la distancia más larga entre dos puntos cualesquiera
• Abrir un archivo de texto
• Ingrese el Código 4.13, donde se usa un solo bucle
• Pruebe y pruebe otro método en el que se utilicen múltiples bucles 
(Código 4.14).
En este método, se utiliza el bucle doble para calcular las distancias entre cada par 
de cuatro puntos (p0, p1, p2, p3). como se muestra comoFigura 4.1, durante el ciclo 
externo nivel 1, cuando i=0, el ciclo interno iterará j de 1 a 2 a 3. Después de que el 
ciclo externo avance a i=1, j se iterará de 2 a 3, y así sucesivamente.
4.6.2 Experiencia práctica: E/S, crear y leer un archivo
1. Abra la consola de Python. Escriba el código 4.15 para el sistema operativo Windows:
> > > importarMatemáticas
> > > clasePunto:## definir una clase de punto definitivamente
__en eso__(uno mismo, x=0.0, y = 0.0):
self.x = x
self.y = y
definitivamenteobtenerDistancia(yo, otro):## declarar getDistance como 
un método
devolvermath.sqrt((otro.x-yo.x)**2+(otro.y-yo.y)**2)
# Declarar tres puntos
> > > p1,p2,p3 = Punto(1,5), Punto(2,8), Punto(10,3)
# # calcular las distancias entre dos puntos aleatorios y guardarlos en una 
lista
> > > dist1 = p1.obtenerDistancia(p2)
> > > dist2 = p1.obtenerDistancia(p3)
> > > dist3 = p2.obtenerDistancia(p3)
> > > distancias = [dist1,dist2,dist3]
# # Declarar la variable Distancia más grande
> > > mayor distancia = 0.0
> > > porienrango(Len(distancias)):
distanciaActual = distancias[i] sidistanciaActual 
> distanciaMayor:
mayorDistancia = distanciaActual
# # Terminar de encontrar e imprimir
> > > impresión'la mayor distancia es ->', distancia mayor la 
mayor distancia es -> 9.43398113206
> > >
CÓDIGO 4.13
Encuentre la distancia más larga entre dos puntos cualesquiera de 3 puntos usando un solo bucle.
Estructura de control del lenguaje Python, entrada/salida de archivos 71
> > > importarMatemáticas
> > > clasePunto:## definir una clase de punto definitivamente
__en eso__(uno mismo, x=0.0, y = 0.0):
self.x = x
self.y = y
definitivamenteobtenerDistancia(yo, otro):## declarar getDistance como un método
devolvermath.sqrt((otro.x-yo.x)**2+(otro.y-yo.y)**2)
# Declarar cuatro puntos
> > > p0, p1,p2,p3 = Punto(), Punto(1,5), Punto(2,8), Punto(10,3)
# # mantener en la lista
> > > puntos = [p0, p1, p2, p3]
# # Declarar la variable Distancia más grande
> > > mayor distancia = 0.0
> > > porienrango(Len(puntos)):
porjenrango(yo+1,Len(puntos)):
distanciaActual = puntos[i].getDistance(puntos[j]) si
distanciaActual > distanciaMayor:
mayorDistancia = distanciaActual
# # Terminar de encontrar e imprimir
> > > impresión'la mayor distancia es ->', distancia mayor la 
mayor distancia es -> 10.4403065089
CÓDIGO 4.14
Calcule la distancia más larga entre dos puntos cualesquiera de un conjunto de 4 puntos usando doblepor
bucle con i y j como variables incrementales.
Nota: (1) Asegúrese de que exista el directorio 'c:/code', o generará un 
error como: "IOError: [Errno 2] No such file or directory: 'c:/code/
points.txt'" . La función makedirs() en el módulo os podría ayudar a 
crear un directorio; (2) Asegúrese de tener permiso para crear un 
archivo en el directorio 'c:/code', de lo contrario generará un error 
como "IOError: [Errno 13] Permiso denegado: 'c:/code/points.txt' ”.
Lazo 1: i = 0 Bucle 2: i = 1 Bucle 3: i = 2
p0 p0 p0 p0 p0 p0
Bucle 11: j = 1
p1p1 p1 p1
Bucle 21: j = 2
p2
p1 p1
Bucle 12: j = 2
p2p2 p2 p2 p2
Bucle 13: j = 3
p3
Bucle 22: j = 3
p3
Bucle 31: j = 3
p3p3 p3 p3
FIGURA 4.1
Use el bucle doble para calcular la distancia entre cada par de cuatro puntos p0, p1, p2, p3.
72Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > f =abierto('C:/Usuarios/Phil/Descargas/puntos.txt', 'w+')
> > > f.escribir('punto:\n')
> > > f.escribir('p1: 1.0, 1.0\n')
> > > f.escribir('p2: 2.0, 2.0\n')
> > > f.cerrar()
CÓDIGO 4.15
Escribe un archivo de texto.
> > > f =abierto('C:/Usuarios/Phil/Descargas/puntos.txt', 'r')
> > > f.readline()# Leer la primera línea
> > > f.readline()# Lee la segunda línea
> > > f.readline()# Lee la 3ra linea
> > > f.readline()# final del archivo
> > > f.buscar(0)#ir al principio del archivo
> > > f.readline()
> > > f.readlines()# leer líneas de descanso en una lista
> > > f.buscar(0)
> > > f.leer()# leer líneas de descanso como una cadena
> > > f.cerrar()
CÓDIGO 4.16
Leer de un archivo de texto.
Para Mac o Linux OS, reemplace el directorio 'c:/code/points.txt' con 
uno diferente, por ejemplo, '/home/points.txt'.
2. Vaya al directorio 'points.txt' y verifique que se haya creado un 
points.txt (que debería ser cierto si no aparece ningún error para su 
código). Ahora abra el archivo y examine la información en el archivo.
3. El código 4.16 lee los datos del archivo points.txt.
4.6.3 Experiencia práctica: E/S, control de flujo y archivo
• Leer y manipular conjuntos de datos de puntos: cree un archivo de texto en c:/
code/points.txt y coloque las siguientes tres líneas en el archivo:
punto:
p1: 1.0, 1.0
p2: 2.0, 2.0
Nota: Este es un archivo de formato de datos GIS simple, donde la primera línea "punto:" indica 
que se trata de un archivo de características de puntos.
• Lea los puntos p1 y p2 del archivo points.txt e imprima las coordenadas x e y. 
Abra el editor de texto de Python y cree un nuevo archivo para guardarlo 
como read_point.py. Ingrese el código 4.17 en read_point.py.
• Pregunta: Si revisamos el archivo points.txt al siguiente formato (reemplace los dos 
puntos por punto y coma):
punto;
p1; 1.0, 1.0
p2; 2.0, 2.0
Estructura de control del lenguaje Python, entrada/salida de archivos 73
"""
GGS 650 Clase 4 Práctica
readPointFile() es la función para analizar los siguientes datos de formato: punto:
p1: 1.0, 1.0
p2: 2.0, 2.0\n
readPolylineFile() es la función para analizar el formato de polilínea como: polilínea;
1: 1,0, 1,0; 2.0, 2.0;.... 2: 2.0, 2.0; 3.0, 
3.0;.... """
> > > importarMatemáticas
> > > clasePunto:## definir una clase de punto
definitivamente__en eso__(uno mismo, x=0.0, y=0.0):## método init para clase de punto
self.x = x
self.y = y
# # Declarar getDistance como método de Point 
definitivamenteobtenerDistancia(yo, otro):
devolvermath.sqrt((otro.x - propio.x)**2 + (otro.y - 
propio.y)**2)
> > > definitivamentereadPointFile(Nombredel archivo): 
expediente=abierto(Nombre del archivo,'r')
# declarar una lista vacía para mantener puntos e índice para la línea Num 
puntos,índice = [],0
porlíneaenexpediente:## Leer cada línea iterativamente
índice += 1## Aumenta el índice después de leer una línea siíndice 
== 1:
Seguir## "Ignorar la primera línea 'point\n'"
# dividir la línea y obtener la coordenada, por ejemplo, 1.0, 1.0 
coords = linea.dividir(':')[1]
# # Obtener el valor del punto x, y 
xCoord = coords.split(',')[0] yCoord = 
coords.split(',')[1]
punto = Punto(flotar(xCoord),flotar(yCoord)) 
puntos.append(punto)
expediente.cerca()# recuerda cerrar el archivo después de leer 
devolverpuntos
# # Llamar a la función para analizar el archivo de puntos
> > > puntos = readPointFile('puntos.txt')#obtener todos los puntos
# imprimir puntos
> > > longitud =Len(puntos)# obtener la longitud de la lista de puntos
> > > porienrango(longitud):
punto = puntos[i]
impresiónpunto.x, punto.y##imprime el valor x, y de cada punto
1.0 1.0
2.0 2.0
10,0 11,0
11,2 13,4
CÓDIGO 4.17
Leer un archivo de datos de puntos GIS formateado.
¿Qué parte del código debemos revisar? ¿Qué tal el siguiente formato?
punto:
1,0, 1,0; 2.0, 2.0
74Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
4.6.4 Experiencia práctica: Ingresar datos de puntos GIS desde un archivo de texto
El código 4.18 lee el archivo de texto de puntos y analiza los datos generando objetos de 
puntos. Luego se encuentra la distancia máxima entre dos puntos cualesquiera y se escribe en 
un archivo de resultados. Pruébelo en su computadora e interprete el ejemplo línea por línea.
> > > importarMatemáticas
> > > clasePunto:
definitivamente__en eso__(uno mismo,x,y):
self.x = x
self.y = y
definitivamentedis(yo, punto):
devolvermath.sqrt((self.x-point.x)**2+ (self.y-
point.y)**2)
> > > f =abierto('puntos.txt', 'r')
> > > f.readline()
> > > yo = 0
> > > puntos = []
> > > tiempo(i==0):
línea = f.readline()
si(línea.buscar(':')!=-1):
cuerdas = linea.split(':')[1] si
(cuerdas.fiand(',')!=-1):
xy = cuerdas.dividir(',') 
puntos.append(Punto(flotar(xy[0]), flotar
(xy[1])))
más:
yo=1
> > > fuera =abierto('puntosResultados4.17.txt','w')
> > > lpuntos = []
> > > dis = 0
> > > impresiónpuntos
[<__main__.Instancia de punto en 0x03373198>, 
<__main__.Instancia de punto en 0x03373990>, 
<__main__.Instancia de punto en 0x03373148>, 
<__main__.Instancia de punto en 0x03373B98>]
> > > porkenrango(Len(puntos)): poryoenrango(k+1,
Len(puntos)):
si(puntos[k].dis(puntos[l])>dis):
dis = puntos[k].dis(puntos[l]) tiempo(
Len(lpuntos)>0):
lpoints.remove(lpoints[0]) 
lpoints.append(puntos[k]) 
lpoints.append(puntos[l])
> > > fuera.escribir('La distancia más larga es entre el punto ['+calle
(lpuntos[0].x)+','+calle(lpuntos[0].y)+'] y ' +
'punto ['+calle(lpuntos[1].x)+','+calle(lpuntos[1].y)+']\norte
la distancia es'+calle(des))
> > > fuera.cerrar()
> > > f.cerrar()
CÓDIGO 4.18
Leer y escribir el contenido de un archivo de datos de puntos.
Estructura de control del lenguaje Python, entrada/salida de archivos 75
Contenido del archivo de texto:
Punto:
1: 1, 2
2: 100, 300
3: 4, 5
4: 0, 500
5: 10, 400
6: 600, 20
7: 500, 400
8: 500, 500
4.7 Resumen del capítulo
Este capítulo presenta diferentes estructuras de control de flujo, incluyendo
• Tomar decisiones usandosi,más, yelif.
• Bucle un bloque de sentencias usandotiempoyporcontrol de flujo.
• Combinar bucle (porytiempo) y sentencias condicionales (si,más, yelif) 
para controles de flujo complejos.
• Leer y escribir archivos de texto.
• Detectar y manejar errores usandoprueba... excepto...declaración.
PROBLEMAS
1. Revise el tutorial de Python "Entrada y salida", que viene con Capítulo 7
del documento de ayuda del software Python.
2. Analice los patrones de la siguiente cadena de texto y guárdelo en un archivo de 
texto, por ejemplo, polylines.txt.
Polilínea:
1. 1603714.835939442,142625.48838266544; 1603749.4678153452,142620.21 
243656706; 1603780.3769339535,142607.37201781105; 1603801.47584667 
8,142582.27024446055; 1603830.4767344964,142536.14692804776;
2. 1602514.2066492266,142330.66992144473; 1602521.4127475217,142414.9 
2978276964; 1602520.1146955898,142433.93817959353; 1602501.3840010 
355,142439.12358761206; 1602371.6780588734,142417.84858870413; 1602
Traducido del inglés al español - www.onlinedoctranslator.com
https://www.onlinedoctranslator.com/es/?utm_source=onlinedoctranslator&utm_medium=pdf&utm_campaign=attribution
76Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
351.6610373354,142408.02716448065; 1602334.5180692307,142388.58748 
627454; 1602331.6999511716,142376.66073128115; 1602334.8067251327, 
142348.965322732; 1602338.308919772,142323.6111663878; 1602349.022 
6452332,142314.50124930218; 1602363.9090971674,142310.79584660195; 
1602514.2066492266,142330.66992144473;
3. Escriba un programa de Python para analizar el archivo de texto y use la lista para 
contener las dos polilíneas. Consulte la Sección 5.6.1 en Referencia de la biblioteca de 
Python (del documento de ayuda de Python) Métodos de cadena para split(), strip() y 
funciones integradas float(x).
4. Genere dos objetos de polilínea.
5. Calcula la longitud de las dos polilíneas.
6. Revise los materiales de la clase sobre el manejo de excepciones y el tutorial de 
Python "Errores y excepciones" (Sección 8.3 en el documento de ayuda de 
Python).
7. Mientras lee el archivo y convierte los datos de cadena a otro tipo de datos, por 
ejemplo, flotante, agregue "intentar... excepto... finalmente...” para capturar las 
Excepciones, por ejemplo, IOError y ValueError.
5
Pensamiento de programación y 
visualización de datos vectoriales
El pensamiento de programación es fundamental para dominar un lenguaje de 
programación (Eckerdal et al. 2005). La única forma de acostumbrarse a pensar en una 
capacidad de programación es a través de la experiencia. Este capítulo visualizará datos 
vectoriales para ilustrar cómo pensar de manera programática.
5.1 Problema: visualización de datos GIS
Visualizar datos GIS es como dibujar o pintar sobre una tela o lienzo en blanco 
(Hearnshaw y Unwin 1994). Los mapas GIS incluyen elementos esenciales como una 
leyenda, un título del mapa, información pertinente y una imagen de los datos 
visualizados. Una imagen de un mapa incluirá diferentes tipos de datos GIS, utilizados de 
diferentes maneras (Figura 5.1, por ejemplo).
Los patrones se denominan símbolos e incluyen patrones geométricos (cuadrados, líneas, 
polígonos), colores (verde, gris y beige) y un nombre de las características de los datos. 
Dependiendo de la cantidad de memoria de la computadora, la visualización de datos GIS en 
forma de mapa es un proceso tedioso porque los datos deben colocarse en orden secuencial. 
Por lo general, el proceso de dibujo comienza con un polígono a una polilínea y luego a una 
entidad de punto. De esta manera, las características de área más pequeñas no cubrirán 
ninguna característica de área grande. Los procesos de dibujo de mapas incluyen múltiples 
pasos, como se indica enFigura 5.2.
Preparar lienzo→preparar datos/características para dibujar (transferencia de coordenadas) y 
saber dónde dibujar→configurar cómo dibujar y dibujar las características→finalizar un proceso 
de dibujo (secado, etc.)
Un programa de computadora requerirá una GUI para interactuar con un usuario final 
para la visualización de entrada y salida. Por ejemplo, la ventana IDLE de Python es un 
tipo de GUI que se usa para programar en Python. ArcGIS tiene un ArcMap y otras GUI 
para la interacción del usuario. En el software GIS, tanto la GUI como la leyenda GIS son 
importantes para interpretar las funciones necesarias para un sistema GIS. Esta sección 
discutirá cómo configurar y usar una interacción de usuario de GUI simple, así como 
preparar Canvas para dibujar mapas.
77
78Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 5.1
Un mapa que utiliza el software ArcGIS, en el que lospolígonos se ilustran en verde claro, las polilíneas en rojo 
oscuro y los puntos en verde.
comienzo
Preparar lienzo
Transferencia de coordenadas
Dibujar características
Finalizar dibujo
Final
FIGURA 5.2
El proceso para visualizar datos GIS.
Pensamiento de programación y visualización de datos vectoriales 79
En Python, Tkinter y las clases y módulos relacionados se usan comúnmente para 
dibujar y desarrollar GUI. Además de Tkinter, hay otros conjuntos de herramientas 
disponibles, como PyGTK, PyQt y wxPython. El código 5.1 mostrará una GUI:
En el código de muestra:
1. La primera línea importará las clases y funciones de Tkinter.
2. La segunda línea llama a Tk() para generar un objeto de ventana raíz.
3. La tercera línea llama a la clase Label para generar un objeto Label de widget.
4. La cuarta línea usa pack() para hacer visible la etiqueta.
5. La última línea abre la primera ventana, que incluye la etiqueta (hecho 
cuando se crea la etiqueta).
En este ejemplo, se creó una ventana con una etiqueta que mostraba "Hola 
mundo". TKinter admite una variedad de objetos widget; los más comunes se 
describen enCuadro 5.1.
Además de los widgets enCuadro 5.1, Tkinter tiene otros widgets, que 
incluyen Entry, Frame, LabelFrame, Menubutton, OptionMenu, 
panelWindow, Scale, Spinbox y Toplevel.
Cuando use otros widgets, reemplace la tercera y la cuarta línea (en el Código 5.1) 
creando un objeto de un widget específico y pasándolo en los argumentos 
relevantes especificados en la referencia en línea,*por ejemplo, cuando use Canvas 
para el mapa, reemplace la tercera y cuarta línea con
can = Canvas(raíz, ancho = 800, alto = 600) 
can.pack()
Entre todos los widgets, Canvas es el más utilizado. Admite muchos métodos, 
como dibujar puntos, líneas, polilíneas y polígonos. Un código típico de 
preparación de Canvas se muestra en el Código 5.2.
En Code 5.2, la tercera línea crea un lienzo con dimensiones de tamaño de píxel de 800 
por 600. Aunque el tamaño se basa en el tamaño del monitor de la computadora, el 
tamaño real se puede ajustar en la pestaña de configuración de pantalla. La penúltima 
línea asegura que Canvas esté visible en la ventana y la última línea
> > > deImportación de Tkinter *
> > > raíz = Tk()
> > > w = Etiqueta (raíz, texto="¡Hola Mundo!")
> > > w.paquete()
> > > raíz.mainloop()
CÓDIGO 5.1
Cree una GUI usando Tkinter.
* http://www.pythonware.com/library/tkinter/introduction/tkinter-reference.htm.
http://www.pythonware.com/library/tkinter/introduction/tkinter-reference.htm
80Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
TABLA 5.1
Widgets populares de TKinter
Widgets Sintaxis Ejemplo
Botón
Lienzo
Etiqueta
Cuadro de lista
Menú
Mensaje
Boton de radio
Barra de desplazamiento
Texto
usando (maestro,
opciones) como
parámetros a
inicializar un widget,
root es el widget 
principal, opciones
son el widget
opciones como
comando, atrás
Botón (raíz, texto = "Aceptar", comando = devolución de 
llamada) Lienzo (raíz, ancho = 800, altura = 600) 
Etiqueta (raíz, texto = "¡Hola, mundo!")
Cuadro de lista (raíz, altura = 8) Menú (raíz, ancho de borde = 2) 
Mensaje (raíz, texto = "este es un mensaje") Botón de opción (raíz, 
texto = "Escala de grises", valor = "L") Barra de desplazamiento = Barra 
de desplazamiento (raíz )
Texto (raíz, fuente = ("Helvética", 16))
> > > deTkinterimportar*
> > > raíz = Tk()
> > > can = Canvas (raíz, ancho = 800, altura = 600) '''dibuja 
características y mapas en el lienzo/tela. . .
. . .
'''
> > > puede.empacar()
> > > raíz.mainloop()
CÓDIGO 5.2
Preparando un lienzo para dibujar.
se asegurará de que aparezca la ventana. El lienzo preparado se puede usar como 
tela de mapa, que se puede usar para dibujar puntos, polilíneas y polígonos. El 
siguiente paso es preparar los datos GIS para que puedan servir como visualización 
en Canvas.
5.2 Transformación del sistema de coordenadas
Los datos GIS se representan en una variedad de formatos y proyecciones, por 
ejemplo, un archivo de forma en ArcView versus un archivo de texto formateado en 
diferentes aplicaciones. El primer paso para visualizar un conjunto de datos GIS es 
leer los datos GIS del archivo de datos para poder manipularlos según sea 
necesario. El proceso de visualización requiere convertir polilíneas en variables 
desde un archivo de texto y luego realizar cálculos (p. ej., longitud) sobre ellas 
utilizando los datos GIS. El vector de datos GIS básico son las coordenadas 
geográficas, que definen dónde se dibujarán en Canvas. Muchas coordenadas de 
datos GIS se presentan en medidas de latitud y longitud (−90 a 90 y −180 a 180), a 
diferencia de las medidas del monitor de la computadora (800×600 o 1024×768
Pensamiento de programación y visualización de datos vectoriales 81
o 1600×1200). El sistema del monitor también se denomina sistema de coordenadas del 
monitor. El sistema de coordenadas del monitor comienza desde la parte superior izquierda 
como un origen (0, 0) y su valor aumenta de arriba a abajo (y) y de izquierda a derecha (x) en el 
monitor.
Otros sistemas de coordenadas de datos, como Universal Transverse Mercator (UTM, 
Grafarend 1995), no caben en un sistema de coordenadas de monitor. Moverse por las 
características del mapa en una ventana GIS mientras se desplaza por el mapa hará que 
la ubicación de las coordenadas se reajuste en el monitor de la computadora. Cabe 
señalar que las coordenadas GIS reales primero se transforman en coordenadas del 
monitor y luego se muestran en el monitor. Esto permite que el sistema de coordenadas 
geográficas se asemeje al sistema de coordenadas del monitor en la computadora. Esta 
sección explica cómo convertir un sistema de coordenadas GIS a un sistema de monitor 
de computadora.
Las coordenadas geoespaciales diarias para puntos, polilíneas o polígonos son números 
flotantes y se representan en el sistema de coordenadas cartesianas 2D (Pick y Šimon 1985). El 
sistema de coordenadas geográficas tiene los valores de coordenadas más bajos en la parte 
inferior izquierda y los valores de coordenadas más grandes en la parte superior derecha. Sin 
embargo, un punto del sistema de coordenadas del monitor se representa como un píxel con 
números enteros x e y numerados desde el origen en la esquina superior izquierda (Figura 5.3
Correcto). Por lo general, el área geográfica que se analiza es más grande que el tamaño de la 
pantalla del monitor, por lo que para representar con precisión los datos geográficos en la 
pantalla, se debe implementar una conversión de mapas. La transformación del sistema de 
coordenadas convierte el punto (x, y) en el sistema de coordenadas geográficas (Figura 5.3
izquierda) a (winx, winy) en el monitor de la computadora (Figura 5.3 Correcto).
Para realizar la transformación de coordenadas, calcule dos parámetros críticos, relaciones 
de longitud y puntos de referencia (o control). La relación de longitud es el factor de reflexión 
del sistema de coordenadas geográficas al sistema de coordenadas del monitor. Por ejemplo, 
usar 800 en el monitor se transformará en una longitud de 360 grados en el sistema de 
coordenadas geográficas. La relación de longitud será de 360/800. Se hace referencia al punto 
de referencia como un punto en el sistema de coordenadas geográficas, que muestra un punto 
específico (p. ej., 0, 0) en el sistema de coordenadas del monitor. Al inicializar un mapa, se debe 
mostrar todo el conjunto de datos del dominio geográfico. Por lo tanto, seleccione el punto 
superior izquierdo de un SIG
(154.23, 85.78)
(0, 0)
Área de datos GIS (–179,00, –89,00,
154.23, 85.78)
Ventana dentro del monitor
(800 × 600)
(–179,00, –89,00) (800, 600)
FIGURA 5.3
Un ejemplo de área geográfica y tamaño de monitor de ventana con 800×600.
82Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
P4 P3 (154,23, 85,78)
RatioX: (maxX–minX)/(800–0)
= (154,23+179,00)/800
= 0,4165375P0
RatioY: (maxY–minY)/600
= (85,78+89,00)/800
= 0,2913
P2
P1 (–179,00, –89,00)FIGURA 5.4
Cálculo de ratioX y ratioY.
conjunto de datos (el punto con la coordenada x más baja y la coordenada y más alta) como el origen 
de un monitor de computadora (0, 0, arriba a la izquierda).
En el proceso de transformación de coordenadas, mantenga la dirección del mapa, es 
decir, tenga el mapa del monitor con la misma dirección de arriba a abajo y de izquierda a 
derecha. A lo largo del eje x, tanto el sistema de coordenadas geográficas como el 
sistema de coordenadas del monitor aumentarán de izquierda a derecha. Sin embargo, a 
lo largo del eje Y, el sistema de coordenadas del monitor aumentará de arriba hacia 
abajo, mientras que el sistema de coordenadas geográficas aumentará de abajo hacia 
arriba. Por lo tanto, invierta la dirección al convertir las coordenadas de un sistema 
geográfico al sistema del monitor. Esto se hace cambiando los signos positivo/negativo 
de longitud a lo largo de la dirección y. A continuación se ilustra cómo calcular las 
coordenadas correspondientes a las coordenadas del monitor (winX, winY).
Tanto la extensión geográfica como las áreas de la pantalla del monitor tienen cinco puntos 
importantes (Figura 5.4) utilizado para calcular las proporciones de longitud: el punto central (p0) y sus 
cuatro esquinas (p1, p2, p3 y p4). Las relaciones de longitud incluyen tanto la relación X, que es la 
relación de conversión de longitud de las coordenadas geográficas a las coordenadas del monitor a lo 
largo de la dirección X, como la relación Y a lo largo de la dirección Y. El finalrelación utilizado para 
convertir las coordenadas geográficas en coordenadas del monitor se selecciona entre ratioX o ratioY.
PUNTAS :El uso de proporciones diferentes para los ejes x e y hará que el mapa se 
distorsione en el mapa visualizado.
Apunto de referenciaes otro elemento importante al convertir coordenadas geográficas 
en coordenadas de monitor. Los puntos de referencia podrían ser los centros de ambos 
sistemas, que son (−12,385, −1,61) y (400, 300), o la parte superior izquierda de ambos 
sistemas: (−179,00, 85,78) y (0, 0).
5.2.1 ¿Cómo determinar el valor de la relación?
Figura 5.4muestra el cálculo de ratioX y ratioY basado en los cuatro puntos de esquina.Figura 
5.5muestra las coordenadas del monitor de cuatro puntos de esquina en función de ratioX y 
ratioY. Usando p2 como ejemplo, use la esquina superior izquierda p4 como el
Pensamiento de programación y visualización de datos vectoriales 83
p4 (0, 0) p3 (800, 0) p4 (0, 0)
p3 (1143.94, 0)
Usar
relación Y
Usar
proporciónX
p1 (0, 419.60) p2 p2 (1143.94, 600)
(800, 600) (800, 600)
FIGURA 5.5
Las coordenadas del monitor de los cuatro puntos de las esquinas se basan en la relación X (izquierda) y la relación Y (derecha), utilizando la 
esquina superior izquierda como punto de referencia.
punto de control y ratioX como la relación para convertirlo de las coordenadas geográficas a las 
coordenadas del monitor:
winX(p2) = (X(p2) − X(p4))/ ratioX = (154,23+179,00)/ 0,4165375 = 800 
winY(p2) = (Y(p2) − Y(p4))/ ratioX = (85,78+ 89,00)/ 0,4165375 = 419,60
Al usar ratioY como ratio, para convertirlo de las coordenadas geográficas a las 
coordenadas del monitor:
winX(p2) = (X(p2) − X(p4))/ ratioX = (154,23+179,00)/ 0,2913 = 1143,94 
winY(p2) = (Y(p2) − Y(p4))/ ratioX = (85,78+ 89,00)/ 0,2913 = 600
Como se muestra enFigura 5.5, el uso de ratioX no utilizará los 600 píxeles de altura de la 
ventana; sin embargo, no todas las funciones se mostrarán al usar ratioY (las coordenadas de la 
ventana están fuera de los límites). Por lo general, el más grande debe seleccionarse como el
relaciónvalor para garantizar que todas las funciones se muestren en la pantalla en la etapa de 
inicialización.
Finalmente, transforme las coordenadas geográficas (x, y) en las coordenadas de píxeles de 
la pantalla (winx, winy) después de determinar tanto la proporción como los puntos de 
referencia (X0, Y0) utilizando la siguiente fórmula:
winx = (X–X0)/proporciónX
winy= − (X – Y0)/ratioY (agregue un signo negativo para cambiar la dirección del eje y)
Por ejemplo, si ratioX y un punto superior izquierdo (−179,00, 85,78) son (0, 0), 
cualquier punto (x, y) de los datos GIS servirá como coordenadas para la ventana del 
monitor (Figura 5.6):
winx = (x – (−179.00))/ratioX 
winy= – (y – (85.78))/ratioX
Por lo tanto, los parámetros de entrada dados son los siguientes:
Sistema de coordenadas geográficas: cualquier punto (x, y), minx, miny, maxx, maxy 
Sistema de coordenadas del monitor: tamaño (ancho, alto) y (0, 0) en la esquina izquierda
84Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
(0,0)
(–179,00, 85,78) Ventana dentro del monitor:
(800 × 600)
Datos SIG (–179,00, 89,00, 154,23, 85,78)
FIGURA 5.6
Coordine la conversión utilizando ratioX como ratio y la esquina superior izquierda como punto de referencia.
Las coordenadas del monitor del punto (x, y) se pueden determinar utilizando la 
siguiente fórmula:
ratioX = (maxx-minx)/ancho ratioY 
= (maxy-miny)/alto ratio = 
ratioX>ratioY?ratioX:ratioY winx = 
(x-(minx))/ratio
winy = -(y-maxy)/ratio
5.3 Visualización de datos vectoriales
Una vez que el sistema de coordenadas geográficas se convierte en el sistema 
de coordenadas del monitor, utilice el paquete Tkinter para visualizar los datos. 
El widget Canvas proporciona un fondo de visualización de propósito general 
(tela) para mostrar y manipular gráficos y otros dibujos. El Lienzo es una 
ventana en sí misma y su origen se encuentra en la esquina superior izquierda 
(0, 0). Por lo tanto, cualquier visualización de datos se mostrará en este 
contexto a partir de la esquina superior izquierda de Canvas. Al crear un objeto 
Canvas, existen varios argumentos importantes, como ancho (que especifica el 
ancho de la ventana Canvas), alto (que especifica el alto de la ventana Canvas) y 
bg (que especifica el color de fondo de la ventana Canvas). Al dibujar en Canvas, 
el create_xx (la segunda columna enCuadro 5.2) construirá diferentes gráficos.
Cada uno de estos métodos tomará diferentes argumentos como se indica en la 
tabla. Por ejemplo, create_arc tomará los parámetros de x0, y0, x1, y1, opciones…. El 
punto (x0, y0) definirá el punto superior izquierdo y el punto (x1, y1)
Pensamiento de programación y visualización de datos vectoriales 85
TABLA 5.2
Los widgets de lienzo se pueden crear utilizando diferentes métodos de creación
gráficos Contexto del método Parámetros Uso en notas GIS
algunos simbolosUna rebanada de un
elipse.
crear_arco(x0, y0,
x1, y1, opciones)
(x0, y0, x1, y1) es el
rectángulo en el que el 
eclipse, (x0, y0) y (x1, y1) 
son los dos puntos 
diagonales
Una imagen como
mapa de bits
create_bitmap(x, y,
opciones)
(x, y) es la ubicación del punto
donde se coloca el mapa 
de bits
Mostrar imágenes de trama
Una imagen gráfica. crear_imagen(x, y,
opciones)
(x, y) es la ubicación del punto
donde se coloca la 
imagen
Mostrar imágenes de trama
Una o más líneas
segmentos
crear_línea(x0, y0,
x1, y1,…,
opciones)
(x0, y0, x1, y1,…) es el
lista de los puntos en 
la polilínea, (x0,y0) y
(x1, y1) son los dos 
puntos diagonales
Alguna polilínea
características tales como
ríos, caminos
una elipse; usar
esto también para
dibujando círculos,
qué área
caso especial de 
una elipse.
crear_oval(x0, y0,
x1, y1, opciones)
(x0, y0, x1, y1) es el
rectángulo en el que el 
eclipse, (x0, y0) y (x1, y1) 
son los dos puntos 
diagonales
Algunas características de elipse
o símbolos
Un polígono. crear_polígono(x0,
y0, x1, y1,…,
opciones)
(x0, y0, x1, y1,…) es el
lista de los puntos en el 
polígono
Algún polígono
características tales como
lagos, mar, ciudades
Un rectángulo. crear_
rectángulo(x0, y0,
x1, y1, opciones)
(x0, y0, x1, y1) es el
rectángulo, (x0,y0) y
(x1, y1) son los dos 
puntos diagonales
Un borde de mapa, etc.
anotación de texto. crear_texto(x, y,
opciones)
(x, y) es la ubicación del punto
donde se coloca el texto
Leyenda de textura
un rectángulo
ventana.
crear_ventana(x,
y,opciones)
(x, y) es la ubicación del punto
donde se coloca la 
ventana
Un lienzo para dibujar el
mapa
definir el punto inferior derecho del rectángulo (en el que se dibujará el arco). Hay 
muchas opciones, como inicio (el ángulo inicial de un arco), extensión (el ancho del 
arco en grados) y relleno (el color utilizado para rellenar el arco). Figura 5.7muestra 
cómo crear un objeto Canvas y crear tres arcos usando los mismos puntos de 
rectángulo, pero con diferentes colores y extensiones. Como se ilustra, el ángulo 
comienza desde un eje x positivo y va en sentido contrario a las agujas del reloj.
Como se muestra enFigura 5.7a, el código fuente crea una ventana, donde se 
dibuja Canvas creando un arco de 30 grados (270 grados rojo, 60 grados azul y 30 
grados verde).
86Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
(a) (b)
desde la importación de Tkinter*
raíz = Tk()
can = Canvas(raíz, ancho = 800, alto = 600) 
can.pack ()
xy = 20, 20, 300, 180
can.create_arc(xy, inicio=0, extensión=270, relleno="rojo") 
can.create_arc(xy, inicio=270, extensión=60, relleno="azul") 
can.create_arc(xy, inicio=330, extensión = 30, relleno = "verde") 
root.mainloop ()
(C)
FIGURA 5.7
Crea un arco con Tkinter. (a) Código fuente, (b) Dibujar arco, (c) Dibujar línea.
QA: reemplace las líneas 6, 7 y 8 con la siguiente línea:
can.create_line (1,2,35,46,5,6,76,280,390,400)
Luego ejecute el código y verifique la GUI para ver si es lo mismo que 
Figura 5.5c.
5.4 Punto, Polilínea, Polígono
Los tres tipos de datos de entidades SIG más populares incluyen punto, polilínea y 
polígono. Deben seleccionarse métodos adecuados para visualizar cada uno de 
ellos. Cuadro 5.1enumera los métodos disponibles para visualizar diferentes tipos 
de gráficos. La polilínea y el polígono pueden coincidir con los métodos create_line() 
y create_polyon(). El punto se puede representar usando otros métodos como 
create_rectangle() o create_arc(). Conocer el tamaño específico de un arco y un 
rectángulo es importante al rellenarlo con un color, formar un círculo o un punto. 
Por lo tanto, los datos de punto, polilínea y polígono se pueden visualizar utilizando 
create_arc(), create_line y create_polygon, respectivamente.
Dentro de los argumentos de create_arc(xy, inicio, extensión, relleno=color),
• xy puede ser una lista de [x0, y0, x1, y1, … xn, yn]
• el inicio y la extensión pueden ser los predeterminados, que es todo el círculo
• el color de relleno se puede tomar como símbolos de visualización de características definidos por los 
usuarios
Pensamiento de programación y visualización de datos vectoriales 87
FIGURA 5.8
Un mapa GIS de Python simple con puntos, polilíneas y polígonos visualizados.
Dentro de los argumentos de create_line(xy, opciones):
• xy puede ser una lista de [x0, y0, x1, y1, x2, y2, …]
• las opciones pueden ser
• relleno: para especificar el color de la línea
• ancho: para especificar el ancho de píxel de la línea
Dentro de los argumentos de create_polygon(xy, opciones):
• xy puede ser una lista de [x0, y0, x1, y1, x2, y2, …., x0, y0]. Nota: el primer y 
último punto son iguales
• las opciones incluyen
• relleno: para especificar el color de relleno del polígono
• contorno: especifique el color de la línea del borde
• ancho: para especificar el ancho de píxel de la línea del borde
Con estos métodos, los datos de puntos, polilíneas y polígonos dibujados en 
Figura 5.1se puede visualizar en Python Tkinter Canvas comoFigura 5.8.
5.5 Pensamiento de programación
Escribir código implica una forma de pensar que es ajena a la mayoría de las personas; 
sin embargo, escribir código no es un proceso único y es un proceso analítico. Practicar 
los siguientes pasos mejorará las habilidades de programación.
88Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
5.5.1 Análisis de problemas
El primer paso en la programación es analizar el problema y comprender los 
requisitos detallados. Uno de los requisitos del problema deCapítulo 3es crear 
un polígono y calcular la longitud del borde del polígono. Parte de los requisitos 
del problema deCapítulo 4son programar las coordenadas de dos polilíneas y 
calcular la longitud de las polilíneas.
5.5.2 Piense en Programación
El segundo paso es pensar desde una perspectiva de programación, considerando 
varios factores:
• ¿Cuántos componentes deben incluirse en el código? por ejemplo, 
en elCapítulo 4problema, se incluyen tres componentes (Figura 5.9
).
• ¿Cuál es la secuencia de estos componentes? Una vez determinados los 
componentes, piense en la secuencia de programación. ¿Qué 
componente debe ejecutarse primero y cuál debe seguir?
• Por último, piense en cómo diseñar estructuras de datos y programas, y 
organizar las estructuras de datos y programas para que sean simples, 
reutilizables y de naturaleza orientada a objetos. Saber gestionar la 
creación de objetos, componer objetos en estructuras más grandes, 
coordinar el flujo de control entre objetos y obtener los resultados en la 
secuencia obtenida de los análisis de problemas.
p2
p3
p4 p5 Calcula el
longitudp7
p1 p6
p8 p1 p2 p3 p4 p5 p6 ...
Componente 1:
Leer datos del archivo.
Componente 2: Analice y 
organice los datos como 
puntos y cree una polilínea
objetos.
Componente 3:
Calcula el
longitud de
polilínea.
FIGURA 5.9
Programación de componentes/pasos para elCapítulo 4problema.
Pensamiento de programación y visualización de datos vectoriales 89
5.5.3 Coincidencia de patrones y estructura del lenguaje de programación
Ahora, haga coincidir los componentes y secuencias de programación (diseño de 
componentes programables) con estructuras y patrones de lenguaje (Proulx 2000). 
Un programa se puede implementar utilizando diferentes lenguajes de 
programación y puede hacer coincidir los componentes con una estructura de 
lenguaje más familiar. Hay varios patrones a seguir para implementar cada 
componente.
• Primero: coincidencia funcional. Similar aCapítulo 4Las operaciones de archivo 
de, la lectura de datos del archivo (componente 1) puede abrir, leer y cerrar el 
archivo de diferentes maneras. Analizar y organizar datos como puntos y crear 
objetos de polilínea es similar a analizar datos de un archivo de texto (usando 
dividir() y operaciones de lista), crear objetos de punto y crear objetos de 
polilínea definiendo y usando Punto, Clases de polilínea y su relación de 
composición .
• Segundo: coincidencia secuencialdiferentes componentes. La secuencia de 
los tres componentes (Figura 5.5) significa que primero debe leer los datos, 
analizarlos y crear objetos, y luego calcular la longitud de la polilínea. Las 
operaciones de archivo son el orden de apertura, lectura y cierre de 
archivos.
• Tercero: datos detallados y coincidencia de estructura de programación. El cálculo de la 
longitud de la polilínea, por ejemplo, agrega muchas longitudes de segmento de línea a 
través de un bucle. El almacenamiento de una lista de puntos utiliza el tipo de datos de 
lista. El análisis de coordenadas utiliza la división y la conversión de datos para cada 
coordenada en forma de bucle.
5.5.4 Implementar programa
Después del análisis, la programación con estructuras y patrones de lenguaje familiar 
debería funcionar en el siguiente orden:
• Leer datos del archivo.
• Agregue clases de puntos y polilíneas y enumere las estructuras de datos para contener los 
conjuntos de datos antes de analizarlos.
• Analizar datos en una lista de coordenadas o puntos.
• Cree un objeto de punto y polilínea antes de usar un objeto de polilínea.
• Llame al método para calcular la longitud de la polilínea.
Una vez desarrollada la primera versión del programa,
• Una vez más, ordene la lógica de la programación, solucione cualquier 
problema restante y optimice los códigos.
90Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
• Depurar y probar los resultados del programa desarrollado.
PUNTAS :En el proceso de pensamiento de programación, habrámomentos en los que no 
esté tan familiarizado con el patrón o la estructura en particular. Entonces, en efecto, hay 
varias formas de realizar la búsqueda:
• Busque patrones similares escritos en "programación Python..." 
reemplazando el... con el patrón o la estructura necesaria.
• Busque el documento de ayuda desde Python IDLE (si no hay Internet 
disponible) escribiendo la parte … en el cuadro de búsqueda de ayuda.
• Discutir con los compañeros: hay patrones problemáticos similares. De lo contrario, 
publique un mensaje o una pregunta en el blog de programación de Python.
Cuantos más patrones practique, más experimentado se volverá un programador para 
encontrar una solución.
5.6 Experiencia práctica con Python
5.6.1 Lectura, análisis sintáctico y análisis de datos de archivos de texto
Pruebe el Código 5.3 para el problema del último capítulo y revise el proceso de 
pensamiento de programación presentado en este capítulo.
"""
Capítulo 4
Leer los siguientes datos: 
Polilínea;
1: 1603714.835939442,142625.48838266544; 1603749.4678153452,142620.212 
43656706; 1603780.3769339535,142607.37201781105; 1603801.475846678,142 
582.27024446055; 1603830.4767344964,142536.14692804776;
2: 1602514.2066492266,142330.66992144473; 1602521.4127475217,142414.92 
978276964; 1602520.1146955898,142433.93817959353; 1602501.3840010355,1 
42439.12358761206; 1602371.6780588734,142417.84858870413; 1602351.6610 
373354,142408.02716448065; 1602334.5180692307,142388.58748627454; 160 
2331.6999511716,142376.66073128115; 1602334.8067251327,142348.9653227 32; 
1602338.308919772,142323.6111663878; 1602349.0226452332,142314.50 
124930218; 1602363.9090971674,142310.79584660195; 1602514.2066492266, 
142330.66992144473;
El código 5.3 define la función 'readPolylineFile' para leer datos línea por 
línea. La función readPolylineFile devolverá dos valores: polilíneas y
Pensamiento de programación y visualización de datos vectoriales 91
> > > importarMatemáticas
> > > clasePuntos:
definitivamente__en eso__(uno mismo, x=0.0, y=0.0):
self.x,self.y = x, y
> > > clasePolilínea:
definitivamente__en eso__(uno mismo, puntos =[]):
self.puntos = puntos
definitivamenteobtenerLongitud(uno mismo):
yo = 0
longitud = 0,0
tiempoyo <Len(auto.puntos)-1:
length += math.sqrt((self.points[i+1].x
- self.puntos[i].x)**2 + 
(self.puntos[i+1].y -self.
puntos[i].y)**2 )
yo += 1
devolverlongitud
#
# # función para leer datos línea por línea y
# # obtener todos los puntos de ambas líneas
# # devuelve dos objetos: lista de puntos y
# # el número de puntos de la primera línea
> > > definitivamentereadPolylineFile(Nombre del archivo):
f =abierto(Nombre del archivo,'r') polilíneas, 
puntos, índice = [], [],0 firstPolyLineNum = 0
porlíneaenF:
índice += 1
siíndice == 1:
Seguir
coords = linea.dividir(':')[1] cadacoords 
= coords.split(';') longitudcoords =Len
(cadacocords) siíndice == 2:
firstPolyLineNum = coordsLen-1 impresión'El 
primer número de polilínea es: ', 
primerPolyLineNum
porienrango(coordsLen-1):
singlecoords = cadacoords[i]
# imprime 'coords unicos,', coords unicos 
xCoord = singlecoords.split(',')[0] yCoord = 
singlecoords.split(',')[1]
# imprime 'xCoord y yCoord, ', xCoord, yCoord
punto = Puntos(flotar(xCoord),flotar(yCoord)) 
puntos.append(punto)
f.cerrar()
devolverpuntos, firstPolyLineNum
El primer número de polilíneaes: 5
CÓDIGO 5.3
Lea desde un archivo de texto y cree una polilínea para contener datos y analizar datos. (Continuado)
92Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
# # llamar a la función para leer datos y ponerlos en la lista de puntos
> > > resultados = readPolylineFile('polilíneasHw4.txt')
> > > puntos = resultados[0]
> > > firstPolylinePointNum = resultados[1]
> > > longitud =Len(puntos)
> > > impresión'El total de puntos y el número de puntos para
primera polilínea es ',\
longitud, firstPolylinePointNum
los puntos totalesyel numero de puntosporprimerapolilíneaes18 5
# # Obtiene los puntos para la primera polilínea y calcula la longitud
> > > puntosParaPrimerPoly = puntos[0:firstPolylinePointNum]
> > > polyLine1 = Polyline(pointsForFirstPoly)
> > > lengthForFirstPoly = polyLine1.getLength()
> > > impresión"Longitud de la primera polilínea -> ", longitudParaPrimerPoly
Longitudporprimera polilínea -> 155.775923237
# # Obtiene los puntos para la segunda polilínea y calcula la longitud
> > > puntosParaSecondPoly = puntos[firstPolylinePointNum:]
> > > polyLine2 = Polyline(pointsForSecondPoly)
> > > lengthForSecondPoly = polyLine2.getLength()
> > > impresión"Longitud de la segunda polilínea ->", longitudParaSegundoPoly
LongitudporSegunda polilínea -> 549.438874589
CÓDIGO 5.3 (Continuado)
Lea desde un archivo de texto y cree una polilínea para contener datos y analizar datos.
firstpolylineNum, que se refiere a cuántos puntos tenemos para la primera 
polilínea.
5.6.2 Crear objetos SIG y verificar intersección
una.Planteamiento del problema: Cree cuatro puntos aleatorios y cuatro rectángulos 
aleatorios, y averigüe si alguno de los puntos está ubicado dentro de alguno de los 
rectángulos. Escriba los resultados en un archivo de texto.
b.Programación pensando en el problema: El flujo de trabajo de este proceso es (a) 
crear cuatro puntos, (b) crear cuatro rectángulos y (c) verificar cada punto para 
determinar si está en alguno de los rectángulos. El problema involucra dos 
estructuras de datos: clases Point y Rectangle. Primero, los patrones de "clases 
declaradas" para Puntos y Rectángulos contendrán conjuntos de datos 
relevantes creados a partir del método aleatorio del módulo aleatorio.
La clase Punto y la clase Rectángulo se pueden definir con los 
siguientes atributos y funciones (Figura 5.10).
# #1. Declare la clase Point 
class Point:
pasar##implementarme
Pensamiento de programación y visualización de datos vectoriales 93
(a) (b)
FIGURA 5.10
Se crearán dos clases para el problema del punto y el rectángulo.
# #2. Declare la clase Rectangle 
class Rectangle:
pasar##implementarme
El problema requiere crear cuatro puntos y rectángulos aleatorios, lo que 
indica que se deben incluir los siguientes dos pasos en el programa:
# #3. Genera cuatro puntos 
puntos = []
para i en el rango (4):##Bucle 4 veces
pasar##implementarme
# # 4.Generar cuatro rectángulos 
rectángulos=[]
para i en el rango (4):##Bucle 4 veces
pasar##implementarme
Para verificar cada uno de los cuatro puntos, recorra los cuatro puntos y verifique si 
cada uno de los puntos está en alguno de los cuatro rectángulos, y luego recorra los 
cuatro rectángulos. Esto requerirá un doble bucle para procesar.
# #5. Verifique qué punto está en qué rectángulo y registre el resultado para i en 
el rango (4):
para j en el rango (4):
# verificar si los puntos [i] están en rectángulos [j] y registrar los resultados en un pase de 
archivo ## Implementarme
Hay dos componentes en el último proceso de verificación: (a) cómo verificar si un punto 
está dentro de un rectángulo (el método contains() en la clase de rectángulo) y cómo 
escribir los resultados en un archivo (el archivo abre, escribe, y patrón cerrado). Dado que 
el archivo debe escribirse a medida que avanza a través de los bucles dobles,
94Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > importaraleatorio
# # 1. Declarar la clase Point
> > > clasePunto:
definitivamente__en eso__(uno mismo, x = 0.0, y = 0.0):
self.x = x
self.y = y
# # 2. Declarar la clase Rectángulo
> > > claseRectángulo: definitivamente
__En t__(uno mismo):
# # Un rectángulo puede ser determinado por (minX, maxX) 
(minY, maxY)
self.minX = self.minY = 0.0 
self.maxX = self.maxY = 1.0
definitivamentecontiene(yo, punto):## Comprobar si un punto está dentro
un rectángulo
pasar## Implementarme
# # 3. Generar cuatro puntos
# definir una lista de puntos para mantener cuatro puntos
> > > puntos = []
# genera cuatro puntos y los agrega a la lista de puntos
> > > pasar## Implementarme
# # 4. Generar cuatro rectángulos
# definir una lista Rectángulo> > > rectas = []
> > > porienrango(4): rectángulo = 
Rectángulo()
# # Generar x
x1 = aleatorio.aleatorio()
x2 = aleatorio.aleatorio()
# # asegúrese de minX != maxX 
tiempo(x1 == x2):
x1 = aleatorio.aleatorio()
six1<x2:
rectángulo.minX=x1
rectángulo.maxX=x2
elifx1>x2:
rectángulo.minX=x2
rectángulo.maxX=x1
# # Desarrollar códigos para generar valores y
# # y asegúrese de que el rectángulo no sea una línea debajo 
pasar## Implementarme
# # añadir a la lista 
rects.append(rectángulo)
# # 5. Agregue código para verificar qué punto está en qué rectángulo
> > > listaresultados = []## Y usa una lista para guardar los resultados
> > > pasar## Implementarme
# # 6. escribir los resultados en el archivo
> > > f=abierto('HM5_Resultado.txt','w')
> > > porresultadoenlista de resultados:
f.escribir(resultado+'\norte')
> > > f.cerrar()
CÓDIGO 5.4
Generar cuatro puntos, rectángulos, verificar las relaciones de contiene () y enviar los resultados a un archivo 
de texto.
Pensamiento de programación y visualización de datos vectoriales 95
ábralo antes de entrar en el ciclo y ciérrelo después de salir del ciclo. Escribe el 
archivo al ejecutar los bucles.
El método random.random() puede generar los mismos valores para x1 y x2 o 
y1 e y2 (lo que significa una línea en lugar de un rectángulo). Esto se puede 
manejar agregando un método para verificar si son iguales para evitar un 
rectángulo no válido.
Con base en este proceso de pensamiento de programación, los códigos de programación se 
pueden desarrollar en el flujo del Código 5.4:
5.7 Resumen del capítulo
Este capítulo presenta cómo pensar como un programador utilizando la visualización de 
datos vectoriales GIS e incluye
• Análisis de problemas
• La coincidencia de patrones
• Transformación de coordenadas
• Dibujo de datos vectoriales en Canvas
• Se utilizan dos ejemplos de codificación para demostrar el proceso de 
pensamiento de programación: (a) leer, analizar y calcular la longitud 
de las polilíneas, y (b) generar puntos y rectángulos aleatorios; y 
verifique la relación de contenido entre cada punto y rectángulo
PROBLEMAS
1. Hay un módulo llamado random en Python; impórtelo y use su método 
random() para generar un número aleatorio de 0 a 1.
2. Existe un algoritmo popular en GIS para encontrar si un punto está dentro 
de un rectángulo en función de sus respectivas coordenadas de punto (x, y 
y minx, miny, maxx, maxy). Describe el algoritmo en un algoritmo 
matemático usando (x, y y minx, miny, maxx, maxy).
3. Escriba un programa para (a) generar m cantidad de puntos y n cantidad de 
rectángulos (m y n se pueden cambiar a través de la entrada del usuario), (b) 
verificar qué puntos están en qué rectángulos.
4. Programe para escribir las coordenadas de los puntos y las coordenadas de los puntos de los 
rectángulos en un archivo de texto, y luego escriba el resultado de (2) en el archivo de texto.
5. En un documento de Word, explique el algoritmo y el programa de "punto en el 
rectángulo" creado, y codifique el programa en un archivo .py para encontrar qué 
punto generado en (3) está dentro de qué rectángulo generado en (3). Luego 
verifique la salida del archivo de texto.
http://taylorandfrancis.com
6
Manejo de archivos de forma
Una de las funciones más importantes del software GIS es leer los formatos de archivo de datos 
GIS populares, como los archivos de forma. Un archivo de forma es un formato de archivo de 
datos binarios desarrollado originalmente por ESRI y ha sido ampliamente utilizado para 
intercambiar datos vectoriales entre diferentes profesionales y comunidades SIG (ESRI 1998). 
Este capítulo presenta cómo se formatean los archivos de formas y cómo leerlos con Python, es 
decir, leer datos binarios, leer un encabezado de archivo de formas, leer un archivo de formas 
de puntos y leer archivos de formas de polilíneas y polígonos.
6.1 Manipulación de datos binarios
Los archivos de forma están en formato binario y el módulo de Python para manipular 
datos binarios se conoce comoestructura. losestructuraEl módulo tiene una serie de 
funciones para leer y escribir datos en formato binario. Esta sección presenta cómo 
podemos usar elestructuramódulo para manejar datos binarios.
estructuramaneja datos binarios convirtiendo datos de un lado a otro entre su formato 
original y el formato binario. La función de paquete deestructurase utiliza para convertir 
datos a un formato binario. Por ejemplo, la siguiente declaración devuelve una cadena 
binaria que contiene los valores v1, v2, … empaquetados de acuerdo con el formato dado
fmt. Los argumentos deben coincidir exactamente con los valores requeridos por el 
formato.
estructura.paquete(fmt, v1, v2, …)
La función de desempaquetar deestructurase utiliza para interpretar datos binarios a 
su valor original (Código 6.1). Por ejemplo, la siguiente declaración desempaqueta el 
binario (presumiblemente empaquetado porestructura.paquete(fmt, v1, v1, …)) según el 
formato dadofmt. El resultado es una tupla, incluso si contiene un solo elemento. Los 
datos binarios deben contener exactamente la misma cantidad de datos que requiere el 
formato, es decir, len (datos binarios) debe ser igual a calcsize (fmt).
struct.unpack(fmt, datos binarios)
losestructurael módulo debe importarse antes de usarlo (la primera declaración del 
Código 6.1). El código también demuestra cómo empaquetar dos números enteros (100, 
200) representados por variables (x, y) en una cadena binaria. La cadena 'ii' se usa para 
representar dos valores enteros con cada 'i' representando un entero. El quinto
97
98Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
importarestructura
x,y = 100,200
s = estructura.paquete('ii',x,y) 
impresións
resultado = struct.unpack('ii',s) 
impresiónresultado
CÓDIGO 6.1
Ejemplos de métodos de empaquetado y desempaquetado del módulo struct.
CUADRO 6.1
Caracteres de formato
Carácter de formato Tipo C Tipo de pitón Tamaño estándar
C
B
B
?
h
H
i
yo
yo
L
q
q
F
d
carbonizarse
carácter firmado
carácter sin firmar
_Bool
corto
corto sin firmar
En t
int sin firmar
largo
largo sin firmar
largo largo
sin firmar mucho tiempo
flotar
doble
cadena de longitud 1 
Entero
Entero
bool
Entero
Entero
Entero
Entero
Entero
Entero
Entero
Entero
Flotar
Flotar
1
1
1
1
2
2
4
4
4
4
8
8
4
8
> > > importarestructura
> > > i,b,x,y,z = 100,Verdadero,-180.0,90,0.212
> > > s = estructura.paquete('<ibdfd',i,b,x,y,z)
> > > Len(s)
> > > resultado = estructura.desempaquetar('<i?dfd',s)
> > > impresiónresultado
(100, Verdadero, -180,0, 90,0, 0,212)
CÓDIGO 6.2
Empaquetar y desempaquetar diferentes tipos de datos utilizando el formato adecuado.
declaración desempaqueta la cadena binaria en su valor de datos original (100, 200). La 
cadena 'ii' es importante y se la conoce como la cadenaformato(denotado comofmt), que 
se utiliza para especificar el formato esperado y es necesario para llamar a los métodos 
de empaquetado y desempaquetado.Tabla 6.1detalla los caracteres de formato utilizados 
en la cadenafmtpara especificar el formato para empaquetar y desempaquetar datos 
binarios.
El código 6.2 muestra cómo empaquetar diferentes formatos utilizando los caracteres de 
formato. Cinco variables que representan cinco valores en tipos de datos de entero, booleano,
Manejo de archivos de forma 99
TABLA 6.2
Carácter inicial de estructura
Personaje Orden de bytes Tamaño Alineación
@
=
<
>
!
nativo
nativo
little-endian
big-endian
red (= big-endian)
nativo
estándar
estándar
estándar
estándar
nativo
ninguna
ninguna
ninguna
ninguna
doble, flotante y doble están empacados. La longitud total de la cuerda empaquetada es 
4(i) + 1(b) + 8(d) + 4(f) + 8(d) = 25. Como elestructurael paquete sigue el estándar C, se 
utiliza el tipo C. Python tiene menos tipos de datos; sin embargo, el tamaño estándar de 
cada tipo de datos se puede mantener si el primer carácter de la cadena de formato se 
indica mediante el orden de bytes, el tamaño y la alineación de los datos empaquetados.De forma predeterminada, se utilizará @ si el primer carácter no es uno de los 
caracteres proporcionados enCuadro 6.2abajo:
• El orden de los bytes nativos es big-endian o little-endian, según el 
sistema host. Por ejemplo, Intel x86 y AMD64 (x86-64) son little endian; 
Motorola 68000 y PowerPC G5 son big-endian; ARM e Intel Itanium 
cuentan con endian-ness conmutable (bi-endian). Usar sist. byteorder 
para verificar el endian-ness del sistema.
• El tamaño nativo y la alineación se determinan utilizando el compilador de C.
tamaño deexpresión. Esto siempre se combina con el orden de bytes 
nativo.
• El tamaño estándar depende únicamente del carácter de formato como se define en 
Tabla 6.1arriba.
• Tenga en cuenta la diferencia entre '@' y '=': ambos usan el orden de bytes nativo, pero 
el tamaño y la alineación del último están estandarizados.
• La forma '!' se usa cuando no podemos recordar si el orden de bytes de 
la red es big-endian o little-endian.
Orden de bytes*El concepto también se utiliza en el formato ESRI Shapefile. Los órdenes de 
bytes big-endian y little-endian son dos formas de organizar palabras de varios bytes en la 
memoria de la computadora o en el disco de almacenamiento. Cuando se usa el orden big-
endian, el primer byte es la parte más grande de los datos, mientras que el primer byte es la 
parte más pequeña de los datos cuando se usa el orden little-endian. Por ejemplo, al almacenar 
una representación hexadecimal de un número entero de cuatro bytes 0×44532011
* “Endianidad”. Wikipedia. Fundación Wikipedia, Inc.,http://en.wikipedia.org/wiki/ Endianidad.
http://en.wikipedia.org/wiki/Endianness
http://en.wikipedia.org/wiki/Endianness
100Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
TABLA 6.3
Entero de cuatro bytes 0×44532011 en el Almacenamiento
Big Endian
Little-Endian
44 53 20 11
11 20 53 44
importarestructura
x,y,z = 100,200,300
s = estructura.paquete('>iii',x,y,z) 
impresións
resultado = struct.unpack('>iii',s) 
impresiónresultado
resultado = struct.unpack('<iii',s) 
impresiónresultado
CÓDIGO 6.3
Empaquetar y desempaquetar debe usar el mismo orden de bytes.
# Este código debe escribirse en la ventana interactiva 
importarestructura
x, y, z = 100, 200, 300
s = struct.pack('<iii',x,y,z) #codificación little_endian
s
'd\x00\x00\x00\xc8\x00\x00\x00,\x01\x00\x00' s = 
struct.pack('iii',x,y,z) #codificación predeterminada s
'd\x00\x00\x00\xc8\x00\x00\x00,\x01\x00\x00'
CÓDIGO 6.4
El orden de bytes predeterminado es little-endian para nuestras computadoras.
(Cuadro 6.3) utilizando el formato binario de orden big-endian, la secuencia de bytes 
sería "44 53 20 11".
• Para el orden de bytes big-endian, utilice '>' al empaquetar o desempaquetar los 
bytes, por ejemplo, struct.unpack('>iiii', s).
• Para el orden de bytes little-endian, use '<', por ejemplo, struct.unpack('<iiii', s).
• Si se mezclan estos dos, por ejemplo, empaquetar usando '>' y desempaquetar 
usando '<', se generará un resultado inesperado, como se muestra en la última 
declaración del Código 6.3.
Al construir la cadena formateada, se debe especificar el orden de los bytes. En 
ausencia de un símbolo de orden de bytes,embalaje y desembalajeutilizará little-endian 
por defecto para PC (Código 6.4). Los resultados de dos códigos no muestran diferencia. 
Los resultados son hexadecimales, es decir, 0x 00000064 representa 100, 0x 0000c8 
representa 200 y x0000012c representa 300. Más información estructuray la información 
de formato se puede encontrar enhttp://docs.python.org/library/ struct.html.
http://docs.python.org/library/struct.html
http://docs.python.org/library/struct.html
Manejo de archivos de forma 101
6.2 Introducción a Shapefile
Un archivo de forma incluye varios archivos con el mismo nombre de archivo y diferentes extensiones 
de archivo. Cada conjunto de datos vectoriales se almacena en varios archivos, como .shp (archivo 
principal), .shx (archivo de índice), .dbf (archivo dBASE), .prj (archivo de proyección), etc. (Figura 6.1). El 
archivo principal, el archivo de índice y el archivo dBASE son necesarios para todo software GIS que 
funcione con archivos de forma. El triple debe tener el mismo nombre, por ejemplo, mymap.shp, 
mymap.shx y mymap.dbf:
• . shp: El archivo .shp contiene los vértices de todas las entidades (Figura 6.1). 
Los vértices se organizan jerárquicamente en entidades/registros, partes y 
puntos. El archivo .shp también contiene información sobre cómo leer los 
vértices (es decir, como puntos, líneas o polígonos). Algunos atributos 
importantes también pueden denominarse tercera dimensión (medidas) y 
almacenarse en el archivo .shp.
• . shx: se mantiene un índice para cada registro, y es beneficioso para encontrar los 
registros más rápidamente.
• . dbf: la información de atributos se almacena en el archivo .dbf asociado con cada 
archivo .shp. El archivo .dbf contiene tablas de dBASE y almacena atributos 
adicionales que no se pueden mantener en las características de un archivo de 
forma. Contiene exactamente la misma cantidad de registros que funciones en el 
archivo .shp (de lo contrario, los datos no podrían interpretarse). Los registros 
pertenecen a las formas secuencialmente, lo que significa que el primer, segundo y 
tercer registro pertenecen, respectivamente, a la primera, segunda y tercera entidad 
del archivo .shp. Si editamos el .dbf con una herramienta de terceros y alteramos los 
registros, es posible que se pierda el pedido. Se puede encontrar más información en 
el libro blanco de formato de archivo de forma de ESRI (ESRI 1998).
Hay más de 14 tipos de características compatibles con los archivos de formas, como puntos, 
polilíneas y polígonos. Las características 3D se agregan a la estructura del archivo de forma con una 
dimensión dedicada al valor z.
FIGURA 6.1
Estructura del archivo de forma. (Adaptado de ESRI. 1998. ESRI Shapefile Technical Description. An ESRI White 
Paper, 34.)
102Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
6.3 Estructura e Interpretación del Shapefile
6.3.1 Estructura del archivo principal de un Shapefile
El archivo principal contiene un encabezado de archivo y todos los registros de características (Figura 6.2). 
Cada registro de característica se compone de un encabezado de registro y contenidos de registro.
6.3.1.1 Encabezado del archivo principal
Figura 6.3muestra el formato del encabezado del archivo, incluidos 100 bytes. Los primeros 4 bytes indican 
que este archivo es un archivo de forma con un valor entero de 9994. Los bytes 4 a 24 son el número entero 0 
y están reservados para uso futuro. Los primeros 28 bytes, incluidos los campos de descripción de datos del 
encabezado del archivo y la longitud del archivo (entero en los bytes 24–27), son
FIGURA 6.2
Estructura del archivo principal de Shapefile.
FIGURA 6.3
Encabezado de archivo del archivo principal de forma.
Manejo de archivos de forma 103
en orden de bytes big-endian, y se requiere '>' para desempaquetar los bytes, por ejemplo, 
estructura.desempaquetar('>iiiiiii', s). La unidad para la longitud total del archivo de formas es 
una palabra de 16 bits, es decir, la longitud total del archivo en bytes sería el doble del valor del 
número interpretado.
El resto del encabezado del archivo está en orden de bytes little-endian, y se requiere '<' para 
descomprimirlos, por ejemplo,estructura.desempaquetar('<iiii', s). Omita el '<' ya que es el valor 
predeterminado para empaquetar o desempaquetar en la mayoría de las PC. A partir del byte 
28, un número entero de 4 bytes (valor de 1000) se refiere a la versión del archivo de forma. A 
partir del byte 32, un entero de 4 bytes, indica el tipo de forma de la entidad (p. ej., 1 significa 
que el archivo es para la entidad Punto y 3 indica que es un archivo de polilínea,Figura 6.3
Correcto). El byte 36 al 100 es el cuadro delimitador de todo el conjunto de datos en el archivo 
de formas. El cuadro delimitador incluye cuatro dimensiones x,y, z y m. Cada dimensión incluye 
valores mínimos y máximos en la secuencia de minx, miny, maxx, maxy, minz, maxz, minm y 
maxm. El cuadro delimitador debe escribirse con fmt '<dddddddd' para todos los valores en 
tipo de datos doble.
práctica práctica: Interpretar el encabezado del archivo de forma (Código 6.5)
• Abra la consola GUI de Python.
• Copie los datos proporcionados, incluidos Schools.shp, Schools.shx, Schools.dbf, 
en c:\code\data\.
• Practique el Código 6.5 con la GUI del intérprete de Python.
Las primeras tres declaraciones tienen 28 bytes del archivo de forma. La cuarta 
declaración descomprime los datos en orden big-endian y tiene siete números enteros. El 
primer entero es 9994, el código de archivo para archivos de forma. Los siguientes cinco 
son cero y están reservados para uso futuro. El último es la longitud del archivo, que es la 
longitud total del archivo principal de forma en unidades de 16 bits o dos bytes. Por lo 
tanto, la longitud total real del archivo es el doble del valor indicado (es decir, 288 * 2 = 
576) bytes. La siguiente instrucción lee 72 bytes y los desempaqueta utilizando el orden 
de bytes little-endian para obtener dos enteros y ocho valores dobles. La primera, con un 
valor de 1000, es la versión de shapefile. El segundo, con valor 1, indica que el tipo de 
característica del archivo de formas es Punto. Los cuatro siguientes se refieren a
> > > importarestructura
> > > f =abierto('Escuelas.shp','rb')
> > > s = f.leer(28)
> > > b = estructura.desempaquetar('>iiiiiii',s)
> > > impresiónb
(9994, 0, 0, 0, 0, 0, 288)
> > > s = f.leer(72)
> > > b = estructura.desempaquetar('<iidddddddd',s)
> > > impresiónb
(1000, 1, 1847318.8628035933, 765532.64196603, 1859639.8841250539, 
778092.9935274571, 0.0, 0.0, 0.0, 0.0)
CÓDIGO 6.5
Interpretación del encabezado del archivo principal del shapefile.
104Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
minx, miny, maxx, maxy, respectivamente, y minz, maxz, minm, maxm son todos ceros ya 
que estas dos dimensiones no se utilizan en este archivo de formas.
6.3.1.2 Registro de características
Figura 6.4muestra el encabezado del registro y la estructura de contenido para un archivo de forma de 
punto. El encabezado del registro es el mismo para todos los tipos de forma, mientras que el 
contenido del registro es diferente para diferentes tipos de características y características específicas. 
El encabezado del registro incluye 8 bytes, donde los primeros 4 bytes indican el número de registro 
secuencial y los 4 bytes siguientes indican la longitud del contenido del registro. El encabezado del 
registro está en orden de bytes bigendian. El contenido del registro para cada característica de punto 
incluye 20 bytes, y los primeros 4 bytes representan el tipo de característica, que es 1 para todos los 
puntos, 8 bytes para la coordenada x y 8 bytes para la coordenada y (Figura 6.5). El contenido del 
registro está en orden de bytes little-endian para el contenido del registro Point.
práctica práctica: Interpretar el archivo de formas de puntos (Código 6.6)
• Abra la ventana de edición de archivos de Python.
• Copie los datos, incluidos Schools.shp, Schools.shx, Schools.dbf en c:
\code\data\.
• Escriba el siguiente código en la ventana del editor de Python.
FIGURA 6.4
Encabezado y contenido del registro de puntos.
FIGURA 6.5
Estructura de archivos para el archivo Point .shp.
Manejo de archivos de forma 105
> > > importarestructura
> > > f =abierto('Escuelas.shp','rb')
> > > f.buscar(24)
> > > s = f.leer(4)#Obtener la longitud del archivo
> > > b = estructura.desempaquetar('>yo',s)##La longitud del archivo es de orden big-endian
entero
> > > featNum = (b[0]*2-100)/28##Cálculo de los números de característica
> > > fuera =abierto('escuelas_shp.txt','w')
> > > porienrango(número de hazaña):
f.buscar(100+i*28+12)
s = f.leer(16)##16 bytes con 8 bytes para x e y
x,y = estructura.desempaquetar('dd',s)##orden little-endian por defecto 
fuera.escribir(calle(yo)+':'+calle(x)+','+str(y)+'\norte')
> > > f.cerrar()
> > > fuera.cerrar()
CÓDIGO 6.6
Lea el archivo de formas de puntos y escriba los resultados en un archivo de texto.
El código 6.6 lee el archivo de forma para obtener la longitud del archivo (bytes 24 a 27 en el encabezado 
del archivo) y usa la longitud del archivo para calcular la cantidad de puntos en este archivo de forma en los 
siguientes pasos:
1. Duplicar el tamaño para convertir de una unidad de 16 bits (dos bytes) a una unidad de 8 
bits (un byte)
2. Restar 100 bytes para un encabezado de archivo
3. Dividir por 28 (cada encabezado de registro y contenido de registro ocupa 28 bytes en el archivo de 
formas de puntos) para obtener el número de característica
A continuación, se imprime la longitud del archivo y el número de entidades de puntos 
y se abre un archivo de texto para escribir los resultados. Aporloop se usa para recorrer 
cada registro/función para leer los valores x, y e imprimir y escribir en el archivo de texto. 
Por último, los dos archivos se cierran para concluir el proceso de lectura/escritura de 
archivos. En elporbucle, la primera línea mueve el puntero del archivo a la posición donde 
comienza el valor x del i-ésimo registro (100 + 12 + i*28, 12 se refieren al encabezado del 
registro [8 bytes] y el tipo de forma entero 1 [4 bytes]), luego lee 16 bytes para x, y y los 
desempaqueta en variables x, y.
6.3.2 Estructura del archivo de índice (.shx)
Figura 6.6muestra la estructura de archivos para el archivo .shx. El encabezado del archivo de índice es el 
mismo que el encabezado del archivo principal, incluidos 100 bytes, y se puede interpretar mediante el Código 
6.7. La longitud del archivo almacenado en el encabezado del archivo de índice es la longitud total del archivo 
de índice en palabras de 16 bits (las 50 palabras de 16 bits del encabezado más 4 veces el número de 
registros). Esto también se puede utilizar para calcular el número de registros. El i-ésimo registro en el archivo 
de índice almacena el desplazamiento y la longitud del contenido para el i-ésimo registro en el archivo 
principal. El desplazamiento de un registro en el archivo principal es el número de palabras de 16 bits desde el 
inicio del archivo principal hasta el primer byte del
106Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 6.6
Estructura de archivos para el archivo .shx.
> > > importarestructura
# Abrir en modo binario para portabilidad
> > > f =abierto('Escuelas.shx','rb')
> > > f.buscar(24)
> > > s = f.leer(4)
> > > b = estructura.desempaquetar('>yo',s)
> > > featNum = (b[0]*2-100)/8
> > > fuera =abierto('escuelas_index.txt','w')
> > > porienrango(número de hazaña):
f.buscar(100+i*8)
s = f.leer(8)
off,longitud = struct.unpack('>ii',s)
fuera.escribir(calle(yo)+':'+calle(apagado)+','+str(longitud)+'\norte')
> > > f.cerrar()
> > > fuera.cerrar()
CÓDIGO 6.7
Interpretación del archivo de índice de forma para obtener el número de registros y la longitud del contenido compensado de 
cada registro.
encabezado de registro para el registro. Por lo tanto, el desplazamiento del primer registro del archivo 
principal es 50, dado el encabezado de 100 bytes.
práctica práctica: Interpretar el archivo de punto .shx
• Abra la ventana del editor de archivos de Python.
• Si la carpeta “c:\code\data\” no tiene los siguientes archivos Escuelas. 
shp, Schools.shx, Schools.dbf, copie los datos en la carpeta.
• Escriba el Código 6.7 en el editor de Python.
Manejo de archivos de forma 107
El código 6.7 primero lee el número entero de la longitud del archivo de índice de los bytes 24 a 27. 
Este número, en unidades de 16 bits o de dos bytes, se utiliza para calcular el número de función 
mediante
1. Duplicar el valor para obtener la longitud en unidad de bytes
2. Restar 100 encabezado de archivo de índice
3. Dividiendo por el número de bytes para cada registro en el archivo de índice (8 bytes)
El número de función y la longitud delarchivo se imprimen y se abre un archivo de 
texto para mantener cada compensación de función y valor de longitud de contenido en 
el archivo principal. lospor loop lee cada registro y lo escribe en el archivo de texto. 
Nuevamente, ambos archivos se cierran al final del programa. losporel ciclo recorre cada 
registro para (a) moverse al inicio del i-ésimo registro (100 + i*8), (b) leer 8 bytes para dos 
enteros, y (c) desempaquetar los dos enteros como desplazamiento y contentLength, que 
se imprimen y se escriben en el archivo de texto siguiendo la secuencia del registro. El 
archivo de texto y la salida en la ventana interactiva se pueden usar para verificar el 
contenido.
6.3.3 El archivo .dbf
El archivo .dbf mantiene atributos para el archivo de forma relacionado. Tiene el mismo nombre que el 
archivo principal e índice. Cada característica debe tener un registro en el archivo .dbf. Cada función 
debe estar en el mismo orden en el archivo .dbf que aparece en los archivos principal y de índice. Los 
detalles del formato de archivo .dbf se pueden encontrar en línea*y no será discutido en este libro.
6.4 Secuencia de Programación General para el Manejo de Shapefiles
Leer el archivo de formas es el primer paso para procesar las características (p. ej., 
visualizar las características en la GUI, hacer un mapa y realizar un análisis espacial). Hay 
varios pasos para leer un archivo de forma:
1. Abra el archivo para leer en modo binario.
2. Lea el encabezado del archivo de índice e interprete la metainformación, por 
ejemplo, el cuadro delimitador y la cantidad de registros.
3. Lea la metainformación de los registros, como el desplazamiento y la longitud del contenido 
de cada registro.
* "Estructura del encabezado del archivo de datos para el archivo de tabla de la versión 7 de dBASE". dbase.http://
www.dbase. com/KnowledgeBase/int/db7_file_fmt.htm.
http://www.dbase.com/KnowledgeBase/int/db7_file_fmt.htm
http://www.dbase.com/KnowledgeBase/int/db7_file_fmt.htm
108Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
4. Leer datos dinámicamente en función de la estructura de contenido de cada registro para 
tipos de forma específicos.
5. Reúna datos en objetos de punto, polilínea y polígono u otros tipos.
6. Analizar y procesar datos según sea necesario.
7. Prepare los datos para escribirlos en un archivo.
8. Escriba datos formateados en archivos.
9. Cerrar archivos.
Los pasos 7 y 8 son para la salida de archivos de forma. A menos que convierta los atributos 
espaciales de cada entidad (coordenadas) o los atributos no espaciales de un formato diferente (por 
ejemplo, un archivo de texto) para generar nuevos archivos de forma, estos dos pasos no son 
necesarios. Esta conversión también se puede lograr fácilmente usando secuencias de comandos 
Python de ArcGIS, que se presentarán más adelante en este libro.
6.5 Experiencia práctica con Mini-GIS
6.5.1 Visualizar polilíneas y polígonos
• Descargue y descomprima el paquete Mini-GIS.
• Haga doble clic en el archivo MiniGIS.py.
• En la ventana de MiniGIS, seleccione Archivo->cargar .shp->seleccione la carpeta de 
países (Figura 6.7a).
(a) (b)
FIGURA 6.7
(a) Seleccione la carpeta 'países' para agregar datos, y (b) la ventana del mapa muestra los países como 
polígonos y los límites de los países como polilíneas.
Manejo de archivos de forma 109
Se mostrarán los polígonos del país y las polilíneas fronterizas del país (Figura 
6.7b). Podemos operar el mapa seleccionando Ver-> [Zoom In |Zoom Out|Zoom 
Extent|Zoom Full]. Todos los códigos fuente para la lectura del archivo, la 
visualización del mapa y la operación del mapa están incluidos en el paquete. 
Intente identificar en el paquete Mini-GIS los archivos que leen archivos de formas y 
visualizan polilíneas y polígonos.
6.5.2 Interpretar archivos de forma de polilínea
Los archivos de formas de polígonos tienen el mismo formato que las polilíneas, excepto que el 
tipo de forma es 5 y el primer punto de una parte de un polígono es el último punto de la 
misma parte de un polígono (Figura 6.8). Por lo tanto, la práctica de esta subsección se puede 
utilizar para leer archivos de forma de polígonos con actualizaciones menores.
La lectura de un archivo de polilínea puede aprovechar el código desarrollado para leer 
el número de entidad, el desplazamiento del registro y la longitud del contenido del 
registro (Código 6.8). Una vez que se identifica el desplazamiento y la longitud del 
contenido de cada registro, el resto irá a la posición inicial de un registro específico para 
comenzar a interpretar la polilínea. Para cada encabezado de registro, el primer entero es 
el número de secuencia del registro y el segundo entero es la longitud del contenido, 
como se muestra enFigura 6.8. En el contenido del registro, el primer valor es un número 
entero que muestra el tipo de forma como un valor de 3 polilíneas. Los siguientes 32 
bytes son el cuadro delimitador para minx, miny, maxx, maxy para la característica actual. 
Dado que una polilínea puede incluir varias líneas, cada línea de una polilínea se 
considera una parte. El número de partes de una polilínea sigue al cuadro delimitador 
como un número entero, seguido por el número de puntos como un número entero. 
Según el número de pieza, hay 4 bytes de número de pieza que contienen el punto de 
inicio de cada pieza en la secuencia de puntos completa de la entidad actual. El número 
inicial es 0 para la primera parte. Siguiendo el índice de la parte están las coordenadas x, 
y de los puntos. Si las dimensiones z y m se proporcionan en el formato, los campos 
relevantes, como el cuadro delimitador y los valores de las coordenadas de los puntos, se 
ajustarán de acuerdo con los valores almacenados de z y m. Con base en estos análisis,
FIGURA 6.8
El formato de polilínea de archivo de forma con el encabezado del archivo y la primera polilínea mostrada. El resto del archivo de 
forma repite el formato de registro de polilínea.
110Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
# módulos de importación para el cálculo de longitud de línea,
# descompresión de datos binarios y visualización. 
importarMatemáticas
deTkinterimportar* 
importarestructura
# definir punto, clases de polilínea clase
Punto:
definitivamente__en eso__(uno mismo, x = 0.0, y = 0.0):
self.x = x
self.y = y
clasePolilínea:
# definir el método de inicialización del objeto
# # número de piezas
definitivamente__en eso__(self, puntos= [], partNum = 0):
self.puntos = puntos
self.partsNum = partsNum
# - - - - - Parte 1: leer y procesar los primeros 100 bytes
# # 1. archivo de índice abierto para leer en modo 
binario shxArchivo =abierto("Calles_parciales.shx","rb")
# el nombre del archivo de forma se puede reemplazar con cualquier polilínea
# # 2. leer el encabezado del archivo de índice e interpretar la metainformación, por ejemplo, el 
cuadro delimitador y el número de #registros
# leer los primeros 28 
bytes s = shxFile.read(28)
# convertir a 7 enteros encabezado = 
struct.unpack(">iiiiiii",s)
# obtener la longitud del archivo
longitud del archivo = encabezado [Len(encabezado)-1]
# calcula los números de polilínea en el archivo de forma según la longitud del archivo de 
índice
polylineNum = (fileLength*2-100)/8
impresión'fileLength, polylineNum:',fileLength, polylineNum
# leer otros 72 bytes en el encabezado s 
= shxFile.read(72)
# convertir en valores
encabezado = struct.unpack("<iidddddddd",s)
# obtener el cuadro delimitador para el archivo de forma
minX, minY, maxX, maxY = encabezado[2],encabezado[3],encabezado[4],encabezado[5]
# # 3. leer registros ¡¯ metainformación, como compensación,
# # y la longitud del contenido de cada registro,
# definir una lista vacía para mantener el desplazamiento de cada función en el archivo 
principal registrosOffset = []
# recorrer cada función porienrango(0, 
número de polilínea):
# saltar al principio de cada registro 
shxFile.buscar(100+i*8)
CÓDIGO 6.8
Lectura y visualización de shapefilesde polilíneas. (Continuado)
Manejo de archivos de forma 111
# leer 4 bytes como compensación s 
= shxFile.read(4)
desplazamiento = struct.unpack('>yo',s)
# mantener el desplazamiento en la lista 
impresión'desplazamiento es:', compensar 
registrosOffset.append(offset[0]*2)
# cerrar el archivo de índice 
impresiónregistrosOffset
# - - - - - - - - Parte 2: lee cada polilínea y prepáralas en el orden correcto.
# abrir el archivo principal para leer en binario 
archivoshp =abierto("Calles_parciales.shp","rb")
# el nombre del archivo de forma se puede reemplazar con cualquier polilínea
# definir una lista vacía para polilíneas 
polilíneas = []
# recorrer cada desplazamiento de todas las polilíneas
# # 4. leer datos de forma dinámica en función de la estructura de contenido de cada registro
# # para tipos de formas específicas por
compensarenDesplazamiento de registros:
# definir dos listas para almacenar valores
x, y = [], []
# saltar a partsNum y pointsNum de la polilínea y leerlos 
shpFile.seek(desplazamiento+8+36) s = shpFile.read(8)
# generar un objeto de polilínea vacío 
polilínea = Polilínea()
partNum, pointsNum = struct.unpack('ii',s) 
polyline.partsNum = partsNum
impresión'NúmPartes, NúmPuntos: ',NúmPartes, NúmPuntos
# leer la lista de partes que contienen el número secuencial inicial de punto
# en esa parte
s = shpFile.read(4*partsNum) """
Componga el formato de desempaquetado según el número de partes
Cuando desempaquetamos una cadena binaria, necesitamos un formato (por ejemplo, 'i' para 
un entero,
'ii' para dos enteros). Sin embargo, no sabemos cuántos enteros 
(partsNum)
necesitamos desempaquetar, por lo tanto, usamos un bucle para iterar 
partsNum.
Para cada partNum, agregamos una 'i' a la str. Por lo tanto, si partNum
igual a, por ejemplo, 2, el str será igual a 'ii' después del ciclo
"""
calle=''
porienrango(número de piezas):
calle=calle+'i'
impresión'str es:',calle
CÓDIGO 6.8 (Continuado)
Lectura y visualización de shapefiles de polilíneas. (Continuado)
112Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
# obtener el número de punto de partida de cada parte y mantenerlo en una 
lista partsIndex
polilínea.partsIndex = struct.unpack(calle,s)
# recorrer cada punto en la polilínea puntos = []
porienrango(númpuntos):
# leer las coordenadas de la polilínea
# y agregar a las listas de coordenadas x, y de los puntos
# AGREGAR CÓDIGOS PARA LEER LOS VALORES DE LAS COORDENADAS AQUÍ
# 5. ensamblar datos en objetos de punto, polilínea,
# y polígono u otros tipos. punto = 
Punto(x, y) puntos.append(punto)
# asignar listas de puntos a la polilínea 
polilinea.puntos = puntos
# añadir la polilínea leída a la 
polilíneas.append(polilínea)
# - - - - - - - - - - - - - - - Parte 3: prepararse para visualizar los datos
# crear objeto de ventana principal
# 8. Analice y procese (visualice) los datos según sea necesario 
raíz = Tk()
# definir el tamaño de la ventana ancho de ventana, 
alto de ventana = 800, 600
# calcular proporciones de visualización 
ratiox = ancho de ventana/(maxX-minX) 
ratioy = altura de ventana/(maxY-minY)
# tomar la relación más pequeña entre el tamaño de la ventana y la distancia geográfica 
proporción = proporciónx
sirazón>razón:
proporción = proporción
# crear objeto lienzo
can = Canvas (raíz, ancho = 800, altura = 600)
# recorrer cada polilínea por
polilineaenpolilíneas:
# definir un xylist vacío para mantener las coordenadas convertidas 
listax = []
# recorrer cada punto
# y calcule las coordenadas de la ventana, coloque xylist porpunto
enpolilínea.puntos:
pasar
# AGREGAR CÓDIGOS AQUÍ PARA TRANSFORMAR EL SISTEMA DE COORDENADAS BASADO EN LA RELACIÓN # 
ENCONTRADA
porkenrango(polilínea.partsNum):
# obtener el número de secuencia final de puntos en la parte si
(k==polilínea.partsNum-1):
índicePuntoFinal =Len(polilínea.puntos) más:
endPointIndex = polyline.partsIndex[k+1]
# definir una lista temporal para mantener las coordenadas de la parte lista 
XY temporal = []
CÓDIGO 6.8 (Continuado)
Lectura y visualización de shapefiles de polilíneas. (Continuado)
Manejo de archivos de forma 113
# sacar las coordenadas de los puntos de la pieza
# y agregar a la lista temporal
pormetroenrango(polilínea.partsIndex[k], endPointIndex):
pasar
# AGREGAR CÓDIGOS AQUÍ PARA COMPONER LA XYlist PARA DIBUJAR CADA SEGMENTO DE LÍNEA.
# crea la linea
# can.create_line(tempXYlist,fill='azul')
# agregue líneas a la ventana y muestre la ventana 
puede.empacar()
raíz.mainloop()
# 9. cerrar archivo
shxFile.cerrar()
shpFile.cerrar()
CÓDIGO 6.8 (Continuado)
Lectura y visualización de shapefiles de polilíneas.
1. Escriba/copie el código en la ventana de programación, guarde el archivo 
python.
2. Copie los datos Partial_Streets.shp y Partial_Streets.shx en la misma 
carpeta donde guardó el archivo python .py.
3. Ejecute el archivo python.
4. Explore y analice el código para comprender cada sección del 
código.
6.6 Resumen del capítulo
Este capítulo presenta los formatos de archivo de datos vectoriales, el formato de archivo de forma de 
ESRI y explica cómo leer los archivos a través del Mini-GIS:
• Aprenda a procesar datos binarios.
• Familiarícese con las diferentes estructuras de archivos de archivos de forma, incluidos
. shp y .shx.
• Lea el .shp y .shx usando Python.
• Manejar archivos de formas de puntos.
• Manejar archivos de forma de polilínea.
PROBLEMAS
1. Elija un archivo de forma de polilínea con 10 a 100 entidades y un archivo de polígono 
con 10 a 100 entidades.
114Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
2. Escriba un programa Python para leer las polilíneas y polígonos de los archivos 
de forma. (Podemos usar archivos .shp y .shx).
3. Construya objetos de polilínea y polígono en Python.
4. Dibujar las polilíneas/polígonos usando el paquete Tkinter.
5. Comente y explique el programa para mostrar el flujo lógico de su 
programación haciendo referencia al Código 6.8.
7
Entorno de programación Python
Hay varias ramas del entorno de programación de Python, la mayoría de las cuales 
se basan en el entorno de desarrollo integrado (IDE) de código abierto de Python 
Software Foundation. Este capítulo presenta los aspectos generales del IDE de 
código abierto, incluidos los diferentes aspectos de las interfaces de programación, 
la configuración de rutas, la depuración, el resaltado y la administración de 
módulos. Esto se ejemplificó en el paquete Mini-GIS en los capítulos anteriores.
7.1 IDE general de Python
Python es un lenguaje interpretativo (o interactivo). Por lo tanto, no necesitamos compilar 
el código en un archivo ejecutable (por ejemplo, un archivo .exe o .jar) para ejecutarlo. 
Hay dos formas para que un intérprete de Python lea y aplique el código.
7.1.1 Ventanas de programación Python
7.1.1.1 GUI de línea de comandos
En el sistema de Windows, se puede acceder a la GUI de línea de comandos de Python 
IDE desde el Programa de Windows→Pitón→Python GUI (línea de comandos). La línea de 
comandos se puede utilizar como una GUI de línea de comandos de DOS o Linux. Una 
declaración de Python escrita en la GUI de la línea de comandos se ejecutará 
directamente. Hay varios comandos de Python que solo se pueden ejecutar en la GUI de 
línea de comandos (Figura 7.1), como probar el método fibo enCapítulo 6del tutorial en 
línea de Python. Sin embargo, esta es la ventana de desarrollo menos amigable porque 
no se puede personalizar y el código no está coloreado para ilustrar la estructura del 
código mientras se escribe.
7.1.1.2 GUI interactiva
Otro IDE de Python es la ventana IDLE de Python, donde el intérprete de Python 
ejecutará cada comando escrito en la GUI interactiva (Figura 7.2). IDLE es útil para 
practicar la sintaxis de Python, particularmente para usuarios novatos que no están 
familiarizados con el lenguaje Python, o para aquellos que quieren usar Python para 
operaciones simples de 'calculadora', por ejemplo, calcular 510. Sin embargo, al usar 
la interfaz IDLE, los comandos sepierden una vez que la ventana
115
116Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 7.1
GUI de línea de comandos de Python.
FIGURA 7.2
GUI interactiva de Python.
está cerrado; por lo tanto, la GUI interactiva no es apropiada para escribir 
programas complejos.
7.1.1.3 Programación basada en archivos
Una ventana de programación basada en archivos (se puede abrir desde Python IDLE a través 
del menú Archivo→New) proporciona una manera conveniente de conservar el código al 
guardar el código en un archivo de Python (Figura 7.3). Esta ventana puede ser invocada
Entorno de programación Python 117
FIGURA 7.3
Ventana de programación basada en archivos de Python.
del 'Archivo→Nueva ventana' de Python IDLE. Dentro de esta ventana, hay tres formas de 
ejecutar el código: (a) presione F5, (b) haga clic en Ejecutar→Ejecute el Módulo, o fuera de 
la ventana (c) haga doble clic en el archivo .py en el explorador de Windows (el IDE de 
Python debe estar instalado para que esto funcione).
7.1.2 Configuración del IDE de Python
Python IDLE se puede personalizar con el cuadro de diálogo "Preferencias de IDLE", 
que se puede invocar a través de Opciones→Configure IDLE en el menú IDLE.
7.1.2.1 Resaltar
Colorear el código puede ayudarlo a comprender, capturar, comunicarse e 
interactuar mejor con otros programadores. En Python IDLE, el código (incluidos los 
comentarios) se puede resaltar con diferentes colores según los tipos de
118Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 7.4
El color de las diferentes partes de un programa se puede resaltar para mejorar el formato, la comunicación, 
la interacción y la programación.
entrada de palabras. Por ejemplo, las palabras clave se pueden configurar en amarillo, las 
variables en negro y las funciones en azul (Figura 7.4). Estos ajustes se pueden personalizar en 
la pestaña "Resaltar".
7.1.2.2 Configuración General de la Ventana de Programación
El estado inicial de Python IDLE se configura en la pestaña “General” (Figura 7.5). La 
configuración incluye qué ventana inicializar (ya sea la ventana interactiva o la ventana de 
edición), cómo guardar el código, el tamaño de la ventana inicial, el formato de párrafo y 
el método de codificación de la fuente.
7.1.2.3 Configuración de fuentes para la codificación
La pestaña "Fuentes/pestañas" puede configurar el tamaño de fuente del código, el estilo y el ancho de la 
sangría (Figura 7.6).
7.1.3 Depuración
Probar el código para corregir errores y mejorar la solidez se denomina depuración. 
Es un proceso imprescindible en la programación porque es casi imposible
Entorno de programación Python 119
FIGURA 7.5
Configuración general para el estado inicial de Python IDLE.
FIGURA 7.6
Personalice el tamaño de fuente, el estilo y la sangría para Python IDLE.
120Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
escribir códigos sin errores. Esta sección repasará las habilidades básicas para el manejo 
y la depuración de errores/excepciones.
7.1.3.1 Error de sintaxis
Los errores de sintaxis ocurren cuando no se cumplen los requisitos de sintaxis y se detectan 
en el proceso de interpretación antes de que se ejecute el programa. Los errores de sintaxis se 
eliminan al traducir el código fuente a un código binario. Cuando se detecta un error de 
sintaxis, el intérprete de Python muestra el mensaje "SyntaxError: sintaxis no válida". Dichos 
errores ocurren con frecuencia, especialmente cuando no está familiarizado con la sintaxis de 
Python. El código 7.1 muestra un error de sintaxis con dos puntos faltantes (':') después de 
True.
Desafortunadamente, los mensajes de error a menudo no son informativos. A continuación se 
describen cuatro errores comunes que resultan en errores de sintaxis; esta lista se puede utilizar para 
ayudarle a detectar problemas:
• ¿Sangrar correctamente? En Código 7.2,elifdeclaración debe tener el mismo nivel 
de sangría quesideclaración.
• ¿Utiliza las palabras clave correctamente? ¿Hay errores tipográficos en las palabras clave?
• ¿Utiliza palabras clave como nombres de variables, funciones o clases?
• Declaraciones incompletas, como
• Un corchete sin cerrar '{', ' (', '[', comillas ', “
• Omitir el símbolo de dos puntos “:”. Por ejemplo, omitir los dos puntos al final de 
unadefinitivamenteotiempodeclaración produciría unaError de sintaxis: sintaxis 
invalidamensaje (Código 7.3).
• Usar if, elif o while sin ninguna expresión condicional.
Para manejar los errores de sintaxis, primero verifique esos cuatro aspectos.
> > > tiempoVerdaderoimpresión'Hola Mundo' 
Error de sintaxis: sintaxis invalida
> > >
CÓDIGO 7.1
Mientras que el problema de sintaxis no válida.
> > > si(yo>0):
impresión'i es mayor que 0' elif:impresión
'i es menor que 0'
Error de sintaxis: sintaxis invalida
> > >
CÓDIGO 7.2
Si la sintaxis no es válida debido a la sangría.
Entorno de programación Python 121
Interrupción del teclado
> > > tiempoVerdadero Error de 
sintaxis: sintaxis invalida
> > > tiempoVerdadero:
(a)
> > > definitivamenteagregar() Error de 
sintaxis: sintaxis invalida
> > > definitivamenteagregar():
(b)
CÓDIGO 7.3
Faltan partes de un error de sintaxis de declaración.
7.1.3.2 Excepciones de tiempo de ejecución
Los errores detectados durante la ejecución se denominan excepciones. Si no se 
soluciona una excepción, el programa finaliza y produce un llamadorastrearmensaje 
de error (Código 7.4). Muchas operaciones podrían dar lugar a excepciones. Por 
ejemplo, transferir una cadena sin dígitos a un flotante (Código 7.4a y b), acceder a 
elementos con índice fuera del límite (Código 7.4c) y números divididos por 0 
(Código 7.4d).Tabla 7.1da excepciones comunes y sus causas correspondientes.
> > > flotar([1,2,3])
Rastreo (llamadas recientes más última):
Archivo "<pyshell#11>", línea 1, en <módulo>
flotante ([1,2,3])
TypeError: el argumento float() debe ser una cadena o un número
(a)
> > > flotar('strv1')
Rastreo (llamadas recientes más última):
Archivo “<pyshell#16>”, línea 1, en <módulo>
flotar('strv1')
ValueError: no se pudo convertir la cadena en flotante: strv1
(b)
> > > X = [1,2,3,4]
> > > x[4]
Rastreo (llamadas recientes más última):
Archivo "<pyshell#14>", línea 1, en <módulo>
x[4]
IndexError: índice de lista fuera de rango
(C)
> > > 1/0
Rastreo (llamadas recientes más última):
Archivo "<pyshell#18>", línea 1, en <módulo>
1/0
ZeroDivisionError: división entera o módulo por cero
(d)
CÓDIGO 7.4
Ejemplos de excepciones en tiempo de ejecución.
122Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
TABLA 7.1
Excepciones integradas
Nombre de la clase Razones para tener excepciones
Excepción
Error de atributo
IOError
IndexError
Error de clave
Error de nombre
Error de sintaxis
Error de tecleado
ValorError
La clase raíz para todas las excepciones.
Intento de acceder a un atributo de objeto indefinido 
Intento de abrir un archivo inexistente
Solicitud de un índice inexistente de una secuencia, por ejemplo, lista 
Solicitud de una clave de diccionario inexistente
Intento de acceder a una variable no declarada El código 
está mal formado
Pase a la función un argumento con un objeto de tipo incorrecto
Pase a la función un argumento con el tipo de objeto correcto pero con un
valor inapropiado
ZeroDivionError División (/) o módulo (%) por un cero numérico
La resolución de problemas de esos errores es muy específica cuando se lanza una excepción 
durante el tiempo de ejecución. Se pueden tomar los siguientes pasos para manejar las excepciones 
de tiempo de ejecución:
• Verifique el tipo de excepción y revise las razones que causan las excepciones (
Tabla 7.1).
• Examine el código, especialmente la línea (indicada en el mensaje de 
excepción) que arroja errores y analice qué resultó en la excepción. A 
veces, es posible que deba subir/bajar algunas líneas para identificar el 
problema real.
• Si aún no está seguro acerca de las causas, use 'imprimir'para generar los valores de 
las variables relativas para verificar si son correctos.
• Revise el código y ejecútelo de nuevo.
7.1.3.3 Manejo de excepciones
El manejo de excepciones es el proceso de detectar las posibles excepciones y 
tratarlas antes de que falle todo el programa (Python 2001b).Probar…. exceptose 
utiliza para capturar excepciones (Figura 7.7). Coloque el código que puede producir 
excepciones en tiempo de ejecución dentro del bloque "intentar" seguido del bloque 
"excepto". Hay tres formas de manejar la parte "excepto" en función de qué tan 
específico sea el mensaje de error después de una excepción.
Puede capturar cada excepción usando un bloque de excepción diferente (Figura 7.7a) o 
atrapar múltiples excepciones dentro de un bloque de excepción (Figura 7.7b). También puede 
detectar todas las excepciones sin ningún tipo de excepción después de excepto
Entorno de programación Python 123
(b)
(a) (C)
FIGURA 7.7
Generar y capturar excepciones.
> > > probar:
pasar#intentar bloque
> > > excepto:
pasar#excepto bloque
> > > finalmente:
pasar#finalmente bloquear # se ejecuta independientemente de excepciones
CÓDIGO 7.5
Utiliza "intentar... excepto... finalmente" para capturar la excepción ZeroDivisionError y eliminar el resultado 
de la memoria si ocurre una excepción.
(Figura 7.7c). Aunque el primer enfoque requiere más codificación, se 
recomienda porque proporciona los mensajes de excepción más detallados 
para la depuración. El último enfoque no se recomienda porque no proporciona 
posibles causas para las excepciones.
losintentar... finalmentese utiliza para definir acciones de limpieza que deben 
ejecutarse en todas las circunstancias (Código 7.5 y Código 7.6). Esto significa que el
finalmenteLas declaraciones se ejecutan independientemente de si se produce o no la 
excepción.
7.1.3.4 Agregar identificadores de excepción y acciones de limpieza a la lectura/escritura de archivos
Las operaciones de archivo pueden generar excepciones en tiempo de ejecución, por ejemplo, el 
archivo o la ruta del archivo no existe. Aintentar... excepto... finalmente...La declaración se puede 
aplicar para capturar y manejar el error. En Code 7.7, el código de operación del archivo se coloca en el 
bloque "intentar", "excepto" se usa para capturar las excepciones de IOError y "finalmente" se usa 
para cerrar el archivo si existe.
124Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > definitivamentedividir(x,y): 
resultado =Ninguna
probar:
resultado = x/y
devolverresultado
exceptoError de división cero:
impresión'División por cero' 
finalmente:
impresión'Limpiar ....' del
resultado
> > > dividir (3,1) 
Limpiar ....
3
> > > dividir (3,0) 
División por cero
Limpiar ....
> > >
CÓDIGO 7.6
Intente…excepto…finalmente limpiar las variables si ocurriera una excepción.
> > > f =Ninguna
> > > probar:
f =abierto('muestra.txt','r+') 
f.readline()
f.readlines()
f.buscar(0)
f.leer()
f.escribir('¡Esto es una prueba!')
> > > exceptoIOError:
impresión'¡El archivo no existe!'
> > > finalmente:
# # Cierra el archivo si el archivo se abrió siF:
f.cerrar()
CÓDIGO 7.7
Usosintentar... excepto... finalmentepara manejar excepciones de operación de archivos.
7.2 Módulos de Python
Los módulos son unidades para administrar un conjunto complejo de códigos 
dentro de Python. Los módulos de Python son una forma conveniente de organizar, 
compartir y reutilizar código. El conocimiento esencial para usar módulos incluye (a) 
comprender el concepto, (b) familiarizarse con los módulos de Python comunes y 
útiles, (c) administrar códigos como módulos y (d) configurar/instalar un nuevo 
módulo en el entorno de Python.
Entorno de programación Python 125
FIGURA 7.8
Módulos del sistema.
7.2.1 Introducción al módulo
Los bloques de código que desarrollamos durante las prácticas se han guardado como archivos 
(.py). Los módulos proporcionan una forma lógica de organizar y reutilizar estos archivos .py. 
Los archivos de código de Python se pueden importar como módulos estándar, como el 
módulo sys y math. Una vez importadas, las funciones y los atributos contenidos en el módulo 
se pueden usar en cualquier parte del programa.
Un módulo se 'compila' en una versión binaria .pyc. Este proceso se lleva a cabo 
automáticamente cuando el módulo se carga y ejecuta por primera vez. Este mecanismo de 
compilación hace que el módulo se cargue más rápido pero no se ejecute más rápido.Figura 7.8 
muestra los módulos del sistema, incluidos los archivos .py, .pyc y los paquetes.
Durante la programación, es posible organizar diferentes clases, funciones y otros 
componentes en diferentes archivos para formar diferentes módulos.
7.2.2 Configurar módulos
Hay tres formas de configurar una ruta para permitir que el sistema encuentre el módulo. 
La forma más fácil es actualizar la ruta del sistema temporalmente usando el método 
sys.path.append() (Código 7.8). Sin embargo, la configuración de la ruta se pierde cuando 
se reinicia la GUI de Python.
Para hacer que la configuración de la ruta sea persistente, cambie la Variable de entorno del 
sistema en los siguientes pasos:
1. Haga clic derecho en "Mi computadora" y seleccione "Propiedades".
2. Haga clic en la pestaña Avanzado en la parte superior; Haga clic en Variables de entorno en la parte 
inferior.
3. Haga clic en Nuevo en cualquier ventana.
126Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
> > > importarsistema
> > > sys.ruta.append('c:\ggs650código')
> > > sys.ruta
['C:/Usuarios/Phil/Documentos/cursos/libro - programación gis/códigos', 'C:\\WINDOWS\
\System32', 'C:\\Python27\\ArcGIS10.2\\Lib\\idlelib' , 'C:\\WINDOWS\\SYSTEM32\\python27.zip', 
'C:\\Python27\\ArcGIS10.2\\DLL', 'C:\\Python27\\ArcGIS10.2\\lib', ' C:\\Python27\\ArcGIS10.2\
\lib\\plat-win', 'C:\\Python27\\ArcGIS10.2\\lib\\lib-tk', 'C:\\Python27\\ArcGIS10 .2', 'C:\
\Python27\\ArcGIS10.2\\lib\\site-packages',
'C:\\Archivos de programa (x86)\\ArcGIS\\Desktop10.2\\bin', 'C:\\Archivos de 
programa (x86)\\ArcGIS\\Desktop10.2\\arcpy', 'C:\ \Archivos de programa (x86)\
\ArcGIS\\Desktop10.2\\ArcToolbox\\Scripts', 'c:\\ggs650code']
> > >
CÓDIGO 7.8
Agregue la ruta al módulo a través del método sys.path.append() agregará la ruta al final de la lista 
sys.path.
4. Agregue la variable "PYTHONPATH" y establezca el valor como "c:\ 
pythoncode".
5. Guardar y salir.
6. Reinicie su GUI interactiva de Python.
7. Verifique si su ruta se puede encontrar con sys.path importando el módulo 
sys.
Otro método para configurar la ruta del archivo del módulo es especificarlo al 
comienzo del programa Python de la siguiente manera:
sistema de importación, sistema operativo
si os.getcwd() no está en sys.path:
sys.ruta.append(os.getcwd)
La primera declaración importa los módulos sys y os. La segunda declaración obtiene 
la ruta del archivo actual usando os.getcwd para verificar si ya está en la ruta del sistema, 
agregando a la ruta del sistema si no es así.
7.2.3 Módulos integrados del sistema
Python viene con muchos módulos integrados (Tabla 7.2). Los más populares 
incluyen os, sys, math, shutil y otros. Una regla para usar un módulo es 
importarlo primero.
• El módulo os permite interacciones con el sistema operativo. Por 
ejemplo, comprobar el sistema operativo actual, el sistema de archivos 
o determinar el número de discos duros.
• LossistemaEl módulo proporciona parámetros y funciones específicos del sistema. Los 
scripts de utilidades comunes a menudo necesitan procesar argumentos de línea de 
comandos. Estos argumentos se almacenan en el atributo argv del módulo sys como 
una lista.
Traducido del inglés al español - www.onlinedoctranslator.com
https://www.onlinedoctranslator.com/es/?utm_source=onlinedoctranslator&utm_medium=pdf&utm_campaign=attribution
Entorno de programación Python 127
TABLA 7.2
Módulos integrados del sistema
Módulo Descripción Ejemplos
sistema operativo
sistema
Interactuar con el sistema operativo sistema operativo ('dir')sys.ruta, sys.exit()Parámetros específicos del sistema y
funciones
Matemáticas
cerrar
globo
Funciones matemáticas de punto flotante 
Operaciones de archivo de alto nivel
matemática.pow()
shutil.copyfile(), shutil.move() 
glob.glob('*.shp')Obtener listas de archivos del directorio
búsquedas con comodines
re Herramientas de expresiones regulares para
procesamiento avanzado de cadenas
re.match('c', 'abcdef')
fecha y hora Manipular fechas y horas 
Archivo y compresión de datos
la fecha de hoy()
ZipFile('spam .zip', 'w')zlib, gzip, bz2,
archivo zip y archivo tar
• cerrares un módulo que proporciona operaciones de archivo de alto nivel.
• globoobtiene listas de archivos de búsquedas con comodines en directorios.
• rees un módulo breve que proporciona herramientas de expresiones regulares para el 
procesamiento avanzado de cadenas.
• LosaleatorioEl módulo proporciona herramientas para hacer selecciones aleatorias.
• Losfecha y horaEl módulo proporciona clases para manipular fechas y 
horas de formas simples y complejas.
• Los formatos comunes de archivo y compresión de datos son compatibles directamente con 
módulos adicionales, incluidoszlib,gzip,bz2,archivo zip, yarchivo tar.
Matemáticas(Figura 7.9) es el módulo más popular utilizado en este libro.
Siempre podemos usar la función integrada dir() para encontrar lo que se admite 
en un módulo nuevo.Figura 7.10muestra que el módulo matemático incluye muchos 
métodos, como acos, sin, fabs, etc., y varios atributos privados, como '__ doc__', 
'__name__' y '__package__'. Estos tres atributos normalmente se incluyen en todos 
los módulos. La función integrada help() se puede utilizar para comprobar la 
descripción del módulo y las funciones.
7.3 Gestión de paquetes y Mini-GIS
7.3.1 Organización de datos GIS regulares
Figura 7.11muestra la interfaz de usuario de ArcMap que administra varios conjuntos de datos. Cada 
conjunto de datos es una capa después de que se carga desde el disco y se representa en el
128Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 7.9
métodos matemáticos.
FIGURA 7.10
Comprobar un módulo.
área de visualización del mapa (Figura 7.12). Las capas compuestas de un mapa muestran 
la calle, el parque, la casa (Parcelas) y la información del río sobre la ciudad de Westerville, 
Ohio. Al cargar un conjunto de datos en la memoria, cada capa incluye una serie de 
objetos (p. ej., cada casa puede tratarse como un objeto).
7.3.2 Paquete Mini-GIS
EnCapítulos 1mediante6, hemos desarrollado una serie de clases y funciones (
Figura 7.13). En nuestra práctica anterior, el módulo de visualización ha sido 
independiente del módulo Punto, Polilínea y Polígono (Figura 7.13a). Sin 
embargo, la visualización se agrega como método al módulo Punto, Polilínea y 
Polígono a través de la herencia de una superclase común, la
Entorno de programación Python 129
FIGURA 7.11
Interfaz de usuario de ArcMap.
Mapa
atributo Mapa
Capa
atributo Capa 1 capa m capa n
Objeto
atributo Objeto 1 Objeto k
FIGURA 7.12
Jerarquía de organización de datos de mapas.
Clase característica (Figura 7.13b). Por lo tanto, la visualización no tiene que 
definirse muchas veces.
Juntarlos crea un paquete para leer y mostrar archivos de forma ESRI, 
incluidas funciones simples (p. ej., calcular la distancia y el centroide). Como se 
muestra enFigura 7.14, Tkinter es un módulo incorporado para la visualización 
de datos en una GUI, y struct se usa para leer datos binarios. Una clase de 
entidad es un módulo simple que incluye solo dos métodos, __init__() y vis() (
Figura 7.14). Las clases Polyline y Point se heredan de la clase Feature e 
incluyen dos métodos, __init__() y vis(), también. Además de estos dos métodos, 
Polylines también incluye un método length(). Un polígono se hereda de la clase 
Polyline y anula la función vis().
130Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
(a)
Lectura de datos
para objetos
Punto Polilínea Polígono Visualización
Coordenadas Coordenadas Coordenadas Texto
Punto,
polilínea,
PolígonoLongitud,
baricentro,
Área
Distancia Longitud archivos de forma
(b)
Lectura de datos
para objetos
Punto Polilínea Polígono
Coordenadas Coordenadas Coordenadas Texto
Distancia Longitud Longitud archivos de forma
Visualización Visualización Visualización
FIGURA 7.13
Código desarrollado. (a) Visualización definida explícitamente separada de Punto, Polilínea y Polígono. (b) La 
visualización se hereda de la clase Feature, por lo tanto, no es necesario definir la visualización explícitamente.
Rasgo
Polilínea Punto
Polígono
Características
estructura ReadShapeFile
Tkinter Capa
Heredar Mapa
Importar En eso
FIGURA 7.14
Jerarquía de módulos Mini-GIS primarios (Tkinter y struct son módulos integrados de Python).
Entorno de programación Python 131
7.4 Experiencia práctica con Mini-GIS
Mini-GIS es un pequeño paquete de software GIS desarrollado con Python. El código 
fuente se puede descargar del paquete de material del curso. Después de descargar y 
descomprimir el archivo miniGIS.zip, habrá una carpeta miniGIS que contiene varios 
archivos de Python y una carpeta de datos de muestra que se muestra enFigura 7.15.
En la carpeta, los archivos *.py son los archivos de Python y los archivos *.pyc son los 
archivos de Python compilados. La carpeta 'sample-data' contiene varias carpetas de datos de 
archivos de forma; la carpeta 'ciudades', que contiene datos de ciudades del mundo; 'países', 
que contiene datos de países del mundo; la carpeta 'Fairfax' contiene escuelas, carreteras, 
principales líneas de servicios públicos y regiones en Fairfax; y la carpeta 'multi-parts-polyline' 
contiene dos polilíneas con multipartes.
7.4.1 Gestión de paquetes y Mini-GIS
El módulo ReadShapeFile lee diferentes tipos de entidades o capas, que 
incluyen puntos, polilíneas y polígonos (Figura 7.16). Los Comunes
FIGURA 7.15
Organización del código Mini-GIS.
132Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 7.16
Las funciones principales son módulos de funciones y módulos de mapas.
el módulo proporciona funciones reutilizables comunes; El Módulo de Diálogos proporciona los 
dos diálogos para seleccionar capas; y el módulo de eventos proporciona manejo de eventos 
operados por mouse.
Mini SIGEl módulo incluye la función principal. Un directorio se convierte 
en un paquete de Python si contiene __init__.py. Incluye las siguientes 
funciones:
1. Las funciones principales para llamar a otras partes.
2. Generar una ventana
3. Ingrese los conjuntos de datos
4. Visualiza los datos
5. Mostrar la ventana
Normalmente, esta es la única parte que necesita comprender completamente si obtiene el 
paquete de otro lugar; de lo contrario, la descripción de la interfaz es suficiente para usar un 
paquete.
7.4.2 Ejecute y practique el paquete Mini-GIS
Podemos ejecutar el paquete en el siguiente flujo de trabajo:
1. Agregue la ruta a la ruta del sistema; o simplemente haga doble clic en 
MiniGIS.py; o use IDLE para ejecutar el paquete. Aquí, use el tercer método para 
abrir MiniGIS.py.
2. Haga clic en Ejecutar→Ejecutar el menú del módulo o el botón 'F5' para ejecutar 
el paquete. Aparecerá una ventana, que tiene el título 'MiniGIS'.
3. Importe el archivo de forma de dos maneras: 'Importar shp' y 'Agregar capa shp' en el menú 
Archivo.Figura 7.17ailustra el mapa de los datos importados de la carpeta del archivo de 
forma de Fairfax.
Entorno de programación Python 133
(a) (b)
(C)
FIGURA 7.17
(a) Uso de Mini-GIS para importar la carpeta de archivos de forma de Fairfax. (b) Ampliar hasta la extensión. (c) Salidas de Python 
Shell.
4. Vea el mapa usando el menú en el menú 'Ver': acercar, alejar, acercar a la 
extensión, acercar a la ventana completa y cerrar la capa.Figura 7.17b
muestra el zoom del mapa hacia el límite izquierdo.Figura 7.17c muestra 
las salidas en Python Shell, que también genera la relación del mapa.
Mini-GIS también admite características de dibujode diferentes tipos: punto, polilínea, 
círculo y polígono. Para dibujar una característica, haga clic en 'Editar' para que aparezca un 
cuadro de diálogo y seleccione una capa.Figura 7.18muestra la característica agregada al mapa 
en la esquina inferior izquierda. Sin embargo, el Mini-GIS actual no admite la exportación de 
estas características añadidas al archivo de formas.
El Mini-GIS también puede calcular las intersecciones entre dos capas de 
polilíneas.Figura 7.19indica las intersecciones entre las capas de servicios y las capas 
de carretera con círculos amarillos.
134Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 7.18
Dibujar características.
FIGURA 7.19
Intersecciones entre las capas HIGHWAY y UTILITY_LINES.
Entorno de programación Python 135
7.5 Resumen del capítulo
El capítulo revisa el IDE de Python y demuestra cómo personalizar la 
configuración de un IDE de Python. También se analizan los módulos y se 
presenta un paquete Mini-GIS para leer y visualizar ESRI Shapefiles. Los 
detalles de implementación (como la lectura de archivos de forma) del Mini-
GIS se presentarán en los siguientes capítulos.
PROBLEMAS
1. Tomar los datos utilizados enCapítulo 4.
2. Basado en la solución de problemas enCapítulo 4, ¿cómo puede encontrar el 
cuadro delimitador (minx, miny, maxx, maxy) de las polilíneas?
3. Prepare los datos para visualizar (transformación de coordenadas, etc.) según el 
tamaño de la ventana que desea dibujar.
4. Programa para dibujar los datos (usando Canvas y objetos/funciones/
widgets relacionados). Organice su programa en un archivo o varios 
archivos para configurar un módulo en el sistema; importar el módulo y 
ejecutar el módulo que fue desarrollado y configurado.
5. Desarrolle un documento de Word que explique el programa.
6. Proporcione comentarios para todas las líneas del código para explicar la lógica.
http://taylorandfrancis.com
8
Algoritmos de datos vectoriales
GIS es diferente de otras tecnologías de software debido a sus algoritmos y análisis 
de relaciones espaciales en datos espaciales. Este capítulo introduce una categoría 
similar de algoritmos para el procesamiento de datos vectoriales, incluidos los 
cálculos de centroide (8.1), área (8.2), longitud (8.3), intersección de línea (8.4) y 
punto en polígono (8.5), que son los fundamentos algoritmos basados en la 
geometría y la relación espacial.
8.1 Centroide
El centroide se puede considerar como el centro de gravedad de una característica 
(wiki.gis 2011). Un ejemplo de aplicación del centroide es configurar la ubicación de 
la anotación, como etiquetar un edificio en un mapa. Esta sección analiza el cálculo 
del centroide para tres tipos de geometría: triángulo, rectángulo y polígono.
8.1.1 Baricentro de un Triángulo
El centroide de un triángulo se define como el punto de intersección de tres medianas de 
un triángulo (Johnson 1929,Figura 8.1). La mediana de un triángulo es el segmento de 
línea que se extiende desde un vértice hasta el punto medio de su lado opuesto. Dados 
tres vértices (X1,y1), (X2,y2), y (X3,y3) de un triángulo, el baricentro (Xcentroide,ycentroide) se puede 
calcular con la Ecuación 8.1.
- (X1+X2+X)-X- centroide =
3
3
(X+X+X)-
(8.1)
-y
--
1 2 3
centroide= 3
8.1.2 Baricentro de un rectángulo
El centroide de un rectángulo es la intersección de las dos diagonales del rectángulo 
(Figura 8.2). Dado el vértice inferior izquierdo (Xmin,ymin) y arriba a la derecha
137
138Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
(X3,y3)
(X,y)
(X1,y1) (X2,y2)
FIGURA 8.1
El baricentro de un triángulo es el punto de intersección de las tres medianas. (Referirse ahttp://
jwilson. coe.uga.edu/EMAT6680Su09/Park/As4dspark/As4dspark.html. para la prueba de concurrencia 
de las tres medianas.)
(Xmáximo,ymáximo)
(X,y)
(Xmin,ymin)
FIGURA 8.2
El centroide de un rectángulo es la intersección de dos diagonales.
vértice (Xmáximo,ymáximo) de un rectángulo, el centroide se puede calcular con la 
Ecuación 8.2.
- (Xmetro +Xmáximo
2
en )-X- centroide =
-
-
--
(8.2)
(ymin+ymáximo)
ycentroide = 2
8.1.3 Baricentro de un polígono
Para cualquier polígono cerrado que no se corte a sí mismo connortepuntos (X0,y0), (X1,y1), 
…, (Xnorte−1,ynorte−1), el centroide se puede calcular con la Ecuación 8.3, dondeAes el área del 
polígono, que se analiza en la Sección 8.2 (Bourke 1988). En esta fórmula, el último vértice 
(Xnorte,ynorte) del polígono se supone que es el mismo que el primer vértice (X0,y0). De 
hecho, los triángulos y los rectángulos son polígonos especiales, por lo que la Ecuación 
8.3 también se puede usar para calcular el centroide del triángulo y el rectángulo.
http://jwilson.coe.uga.edu/EMAT6680Su09/Park/As4dspark/As4dspark.html
http://jwilson.coe.uga.edu/EMAT6680Su09/Park/As4dspark/As4dspark.html
Algoritmos de datos vectoriales 139
-
- ∑
∑
norte−1
(Xi+1+Xi)(Xiyi+1−Xi+1yi)
--
-
-
-
X i=0centroide= 6A
(yi +yi)(Xiyi −Xiyi)
6A
(8.3)
norte−1
+ 1 + 1 + 1
ycentroide = i=0--
8.2 Área
Esta sección presenta cómo calcular el área de la entidad poligonal. Se 
discuten dos tipos de polígonos: un polígono simple y un polígono con 
hueco(s).
8.2.1 Área de un polígono simple
Un polígono simple es un polígono sin lados que se intersecan a sí mismos y que forma un 
camino cerrado.Figura 8.3amuestra un ejemplo de un polígono simple con seis puntos 
(vértices), donde el punto 1 es el mismo que el punto 6, formando un camino cerrado. Los 
puntos se registran en el sentido de las agujas del reloj.
Para calcular el área de este polígono, primero dibujamos líneas 
verticales desde cada punto del polígono hasta elX-eje para formar cinco 
trapecios: A y B (Figura 8.3b) y C, D y E (Figura 8.3c). Al examinar 
visualmente los cinco trapecios, el área del polígono (SPAGS) puede derivarse 
de la Ecuación 8.4.
SPAGS=SA+SB−SC−SD−Smi (8.4)
dóndeSA,SB,SC,SD, ySmidenote las áreas correspondientes de los cinco 
trapecios.
(a)y (b) (C)
2 2 2
1,6 1,63 3 1,6 3
5 4 = A B – 5 4
C D mi
X X X
FIGURA 8.3
Cálculo del área de un polígono simple.
140Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
Como se conocen las coordenadas de cada punto, podemos calcular el área de 
cada trapezoide con la Ecuación 8.5.
(X2−X1)(y2+y1)SA=
2
(X3−X2)(y3+y2)SB=
2
(X4−X3)(y4+y3)SC= (8.5)
2
X4)(y5+y4)(X5−SD=
2
(X6−X5)(y+y5)S= 6mi 2
Al sustituir la Ecuación 8.5 en la Ecuación 8.4, derivamos la Ecuación 8.6 para 
calcular el área del polígono.
5(Xi+1−X)(y+1+y)
2
SPAGS = ∑ i i i 12∑
5
= (Xi+1yi−Xiyi+1) (8.6)
i=1 i=1
Al generalizar la Ecuación 8.6, tenemos la Ecuación 8.7 para calcular el área de 
cualquier polígono simple connortepuntos (punto0= puntonorte).
1norte−1
A= 2∑ (Xiyi+1−Xi+1yi) (8.7)
i=0
8.2.2 Área de un Polígono con Agujero(s)
Un polígono puede tener uno o más agujeros. Por ejemplo, cuando un lago se 
representa como un polígono, una isla en el lago se puede representar como un 
agujero en el polígono. Cuando calculamos el área de un polígono, necesitamos 
restar el área del agujero del área del polígono circundante.Figura 8.4muestra una
- B
–
C
un +
FIGURA 8.4
Un polígono con dos agujeros.
Algoritmos de datos vectoriales 141
polígono (A) con dos agujeros (B y C). En GIS, los vértices de un agujero se registran en 
sentido contrario a las agujas del reloj. Por lo tanto, el área de los agujerosSBySCcalculado 
utilizando la Ecuación 8.7 dará como resultado unnumero negativo(SA< 0,SB< 0). Por lo 
tanto, el área real del polígono A se puede calcular comoS=SA− (−SB) − (−SC) =SA+ SB+SC.
8.3 Longitud
El cálculo de longitud encuentra la longitud de una entidad lineal y el perímetro de una 
entidad poligonal.
8.3.1 Longitud de un segmento de línea recta
Supongamos que hay dos puntos:PAGS1(X1,y1) yPAGS2(X2,y2) en el sistema de coordenadas 
cartesianas 2D. Para calcular la longitud del segmento de líneaPAGS1PAGS2, trazamos una 
línea horizontal desdePAGS1y una línea vertical dePAGS2para formar un triángulorectángulo (Figura 8.5). Supongamos que la longitud del lado horizontal esa, porque el 
lado vertical esb, y la hipotenusa esC. De acuerdo con el teorema de Pitágoras, tenemos 
la ecuaciónC2=a2+b2.
Si las longitudes de los lados de los dos ángulos rectosaybse conocen, la longitud 
del tercer lado, que es la longitud del segmento de rectaPAGS1PAGS2, puede ser 
derivado. Ya queaybson paralelas al eje, tenemosa=X2−X1,b=y2−y1. Reemplazando 
estas dos ecuaciones paraC2=a2+b2, la ecuación 8.8 se deriva para calcular la 
longitud de un segmento de línea:
PAGS1PAGS2=c= (X2−X21) + (y2−y1) 2 (8.8)
y
PAGS2(X2,y2)
C
b
α
PAGS1(X1,y1) a
X
FIGURA 8.5
Cálculo de la longitud de un segmento de línea recta.
142Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
PAGS3(X3,y3) PAGSnorte(Xnorte,ynorte)
PAGS2PAGS3
PAGS2(X2,y2) PAGS3PAGS4
PAGSnortePAGSnorte+1
PAGS(
PAGS1PAGS2 PAGS1(X4,y4)
norte+1Xnorte+1,ynorte+1)
PAGS1(X1,y1)
FIGURA 8.6
Una polilínea connorte+1 puntos
8.3.2 Longitud de una polilínea
Una polilínea consta de muchos segmentos de línea, por lo que la longitud de una polilínea es la suma 
de la longitud de todos los segmentos de línea.
Supongamos que hay una polilínea connorte+1 puntos:pags1,pags2,pags3,…,pagsnorte, ypagsnorte+1
(Figura 8.6). Con base en la Ecuación 8.8, la longitud de esta polilínea se puede calcular 
sumando las longitudes de todos los segmentos de línea (Ecuación 8.9).
Lpolilinea= ∑
norte norte
PAGSiPAGSi+1=∑
i=1
(Xi+1−X)2i + (y 2i+1−yi) (8.9)
i=1
8.4 Intersección de líneas
Verificar las intersecciones entre dos líneas es fundamental para los muchos 
cálculos de relaciones espaciales. Al determinar las intersecciones de línea, debemos 
verificar si los dos segmentos de línea tienen o no puntos compartidos. Dados dos 
segmentos de recta, Line1 ((X1,y1), (X2,y2)) y Línea2 ((X3,y3), (X4,y4)) en el sistema de 
coordenadas cartesianas (Figura 8.7), si dos segmentos de línea se intersecan, 
entonces debe haber al menos un punto (X0,y0) que está en ambos segmentos. 
Entonces, la pregunta es cómo averiguar si hay un punto común para los dos 
segmentos de línea. Además, ¿cómo calculamos los valores de las coordenadas del 
punto común (X0,y0)?
Un método común para representar una línea en el sistema de coordenadas 
cartesianas es usar la ecuación lineal:y=hacha+b, dóndeX,yson las variables,a,bson 
las constantes o parámetros,aes la pendiente de la recta, ybes la intersección de la 
línea cony-eje (Figura 8.8).
En base a esto, Line1 se puede representar comoy=a12X+b12; y Line2 se puede 
representar comoy=a34X+b34, dóndea12,b12,a34,b34son valores constantes que se 
pueden calcular en base a los cuatro puntos (X1,y1), (X2,y2), (X3,y3), y (X4,y4) como se 
detalla a continuación.
Algoritmos de datos vectoriales 143
y
(X,y) (X2,y2)3 3
(X1,y1) (X0,y0)
(X4,y4)
X
FIGURA 8.7
Ilustración de la intersección de segmentos de línea.
y
y=hacha + b
y=b
X
X= –licenciado en Letras
FIGURA 8.8
Representación matemática de una recta en sistema de coordenadas cartesianas.
Calculando un12,b12,a34,b34: Dado que los dos puntos (X1,y1), (X2,y2) están en la Línea 1, 
tenemos el siguiente grupo de ecuaciones (Ecuación 8.10):
-y1=a12X1+b12
--y2=a12X2+b12
(8.10)
Al resolver la Ecuación 8.10,a12,b12se representa como la Ecuación 8.11:
--a12= y−y1
X2−X1
2
- (8.11)
--b12=y1−a12X1
dóndeX2no es igual aX1.
Línea
 1
Líne
a 1Línea 2
Línea 2
144Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
De manera similar, para la Línea 2, tenemos el siguiente grupo de ecuaciones (Ecuación 8.12):
-y3=a34X3+b34
--y4=a34X4+b34
(8.12)
Al resolver la Ecuación 8.12,a34,b34se puede representar como la Ecuación 8.13:
--a34= y−y3
X4−X3
4
- (8.13)
--b34=y3−a34X3
dóndeX3no es igual aX4.
Como se mencionó anteriormente, si la Línea 1 y la Línea 2 se cruzan, debe haber un punto (
X0,y0) que es común a ambos segmentos de línea. En tal caso, (X0,y0) es la solución para el grupo 
de ecuaciones lineales binarias (Ecuación 8.14):
-y=a12X+b12
--y=a12X+b12
(8.14)
En consecuencia, el problema de buscar el punto común se transforma en 
comprobar si el grupo de ecuaciones 8.14 tiene o no solución. La solución (si existe) 
para la Ecuación 8.14 se puede representar como la Ecuación 8.15:
--X b12− b340=
- a34−a12 (8.15)
--y=a12X0+b12
dóndea34no es igual aa12, ya12,b12,a34,b34se puede calcular en base a los cuatro 
puntos dados. Se debe notar que (X0,y0) es la solución para dos rectas infinitas. 
Para comprobar si (X0,y0) cae en la Línea 1 ((X1,y1), (X2,y2)) y Línea2 ((X3,y3), (X4,y4)), 
se requiere la siguiente prueba:
X1≤X0≤X2
X3≤X0≤X4
y1≤y0≤y2
y3≤y0≤y4
Si las cuatro condiciones son verdaderas, la Línea 1 y la Línea 2 se intersecan en el punto (X0,y
0). De lo contrario, no se cruzan.
Algoritmos de datos vectoriales 145
El método anterior para verificar la intersección no funciona para dos escenarios 
especiales: líneas paralelas y líneas verticales.
8.4.1 Líneas paralelas
Como las rectas paralelas tienen la misma pendiente,a34es igual aa12. Por lo tanto, la 
Fórmula 8.15 no funciona para rectas paralelas (divididas por cero cuandoa34=a12). Esto 
tiene sentido ya que las líneas paralelas nunca se intersecarán. Sin embargo, si dos 
segmentos de línea están en la misma línea, también tenemosa34=a12. Para este 
escenario, los dos segmentos de línea se superpondrán (tendrán uno o más de un punto 
compartido) o no se cruzarán.
8.4.2 Líneas verticales
Como se ilustra enFigura 8.9, si Línea1 ((X1,y1), (X2,y2)) es vertical, tenemosX2=X1. 
En este caso, elXcoordenada del punto de intersección es igual aX1(X0=X1), y ely
coordenada del punto de intersección (y0) se puede calcular sustituyendoX0a la 
ecuación de Line2 como Ecuación 8.16.
y0=a34X0+b34 (8.16)
Una vez (X0,y0), se requiere la misma prueba para verificar si el punto de 
intersección cae en ambos segmentos de línea. Se puede aplicar el mismo 
método si Line2 ((X3,y3), (X4,y4)) es vertical.
Si ambas rectas son verticales, son paralelas. Esto se puede manejar de la misma manera 
que las líneas paralelas.
(X4,y4)
(X1,y1)
(X3,y3) (X1,y0)
(X2,y2)
FIGURA 8.9
Línea 1 ((X1,y1), (X2,y2)) es vertical.
146Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
PAGS2(X2,y2)
PAGS1(X1,y1)
PAGSnorte(Xmetro,ymetro)
PAGS(X,y1)1 1 PAGS2(X2,y2 ) PAGSnorte(Xnorte,ynorte)
FIGURA 8.10
Comprobación de intersección de dos polilíneas.
Dado que una polilínea consta de dos o más segmentos de línea (Figura 8.10), se puede 
usar el siguiente procedimiento para verificar si las dos polilíneas se cruzan: para cada 
segmento de línea en polilínea1, verifique si se cruza con alguno de los segmentos de 
línea en polilínea2. Una vez que se encuentra un único punto de intersección, podemos 
concluir que las dos polilíneas se intersecan. También podemos averiguar todos los 
puntos de intersección de dos polilíneas comprobando cada uno de los pares de 
segmentos de línea entre las dos polilíneas.
8.5 Punto en Polígono
A menudo se utiliza un algoritmo de emisión de rayos (Shimrat 1962) para comprobar si 
un punto está dentro de un polígono. Con un algoritmo de proyección de rayos, primero 
se dibuja un rayo a partir del punto en cualquier dirección fija (normalmente se toma una 
dirección vertical u horizontal para simplificar el cálculo), y luego se prueba cuántos 
puntos de intersección tiene ese rayo con el polígono. Si el número de puntos de 
intersección es impar, el punto está en el polígono; de lo contrario, el punto queda fuera 
del polígono.
Figura 8.11ilustra cómo funciona la proyección de rayos para probar si cada uno 
de los siete puntos dados está o no en el polígono.Tabla 8.1resume el número de 
puntos de intersección para los siete rayos verticales.
8.5.1 Un escenario especial
Si el rayo pasa por el vértice del polígono, entonces el rayo se cruza con ambos 
bordes compartiendo el vértice. Contar este escenario como dos puntos de 
intersección es problemático. EnFigura 8.12, el rayo del punto 1 pasapor un vértice, 
lo que genera dos puntos de intersección, lo que sugiere incorrectamente que este 
punto está fuera del polígono según la regla de pares e impares. Para el punto 3, 
que está fuera del polígono, el número de intersecciones también es dos, que es
Algoritmos de datos vectoriales 147
3 6
4
1
2 5
7
FIGURA 8.11
Ilustración del algoritmo de emisión de rayos.
TABLA 8.1
Número de puntos de intersección de los siete rayos
Identificación del punto Número de puntos de intersección ¿Punto en polígono?
1
2
3
4
5
6
7
0
2
1 (impar)
4
5 (impar)
2
6
No
No
Sí
No
Sí
No
No
consistente con la regla. Se necesita una consideración especial para resolver tales 
escenarios.
Examinando cuidadosamente, la diferencia es que, para el punto 1, las dos aristas que 
comparten el vértice están en lados diferentes del rayo, mientras que para el punto tres, 
las dos aristas están en el mismo lado (izquierda) del rayo. Un patrón general es que si los 
bordes están en lados diferentes, lo consideramos como un punto de intersección, pero si 
los bordes están en el mismo lado, lo consideramos como dos puntos de intersección. 
Según este patrón, ambos bordes del punto 2 están en el lado derecho del rayo cuando 
pasa por el vértice (es decir, dos intersecciones); agregar la intersección inequívoca en la 
parte superior del polígono da como resultado un total de tres puntos de intersección, y 
podemos concluir correctamente que cae dentro del polígono.
148Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
1 3
2
FIGURA 8.12
Escenarios especiales: el rayo pasa por el vértice del polígono.
8.6 Experiencia práctica con Python
8.6.1 Usar Python para dibujar un polígono y calcular el centroide
Descargue el archivo de Python chap8_centroid_pract.py del paquete de material del 
curso y ejecute el código para obtener la ventana "Práctica de centroide". Seleccione 
"Dibujar polígono" y haga clic en el lienzo para dibujar el polígono, luego haga clic 
en "Finalizar dibujo" para finalizar el dibujo. Seleccione "Calcular centroide" para 
calcular y visualizar el centroide en el lienzo. Identificar y analizar el código para el 
cálculo y visualización del centroide (Figura 8.13).
8.6.2 Uso de Python para dibujar polígonos y calcular el área del polígono
Descargue el archivo de Python chap8_area_pract.py del paquete de material del curso y 
ejecute el código para que aparezca la ventana "Práctica del área". Seleccione "Dibujar 
polígono" y haga clic en el lienzo para dibujar un polígono, luego haga clic en "Finalizar 
dibujo" para terminar de dibujar la imagen. Finalmente, haga clic en "Calcular área" para 
mostrar el área de este polígono. Identificar y analizar el código para el cálculo del área (
Figura 8.14).
8.6.3 Uso de Python para dibujar segmentos de línea y calcular la intersección
Descargue el archivo de Python chap8_intersection_pract.py del paquete de material 
del curso y ejecute el código para obtener la ventana "Práctica de intersección de 
líneas". Seleccione "Dibujar líneas" y haga clic en el lienzo para dibujar una línea, 
luego haga clic en "Finalizar dibujo". Repita para dibujar otra línea, luego haga clic 
en el botón "Comprobar intersección" para ver si se cruzan. Identifique y analice el 
código para el cálculo de intersección (Figura 8.15).
Algoritmos de datos vectoriales 149
FIGURA 8.13
Ventana “Práctica Centroide”.
FIGURA 8.14
Ventana “Área de práctica”.
150Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 8.15
Ventana “Práctica de intersección de líneas”.
8.7 Resumen del capítulo
Este capítulo presenta varios algoritmos de datos vectoriales populares dentro de 
SIG, que incluyen intersecciones de líneas, cálculos de centroides, cálculos de área y 
longitud y puntos en polígonos. Después de la discusión de los algoritmos, se 
proporcionan prácticas prácticas, con el objetivo de demostrar cómo implementar 
mediante programación los algoritmos de datos vectoriales utilizando Python.
PROBLEMAS
• Revisar el material de clase.
• Revisar el código de práctica de la clase: chap8_intersection_pract.py
• Cree los siguientes cuatro segmentos de línea: [(50 200), (400 200)], [(60 450), (400 
450)], [(100 600), (350 250)], [(300 100), (300 400)]
• Escribir un programa para determinar si se cruzan entre sí.
• Muestre los segmentos de línea en el monitor y dibuje el punto de 
intersección en un color y tamaño diferente.
Sección III
SIG avanzado
Algoritmos y sus
Programación en ArcGIS
http://taylorandfrancis.com
9
Programación ArcGIS
Programar todas las funciones de mapeo o análisis GIS desde cero no es factible 
debido a sus complejidades; sin embargo, muchos paquetes comerciales y de 
código abierto, como ArcGIS, admiten funciones GIS tan completas. La integración 
de varias funciones de paquetes existentes satisfará los requisitos analíticos de una 
aplicación. ArcGIS admite dicha implementación de flujo de trabajo a través de la 
programación de Python, que se ha convertido en una capacidad buscada por los 
profesionales de GIS. Este capítulo presenta la programación en ArcGIS for Desktop 
(es decir, ArcMap) usando Python. El conocimiento de ArcGIS presentado en este 
capítulo sentará las bases para los capítulos posteriores cuando programe 
algoritmos y análisis.
9.1 Programación ArcGIS
Muchas aplicaciones GIS prácticas son complejas e involucran múltiples funciones 
GIS, como modificar y consultar entidades y sus atributos asociados. Tomando la 
hospitalización como un ejemplo típico de SIG, supongamos que hay un grupo de 
pacientes potenciales a los que les gustaría ir a los hospitales más cercanos. Para 
ubicar el hospital más cercano para cada paciente potencial, la iteración debe pasar 
por cada paciente para identificar los hospitales dentro del vecindario de ese 
paciente y luego ubicar el hospital más cercano de cada paciente potencial. Esto se 
vuelve engorroso cuando hay una gran cantidad de pacientes.
Realizar y repetir manualmente la consulta y el procesamiento de datos espaciales requiere 
mucho tiempo, es tedioso y propenso a errores. Por lo tanto, es beneficioso automatizar dichos 
procesos utilizando la funcionalidad de un paquete GIS sofisticado. ArcGIS ModelBuilder (Figura 
9.1, Esri 2016a) permite a los usuarios integrar múltiples herramientas desde ArcToolbox (
Figura 9.1a) para formar un flujo de trabajo de análisis en una interfaz gráfica de usuario. 
Tenga en cuenta que ArcToolbox está reorganizado en la nueva versión de ArcGIS (p. ej., 10.4 y 
versión pro). La información relacionada se puede encontrar enhttp://pro.arcgis.com/en/pro-
app/help/analysis/geoprocessing/ basics/what-is-geoprocessing-.htm. El modelo podría 
procesar por lotes los procesos compatibles con las herramientas. Además, ArcGIS proporciona 
el paquete ArcPy (Esri 2016b), una biblioteca/módulo de Python que puede operar la mayoría 
de las funciones de ArcMap. Automatizar un proceso que involucra múltiples algoritmos GIS o 
pasos usando el paquete ArcPy y Python es rápido y fácil. El proceso por lotes integrado en 
ModelBuilder también se puede exportar como secuencias de comandos de Python. 
ModelBuilder es,
153
http://pro.arcgis.com/en/pro-app/help/analysis/geoprocessing/basics/what-is-geoprocessing-.htm
http://pro.arcgis.com/en/pro-app/help/analysis/geoprocessing/basics/what-is-geoprocessing-.htm
154Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
(a)
(b)
FIGURA 9.1
Geoprocesamiento con (a) ArcToolbox, ModelBuilder y (b) la ventana ArcMap Python.
por lo tanto, similar a las secuencias de comandos de Python con ArcPy; sin embargo, la 
creación de secuencias de comandos con ArcPy es más flexible que ModelBuilder, que está 
restringida por las ArcTools disponibles y la plantilla de operaciones. ArcMap proporciona una 
ventana de edición de complemento de Python (Figura 9.1b). Puede escribir secuencias de 
comandos de Python en un IDE de Python fuera de ArcMap importando el paquete de ArcPy. 
Estecapítulo presenta cómo usar ArcPy y demuestra su uso a través de una serie de ejemplos. 
La Sección 9.2 detalla la estructura de ArcPy, el entorno de programación y cómo usar los 
documentos de ayuda. Las secciones 9.3 a 9.7 presentan varias de las funcionalidades de ArcPy 
más utilizadas. Las Secciones 9.8 y 9.9 muestran cómo agregar las secuencias de comandos de 
Python desarrolladas como una nueva ArcTool para que otros puedan reutilizar la herramienta 
de secuencias de comandos de ArcMap.
9.2 Introducción al Paquete ArcPy
9.2.1 Funciones, clases y módulos de ArcPy
El paquete ArcPy se basa en el 'módulo de secuencias de comandos del geoprocesador de ArcGIS' 
anterior proporcionado a los usuarios desde la versión ArcGIS 10.0 para ofrecer funciones, clases y 
módulos para acceder a la mayoría de las funciones de ArcMap:
• Función: una funcionalidad definida por Esri que finaliza una tarea específica 
(p. ej., ListFeatureClasses, Describe, SearchCursor).
Programación ArcGIS 155
• Clase: una plantilla de objeto definida por Esri que tiene un conjunto de 
propiedades y métodos (p. ej., objetos SpatialReference, FieldMap).
• Módulo: un archivo de Python que generalmente incluye funciones y clases 
que realizan tareas similares. Hay acceso a datos, mapeo, analista de red, 
analista espacial y módulos de tiempo en las versiones de ArcMap 10.1+.
9.2.2 Programación con ArcPy en ArcMap
A partir de la versión 10.0, Esri incrustó una ventana de Python dentro de ArcMap (Figura 
9.2superior), que se puede abrir a través del botón en la barra de herramientas (dentro 
del rectángulo rojo). Podemos escribir el script de Python en el panel izquierdo de la 
ventana de Python (Figura 9.2lower), que tiene ArcPy importado, por lo que no tenemos 
que importar el paquete desde scripting. El documento de ayuda interactivo se incluye en 
el panel derecho para describir la función o clase actual que se está utilizando.
NOTA :Usamos 'ArcPy' en este texto para ser coherentes con la convención de nomenclatura de 
Esri; sin embargo, en la programación, se utilizará 'arcpy' (todo en minúsculas).
Práctica práctica 9.1
• Abra la ventana de Python desde ArcMap y escriba (no copie) el 
siguiente comando:
arcpy.Buffer_analysis(“”,“”,“”, “COMPLETO”, “FLAT”, “TODO”)
FIGURA 9.2
Ventana de ArcMap Python y el botón de apertura.
156Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
• Mientras escribe, observe el cambio en el documento de ayuda interactivo en 
el panel derecho de la ventana.
9.2.3 Programación con ArcPy en la ventana de Python fuera de ArcMap
Si programa con ArcPy fuera de ArcMap, importe el paquete de ArcPy (Figura 9.3) primero 
y luego importe el uso de ArcPy en el entorno externo para asegurarse de que sea el 
mismo que en la ventana de ArcMap Python. ArcGIS debe estar instalado para usar ArcPy. 
Los scripts desarrollados pueden guardarse como archivos *.py, distribuirse a otros o 
agregarse como una nueva ArcTool en la caja de herramientas, como se detalla en la 
Sección 9.8.
Para mejorar la flexibilidad de los scripts desarrollados para los usuarios finales, 
configure la entrada como valor "dinámico" y permita que el programa recupere 
automáticamente la entrada. lossys.argvse puede usar para este propósito con una lista 
de cadenas que contienen el nombre del script y argumentos adicionales que se pasan al 
script.
Práctica práctica 9.2: Obtención de la entrada de parámetros del sistema
1. Abra la ventana del editor de Python e ingrese el Código 9.1. Guarda el código en
un archivo .py, por ejemplo, samplecode.py.
2. Abra la consola de comandos de Windows, navegue a la carpeta donde se 
guardó el archivo *.py y ejecute el script para realizar el análisis de búfer 
con el siguiente comando:
código de muestra.py C:\Default.gdb\out2 C:\Default.gdb\output 5000 
metros
El primer parámetro es la ruta absoluta de los datos de entrada, el segundo 
parámetro es la ruta absoluta de los datos de salida y el tercero describe el tamaño 
del búfer (Figura 9.4).
FIGURA 9.3
Ejemplo de código de uso de ArcPy fuera de ArcMap.
Programación ArcGIS 157
importararcpy
importarsistema
script_name = sys.argv[0] 
fc=sys.argv[1]
salida=sys.argv[2]
bufferSize=sys.argv[3]
arcpy.Buffer_analysis(fc, salida, bufferSize)
CÓDIGO 9.1
Código Python usando ArcPy y permitiendo entradas de parámetros flexibles.
FIGURA 9.4
Captura de pantalla del comando de Windows para ejecutar un archivo .py y la salida. (Si no se informa 
ningún error en la ventana y se genera la salida, entonces la ejecución es exitosa).
9.2.4 Uso de documentos de ayuda
Esri ofrece varios documentos de ayuda para que los usuarios obtengan conocimientos 
detallados sobre secuencias de comandos al utilizar ArcPy. Los usuarios pueden acceder al 
documento de ayuda de escritorio (Figura 9.5) haciendo clic en la opción "ayuda" en la barra de 
menú de ArcMap. Hay otro documento de ayuda disponible en el centro de recursos de ArcGIS (
Figura 9.5). Para la versión de ArcGIS 10.1 a 10.2.2, el contenido se encuentra en "escritorio" -> 
"geoprocesamiento" -> "ArcPy" en el centro de recursos (http://resources.arcgis.com/en/help/
main/10.2/index.html). Para la versión más reciente, la información se puede explorar enhttp://
resources.arcgis.com/en/help/. Tanto el centro de recursos como el documento de 'Ayuda' de la 
versión de escritorio describen cómo usar ArcTools. Al final de la introducción de cada 
herramienta, también hay detalles de sintaxis y un código de muestra para usar la función 
ArcPy (Figura 9.6). Se puede acceder a esto en "escritorio" -> "geoprocesamiento" -> "referencia 
de herramienta". También puede buscar el nombre de la herramienta y la sintaxis para que el 
código de muestra se proporcione en la parte inferior de la página de resultados.
Para los usuarios novatos, una forma de aprender ArcPy es revisar uno de los tres 
documentos de ayuda, probar el código de muestra y realizar cambios en el código 
utilizando datos personalizados. La ventana de solicitud de Python dentro de ArcMap 
incorpora la ayuda interactiva en cada función y clase de ArcPy.
http://resources.arcgis.com/en/help/main/10.2/index.html
http://resources.arcgis.com/en/help/main/10.2/index.html
http://resources.arcgis.com/en/help/
158Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 9.5
Documento de ayuda de escritorio y en línea.
Práctica práctica 9.3: Aprenda a leer documentos de ayuda
1. Lea la ayuda en el centro de recursos de ArcGIS.
2. Busque la herramienta "Agregar campo" en el cuadro de búsqueda en la parte superior derecha.
3. Lea la sintaxis de "arcpy.AddField_management" y ejecute el código 
de muestra con sus propios datos.
9.3 Automatización de ArcTools con Python
Se puede acceder a la mayoría de las herramientas de ArcToolBox mediante el script de ArcPy. Por 
ejemplo, el análisis de clips es
Programación ArcGIS 159
FIGURA 9.6
Sintaxis y código de muestra del script de Python en el documento de ayuda en línea para la herramienta de geoprocesamiento 
correspondiente.
arcpy.Clip_analysis (in_features, clip_features, out_feature_class, 
{ cluster_tolerance})
donde los primeros tres parámetros son obligatorios y el último parámetro con llaves es 
opcional. La creación de secuencias de comandos, en lugar de operar la herramienta a 
través de la interfaz de ArcToolBox, es muy útil cuando el proceso implica un bucle (
declaración for/while)o expresión condicional (sideclaración) para ejecutar la función de 
geoprocesamiento repetidamente bajo ciertas condiciones. Por ejemplo, para calcular la 
longitud de la línea dentro de cada polígono en una capa de datos, el proceso debe incluir 
unporbucle para habilitar el proceso repetido para cada polígono. Dentro deporbucle, 
habrá una función de recorte que puede cortar la línea dentro de ese polígono y una 
función de estadísticas, que suma la longitud total de las líneas dentro del polígono.
160Introducción a la Programación GIS y Fundamentos con Pythony ArcGIS®
Práctica práctica 9.4: Calcular la longitud de la carretera dentro de un área
1. Escriba Código 9.2 en la ventana de Python en ArcMap. Cambie las rutas 
según su espacio de trabajo.
Tenga en cuenta que arcpy.env.workspace se ejecuta al principio para configurar 
el espacio de trabajo, que es la ruta para acceder a los datos de entrada y guardar los 
resultados. Con el espacio de trabajo del entorno configurado, el parámetro de 
entrada y salida se puede configurar mediante la ruta relativa. Si las entradas son 
clase de entidad, imagen, etc., almacenadas en una geodatabase, podemos 
configurar la geodatabase como el espacio de trabajo. Si las entradas son Shapefiles, 
TIN, etc., podemos configurar la geodatabase como la carpeta donde se almacenan 
los archivos de entrada. Por el contrario, si el espacio de trabajo no está configurado, 
los parámetros de entrada y salida deben configurarse mediante rutas absolutas. 
Incluso cuando se configura el espacio de trabajo, aún podemos ingresar o generar 
cualquier conjunto de datos fuera del espacio de trabajo usando directamente la ruta 
absoluta, por ejemplo:
arcpy.MakeFeatureLayer_management("I:\\sampledata\\data.gdb\\ 
bearMove", "inferLy")
2. Abra las tablas de salida y enumere las longitudes totales de las carreteras en cada 
polígono (Figura 9.7)
9.4 Acceso y edición de datos con cursores
Los análisis o procesos de datos a menudo requieren registros para acceder a los valores de los 
campos. Utilice el cursor para apuntar a un registro en una tabla o clase de entidad.
Un cursor es un objeto de acceso a datos que se puede usar para recorrer el 
conjunto de filas de una tabla o para insertar nuevas filas en una tabla. Los cursores 
se utilizan comúnmente para leer y actualizar atributos. Cursor es una de las 
funciones de ArcPy en el módulo de acceso a datos Cursor (que requiere 
ArcGIS10.1+), y se recomienda debido a su alto rendimiento y fácil operación.
Los cursores tienen tres formas. Están
• SearchCursor: acceso de solo lectura para obtener la geometría y los atributos de los 
registros de características
• UpdateCursor: acceso de lectura y escritura para actualizar registros de características
• InsertCursor: acceso de escritura con capacidad para crear nuevos registros
9.4.1 Cursor de búsqueda
La función SearchCursor establece un cursor de solo lectura en una clase de entidad, 
como un archivo de formas o una tabla. El SearchCursor se puede utilizar para iterar
Programación ArcGIS 161
""
"
Es
ta
bl
ez
ca
 la
 r
ut
a 
de
 la
s 
ca
rr
et
er
as
 d
e 
da
to
s 
de
 e
nt
ra
da
 y
 lo
s 
da
to
s 
de
 o
ri
ge
n.
 N
ec
es
it
as
 c
am
bi
ar
 a
 tu
 p
ro
pi
o 
ca
m
in
o.
 E
n 
es
ta
 
m
ue
st
ra
, e
l e
sp
ac
io
 d
e 
tr
ab
aj
o 
es
 u
na
 g
eo
da
ta
ba
se
.
"b
ea
rM
ov
e"
 y
 "
ro
ad
s"
 s
on
 d
os
 c
la
se
s 
de
 e
nt
id
ad
 e
n 
la
 g
eo
da
ta
ba
se
.
""
"
ar
cp
y.
en
v.
es
pa
ci
o 
de
 tr
ab
aj
o 
="
O
:\\
Li
br
o\
\C
ód
ig
o\
\9
\\
ch
p9
D
at
a\
\b
oo
kS
am
pl
eD
at
a.
gd
b"
# 
as
eg
úr
es
e 
de
 q
ue
 b
ea
rM
ov
e 
es
té
 e
n 
el
 e
sp
ac
io
 d
e 
tr
ab
aj
o 
pr
im
er
o 
ar
cp
y.
M
ak
eF
ea
tu
re
La
ye
r_
m
an
ag
em
en
t(
"b
ea
rM
ov
e"
,"
in
fe
rL
y"
) 
ar
cp
y.
M
ak
eF
ea
tu
re
La
ye
r_
m
an
ag
em
en
t(
"c
ar
re
te
ra
s"
,"
ta
rg
et
Ly
")
""
"
"M
ak
eF
ea
tu
re
La
ye
r_
m
an
ag
em
en
t"
 p
ue
de
 c
re
ar
 u
n 
ob
je
to
 d
e 
ca
pa
 d
e 
ca
ra
ct
er
ís
ti
ca
s 
a 
pa
rt
ir
 d
e 
la
 ru
ta
 d
e 
la
 e
nt
ra
da
, 
qu
e 
es
 u
na
 c
ad
en
a.
 A
 c
on
ti
nu
ac
ió
n,
 s
e 
re
al
iz
an
 "
Se
le
ct
La
ye
rB
yA
tt
ri
bu
te
",
 "
Cl
ip
_a
na
ly
si
s"
 y
 "
St
at
is
ti
cs
_a
na
ly
si
s"
 e
n 
la
 
ca
pa
 d
e 
en
ti
da
de
s.
""
"
po
ri
en
ra
ng
o(
0,
9)
:
# 
se
le
cc
io
na
 e
l p
ol
íg
on
o 
co
n 
FI
D
 =
 i
ar
cp
y.
Se
le
ct
La
ye
rB
yA
tt
ri
bu
te
_m
an
ag
em
en
t(
"i
nf
er
ir
",
"N
EW
_S
EL
EC
TI
O
N
",
"\
"O
BJ
EC
TI
D
 \"
="
+c
al
le
(i)
)
# 
ej
ec
ut
ar
 a
ná
lis
is
 d
e 
cl
ip
 y
 e
xt
ra
er
 d
at
os
 in
te
rm
ed
io
s 
"o
ut
_"
 +
 s
tr
(i)
 e
n 
el
 e
sp
ac
io
 d
e 
tr
ab
aj
o 
fc
 =
 
ar
cp
y.
Cl
ip
_a
na
ly
si
s(
"o
bj
et
iv
o"
, "
in
fe
ri
r"
, "
fu
er
a"
+c
al
le
(i)
)
# 
ej
ec
ut
ar
 e
l a
ná
lis
is
 e
st
ad
ís
ti
co
 d
e 
su
m
a 
y 
ge
ne
ra
r e
l r
es
ul
ta
do
 "
su
m
_"
 +
 s
tr
(i)
 e
n 
el
 e
sp
ac
io
 d
e 
tr
ab
aj
o 
ar
cp
y.
St
at
is
ti
cs
_a
na
ly
si
s(
fc
,"
su
m
a"
+c
al
le
(i)
, [
["
Fo
rm
a_
Lo
ng
it
ud
",
"S
U
M
A"
]])
CÓ
D
IG
O
 9
.2
Au
to
m
at
ic
e 
el
 c
ál
cu
lo
 d
e 
la
 lo
ng
itu
d 
de
 la
 c
ar
re
te
ra
 d
en
tr
o 
de
 c
ad
a 
po
líg
on
o.
162Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 9.7
Ejemplo de tabla de resumen de salida generada por Code 9.2.
a través de objetos de fila y extraer valores de campo. La sintaxis de SearchCursor es la 
siguiente:
arcpy.da.searchCursor (in_table, field_names, {where_clause}, {spatial_reference}, 
{explode_to_points}, {sql_clause})
El primer argumento (tabla de características de entrada) y el segundo argumento (los campos 
consultados) son obligatorios, mientras que otros son opcionales (p. ej., limitados por una cláusula where o 
por campo, y opcionalmente ordenados).
Práctica práctica 9.5: Obtener atributos de cada característica de un Shapefile usando el 
cursor de búsqueda
1. Abra una ventana de Python en ArcMap y escriba Código 9.3.
# cambia la ruta según la tuya
datos de entrada ="O:\\Libro\\Código\\9\\chp9Data\\Partial_Streets.shp"
"""
Abra un SearchCursor e incluya una lista de atributos a los que desea acceder (por ejemplo, 
Shape_Leng, NAME, TYPE) en los parámetros.
"""
filas = arcpy.da.SearchCursor(inputdata, ["Forma_Longitud","NOMBRE","ESCRIBE"]) archivo 
de salida =abierto("C:\\ArcGISdata\\resultados.txt","w")
# iterar a través de las filas en el cursor porfilaen
filas:
# se accede a los atributos usando la fila [índice] - por ejemplo, la fila [0] es "Shape_Leng" 
archivodesalida.escribir("{}, {}, {}\n".format(fila[0], fila[1], fila[2]))
"""
El cursor colocará un bloqueo en los datos hasta que se complete el script o se elimine el objeto 
del cursor. Por lo tanto, debemos eliminar los objetos de fila y cursor para eliminar los bloqueos 
de lectura en la fuente de datos.
"""
delfila
delfilas
archivo de salida.cerrar()
CÓDIGO 9.3
SearchCursor con declaración for.
Programación ArcGIS 163
datos de entrada ="O:\\Libro\\Código\\9\\chp9Data\\Partial_Streets.shp"
conarcpy.da.SearchCursor(datos de entrada, ["Forma_Longitud","NOMBRE","ESCRIBE"])comofilas:
porfilaenfilas:
impresión"{}, {}, {}\n".format(fila[0], fila[1], fila[2])
CÓDIGO 9.4
SearchCursor usando la instrucción with.
datos de entrada ="O:\\Libro\\Código\\9\\chp9Data\\Partial_Streets.shp"
# seleccione las funciones con FID < 10
conarcpy.da.SearchCursor(datos de entrada, ["Forma_Longitud", "NOMBRE", "TIPO"], 
"FID < 10")comofilas:
porfilaenfilas:
impresión"{}, {}, {}\n".format(fila[0], fila[1], fila[2])
CÓDIGO 9.5
SearchCursor con cláusula where ("FID < 10").
2. Verifique el archivo results.txt. ¿Qué se incluye en el archivo? ¿Cuántas líneas 
puedes encontrar en el archivo?
3. Los cursores de búsqueda también son compatibles concondeclaración. Usando 
unconLa declaración garantizará que el iterador se cierre y se libere el bloqueo 
de la base de datos. Al aplicar elcondeclaración, el código anterior se puede 
cambiar a Código 9.4.
4. UndóndeLa cláusula puede usarse para limitar los registros devueltos por el cursor. 
Ejecute el Código 9.5 y verifique el resultado nuevamente. ¿Cuántas líneas se incluyen 
en el archivo de resultados?
5. SearchCursor también puede acceder a la geometría característica. Ejecute Code 9.6 y 
Code 9.7, y luego verifique el resultado nuevamente:
conarcpy.da.SearchCursor(datosde entrada, [" FORMA@ ", " FORMA@LONGITUD "], 
"FID < 10")comofilas:
porfilaenfilas:
# devuelve la x y la y del primer punto y la longitud de cada 
característica
impresión"{}, {}\n".format(fila[0].primerpunto, fila[1])
CÓDIGO 9.6
Acceso a la geometría mediante el ejemplo 1 de SearchCursor.
conarcpy.da.SearchCursor(datos de entrada, [" FORMA@ "],"FID < 10")comofilas:
porfilaenfilas:
porpntarrayenfila[0]:
porpuntoenpntarray:
# devolver una tupla de coordenadas x e y de los dos primeros
# características en los datos
impresión("{0}, {1}".format(punto.X, punto.Y))
CÓDIGO 9.7
Acceso a la geometría mediante el ejemplo 2 de SearchCursor.
164Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
datos de entrada ="O:\\Libro\\Código\\9\\chp9Data\\Partial_Streets.shp"
# crear cursor de actualización para la clase de entidad
conarcpy.da.UpdateCursor(datos de entrada, ["Forma_Longitud","DEFENSOR"])comofilas:
porfilaenfilas:
# actualice el campo "Shape_Leng" bajo las condiciones del campo 
"FID"
sifila[1] > 10:
fila[0] = fila[0] * 0,3048
más:
fila[0] = fila[0] * 0.5 
filas.updateRow(fila)
CÓDIGO 9.8
Ejemplo de UpdateCursor.
datos de entrada ="O:\\Libro\\Código\\9\\chp9Data\\railway.shp"
# crear cursor de actualización para la clase de entidad
conarcpy.da.UpdateCursor(datos de entrada, ["Forma","DEFENSOR"])comofilas:
porfilaenfilas:
sifila[1] < 10:
filas.deleteRow()
CÓDIGO 9.9
Uso de UpdateCursor para eliminar filas/registros.
9.4.2 Actualizar Cursor
El objeto UpdateCursor se puede usar para actualizar o eliminar filas específicas en una 
clase de entidad, un archivo de formas o una tabla. La sintaxis de UpdateCursor es similar 
a la de SearchCursor:
arcpy.da.UpdateCursor (in_table, field_names, {where_clause}, {spatial_reference}, 
{explode_to_points}, {sql_clause})
Práctica práctica 9.6: actualice los atributos de cada característica para un archivo 
Shapefile usando UpdateCursor
1. Verifique el valor del atributo de "Shape_Leng" en los datos "Partial_ 
Streets.shp".
2. Abra una ventana de Python en ArcMap y escriba Código 9.8 en el editor.
3. Verifique el resultado "Partial_Streets.shp" para ver si el atributo 
"Shape_Leng" se ha actualizado.
4. Abra una ventana de Python en ArcMap y escriba Código 9.9 en el editor y 
ejecute el código para eliminar filas específicas.
9.4.3 Insertar cursor
InsertCursor se utiliza para insertar nuevos registros en una clase de entidad, un archivo de formas o 
una tabla. InsertCursor devuelve un objeto de enumeración, es decir, una fila en una tabla.
Programación ArcGIS 165
datos de entrada ="O:\\Libro\\Código\\9\\chp9Data\\bookSampleData.gdb\\school"
# cree el cursor de inserción y enumere los atributos que deben completarse 
con valores
cursor = arcpy.da.InsertCursor(inputdata, ["ESCUELA_NAM"," FORMA@XY "])
"""
Cree un nuevo registro con la propiedad "NOMBRE" rellenado con el 
valor "NewSchool" y las coordenadas xy rellenadas con 
(1847395.83394, 772277.97643)
"""
nueva_fila = ["Nueva escuela", (1847395.83394, 772277.97643)] 
cursor.insertRow(nueva_fila)
# eliminar cursor para eliminar bloqueos en los datos 
delcursor
CÓDIGO 9.10
Insertar ejemplo de cursor.
Práctica práctica 9.7: Inserta filas en un Shapefile usando el InsertCursor
1. Abra la tabla de atributos de “school.shp” y cuente el número de 
registros.
2. Abra una ventana de Python en ArcMap y escriba Código 9.10.
3. Verifique la nueva fila agregada a los datos "school.shp".
9.4.4 NúmPy
Como una característica nueva en ArcMap 10.1+, los módulos de acceso a datos ofrecen 
funciones para permitir la transformación entre matrices de datos y clases o tablas de 
características. Dado que la biblioteca NumPy tiene capacidades poderosas para manejar 
matrices, la función relacionada de ArcPy se desarrolla en base a NumPy. Con arcpy. 
NumPyArrayToFeatureClass, arcpy.NumPyArrayToTable y arcpy. Con las funciones 
TableToNumPyArray, los usuarios pueden transformar rápidamente los valores que están 
organizados en una matriz en una clase de entidad o tabla, y viceversa.
Sin usar la función NumPy en el módulo de acceso a datos, incluya muchos más pasos 
para crear una clase de entidad de puntos para que el rendimiento sea mucho menor 
(Código 9.11).
Por el contrario, crear la clase de entidad con NumPy requiere solo un paso. 
La función arcpy.da.NumPyArrayToFeatureClass en realidad crea una clase de 
entidad e inserta dos registros dentro.
Las manos en
NumPyArrayToFeatureClass
Práctica 9.8: Crear una clase de entidad usando
1. Abra la ventana de Python en ArcMap y ejecute el Código 9.12 para crear 
una clase de entidad usando las funciones NumPy en el módulo de acceso 
a datos.
166Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
importararcpy
importarentumecido
# matriz de entrada
matriz = numpy.array([(1,(471316.3835861763, 5000488.782036674)),
(2, (470402.49348005146, 5000049.216449278))], numpy.dtype([('campo 
de id', numpy.int32),('XY','<f8',2)]))
# crea la clase de entidad con el campo XY en la matriz hazaña = 
arcpy.CreateFeatureclass_management
("O:\\Libro\\Código\\9\\chp9Data\\Default.gdb", "out2", "POINT") cursor = 
arcpy.da.InsertCursor(hazaña, [" FORMA@XY "])
porienformación:
nueva_fila = [i[1]]
cursor.insertRow(nueva_fila) del
cursor
CÓDIGO 9.11
Agregue varios registros nuevos a la clase de entidad mediante InsertCursor.
importararcpy
importarentumecido
salida ="O:\\Libro\\Código\\9\\chp9Data\\Default.gdb\\out"
# matriz de entrada
matriz = numpy.array([(1,(471316.3835861763, 5000488.782036674)),
(2, (470402.49348005146, 5000049.216449278))], numpy.dtype([('campo 
de id', numpy.int32),('XY','<f8',2)]))
# crea la clase de entidad con el campo XY en la matriz 
arcpy.da.NumPyArrayToFeatureClass(matriz, salida, ['XY'])
CÓDIGO 9.12
Agregue varios registros nuevos a la clase de entidad mediante NumPyArrayToFeatureClass.
2. Ejecute también el Código 9.11 en la ventana de Python en ArcMap y 
compare el tiempo de ejecución con y sin el uso de numpy: arcpy. 
da.NumPyArrayToFeatureClass tiene un rendimiento mucho mejor.
9.5 Describir y enumerar objetos
9.5.1 Describir
Describa una función utilizada para leer propiedades de datos devolviendo un objeto de 
propiedad. Dependiendo de los argumentos pasados a los métodos, el objeto devuelto 
podría ser
• Tipos de datos (Shapefile, cobertura, conjuntos de datos de red, etc.)
• Tipo de geometría (punto, polígono, línea, etc.)
Programación ArcGIS 167
datos ="O:\\Libro\\Código\\9\\chp9Data\\bookSampleData.gdb\\railway" dscb = 
arcpy.Describe(datos)
sidscb.shapeType =="Polígono":
impresión"Soy polígono" elif
dscb.shapeType =="Polilínea":
impresión"Soy polilinea"
más:
impresión"No soy ni polilínea ni polígono"
CÓDIGO 9.13
Describir el ejemplo de función.
• Referencia espacial
• Alcance de las características
• Ruta y así sucesivamente
Práctica práctica 9.9: comprobar las propiedades de una clase de entidad
1. Ejecute el Código 9.13 en la ventana de Python de ArcMap y compruebe el resultado. 
¿Cuál es el tipo de forma de la clase de entidad de entrada?
2. Reemplace el parámetro Describir con otro archivo de forma que tenga 
diferentes tipos geométricos y vea cómo cambian los resultados al ejecutarlo 
nuevamente.
9.5.2 Lista
ArcPy proporciona funciones para enumerar todos los datos en un espacio de trabajo particular 
o enumerar la información correspondiente en los datos. ListFields son funciones de uso 
frecuente en ArcPy para enumerar todos los campos y las propiedades asociadas de una clase 
de entidad, un archivo de formas o una tabla. El código 9.14 es un ejemplo de la función 
ListFields. El código controla las operaciones que se realizarán solo en campos específicos: 
aquellos que están en tipo "Doble" o que incluyen el nombre "Bandera".
Las funciones que enumeran datos en un espacio de trabajo (por ejemplo, ListDatasets, 
ListFeatureClasses, ListFiles, ListRasters, ListTables) son muy útiles para ayudar al 
procesamiento por lotes. Por ejemplo, para realizar unanálisis de búfer para múltiples
importararcpy
# enumerar el campo de los datos "roads.shp" en la carpeta "ArcGISdata" listas de 
campos = arcpy.ListFields("O:\\Libro\\Código\\9\\chp9Data\\ bookSampleData.gdb\
\roads")
# observar cada campo en la lista de retorno por
campoenlistas de campos:
# imprimir la propiedad del campo, su nombre, escala y tipo impresión
campo.nombre,campo.escala,campo.tipo
CÓDIGO 9.14
Ejemplo de ListFields.
168Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
archivos de forma de polilínea en un espacio de trabajo, enumere todos los archivos de forma de 
polilínea con el método ListFeatureClasses, luego use un ciclo para recorrer cada archivo de forma, 
realizando un análisis de búfer usando el método Buffer_analysis.
Práctica práctica 9.10: Realizar análisis de zona de influencia para cada clase de entidad de polilínea 
en un espacio de trabajo
1. Copie los datos deCapítulo 9a su espacio de trabajo (p. ej., 'C:\\ 
sampledata'), o use cualquier archivo de forma que pueda tener y 
colóquelo en su espacio de trabajo.
2. Ejecute el Código 9.15 y verifique la consola de salida para responder¿Cuántas 
entidades de polilínea tiene en el espacio de trabajo??
3. Cambie el código e implemente un análisis de zona de influencia para cada clase de entidad 
de punto dentro de 10 millas.
La función Caminar en el módulo de acceso a datos puede ayudar a enumerar todos 
los datos en el área de trabajo o en su subárea de trabajo en jerarquía. Por ejemplo, hay 
un archivo de forma, un archivo .png, una geodatabase "Default.gdb" y una carpeta 
"temp" en un espacio de trabajo específico "sampledata". Esta función enumerará todos 
los archivos en "sampledata", las clases de entidad en "Default.gdb" y los archivos en 
"temp". La función Caminar es mucho más rápida que las funciones de lista tradicionales. 
El código 9.16 es un código de muestra de la función Caminar yFigura 9.8muestra sus 
resultados.
importararcpy
arcpy.env.espacio de trabajo ="O:\\Libro\\Código\\9\\chp9Data"
# obtener la lista de todas las clases de entidad de polilínea fcList = 
arcpy.ListFeatureClasses('*','Polilínea')
# imprime la lista de clases de características una a la vez por
f.c.enfcLista:
impresión'-----Realizar análisis de búfer para Polyline:', fc inputFCName 
= fc[0:-4]# deshacerse de '.shp' salidaFCNombre = entradaFCNombre +
'_buffer_10Metro'+'.shp' arcpy.Buffer_analysis(fc, outputFCName,'10 
metros')
CÓDIGO 9.15
Enumere todas las clases de entidad de polilínea y realice un análisis de zona de influencia en ellas.
espacio de trabajo ="O:\\Libro\\Código\\9\\chp9Data"
pordirpath, dirnames, nombres de archivosenarcp.da.Walk(espacio de trabajo):
impresión"------------"
impresióncamino de tierra;
impresiónnombres de dir;
impresiónnombres de archivo;
CÓDIGO 9.16
Enumere los archivos usando la función arcpy.da.Walk.
Programación ArcGIS 169
FIGURA 9.8
Resultados de la función arcpy.da.Walk.
9.6 Manipulación de objetos complejos
Además de los objetos simples de uso común, como cadenas (p. ej., ruta de datos) o 
números (p. ej., distancia de búfer), ArcPy ofrece clases para representar objetos 
complejos (p. ej., referencia espacial y campo de atributos).
Un objeto complejo típico es ValueTable. Muchas ArcTools incluyen este objeto para 
permitir la entrada con múltiples valores. Por ejemplo, la herramienta Unión utiliza 
ValueTable como un parámetro de entrada (Figura 9.9). En consecuencia, el script usa 
ValueTable para crear el parámetro de entrada correspondiente.
Otro objeto complejo popular, el campo, describe el campo en la tabla de atributos de una 
clase de entidad, un archivo de forma y una tabla (Código 9.17).
Mientras tanto, ArcPy también proporciona las clases para manipular objetos geométricos. La 
información de geometría generalmente se almacena en clases de entidades, capas de entidades o 
conjuntos de datos. Acceder a la geometría directamente no es común cuando se usa
FIGURA 9.9
Realice la unión con ArcMap y secuencias de comandos de python.
170Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
importararcpy
FC ="O:\\Libro\\Código\\9\\chp9Data\\libroSampleData.gdb\\carreteras" desc 
= arcpy.Describe(fc)
# obtener una lista de objetos de campo del objeto descrito campos = 
desc.campos
porcampoencampos:
# manipular el objeto de campo e imprimir la propiedad de cada campo impresión
nombre del campo
impresióncampo.aliasName
impresiónTipo de campo
sicampo.tipo =="Doble":
impresióncampo.escala
CÓDIGO 9.17
Acceder a las propiedades de un objeto de campo.
herramienta de geoprocesamiento para el análisis. A veces, sin embargo, solo se necesita 
información de ubicación, como la creación de puntos de muestra y una distancia de zona de 
influencia. El uso de objetos geométricos puede ahorrar tiempo en la creación de clases de 
entidades que realmente no persisten. ArcPy ofrece varios tipos de objetos geométricos:
• Punto: un solo punto, que es la unidad básica para todos los demás tipos de geometría, no se 
puede usar directamente como entrada en funciones de geoprocesamiento
• Geometría: un tipo general
• Multipunto: una entidad geométrica con múltiples puntos, que consta de 
Punto(s)
• PointGeometry: una entidad geométrica con un solo punto, que consta de 
Point
• Polilínea: una entidad de geometría de línea, que consta de Punto(s)
• Polígono: una entidad de geometría poligonal, que consta de Punto(s)
El código 9.18 presenta un análisis de zona de influencia con geometría como entrada.
Práctica práctica 9.11: Manipulación de objetos de referencia espacial
# crear un punto
punto = arcpy.Punto(471316.38358618, 5000448)
# crear la interfaz de geometría del punto pointgeom = 
arcpy.PointGeometry(punto)
# crear geometría de salida 
outgeom = arcpy.Geometría()
# calcular el búfer de la geometría del punto de creación 
arcpy.Buffer_analysis(pointgeom,outgeom,"5000 metros")
CÓDIGO 9.18
Ejemplo de uso de objetos geométricos para realizar análisis de zonas de influencia.
Programación ArcGIS 171
# usa el nombre del sistema de coordenadas
refEspacial = arcpy.SpatialReference(“Hawaii Albers Equal Area Conic”)
# o use un archivo de proyección (.prj)
sr = arcpy.SpatialReference(“C:\\coordsystems\\NAD 1983.prj”)
CÓDIGO 9.19
Crear objeto SpatialReference.
1. Cree el objeto usando una cadena como ruta a un archivo .prj o usando una cadena 
con el nombre de la referencia espacial (Código 9.19). SpatialReference es una clase 
de ArcPy.
2. Acceder a la propiedad del objeto de referencia espacial (Código 9.20).
3. Cree una clase de entidad en la geodatabase utilizando la referencia espacial creada 
(Código 9.21).
4. Cree una clase de entidad en la geodatabase utilizando la referencia espacial de 
otro conjunto de datos (Código 9.22). La función Describe se utilizará para 
obtener la información de referencia espacial de los datos.
impresiónref.espacial.nombre
impresiónref.espacial.XYTolerancia 
impresiónref.espacial.metrosPorUnidad 
impresiónrefespacial.GCS
CÓDIGO 9.20
Acceda a las propiedades de un objeto SpatialReference.
importararcpy
arcpy.env.espacio de trabajo = ("O:\\Libro\\Código\\9\\chp9Data")
# usa el nombre del sistema de coordenadas
refEspacial = arcpy.ReferenciaEspacial("Hawaii Albers Equal Area Conic")
# crea el FDS usando la referencia espacial creada desde arcpy. Método 
SpatialReference()
arcpy.CreateFeatureDataset_management
('O:\\Libro\\Código\\9\\chp9Data\\Default.gdb','resultados', referencia espacial)
CÓDIGO 9.21
Cree una clase de entidad con una referencia espacial.
importararcpy
arcpy.env.espacio de trabajo = ("O:\\Libro\\Código\\9\\chp9Data") 
desc = arcpy.Describe('escuela.shp') refEspacial = 
desc.ReferenciaEspacial
# crear el FDS usando el objeto SR(SpatialReference) del objeto descrito 
arcpy.CreateFeatureDataset_management('O:\\Libro\\Código\\9\\chp9Data\\ 
Default.gdb','resultados', referencia espacial)
CÓDIGO 9.22
Cree una clase de entidad con la referencia espacial de otros datos.
172Introduccióna la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 9.10
Funciones en el módulo arcpy.mapping.
9.7 Automatización de la producción de mapas
La manipulación y el análisis de datos se automatizan a través de secuencias de comandos de 
Python y ArcPy, mientras que los procesos de mapeo involucran interacciones del usuario en la 
interfaz o mediante secuencias de comandos. ArcPy incluye un módulo de mapeo, cuyas 
funciones principales se pueden dividir en dos partes: exportar/imprimir mapas y administrar 
documentos y capas.Figura 9.10muestra las funciones en el módulo arcpy.mapping.
El código 9.23 representa el proceso de creación de un mapa para una clase de entidad 
utilizando el estilo de capa predefinido. El proceso incluye la apertura de archivos y capas, 
el cambio de estilo de capa y la revisión de la ubicación y el contenido de los elementos 
del mapa. El código se generaliza a partir del script de un ArcTool denominado “CCMap 
Generator” (Teampython 2013). El script está abierto y se puede descargar desde la 
comunidad de Análisis y geoprocesamiento a través del sitio web del centro de recursos 
de ArcGIS.http://resources.arcgis.com/en/communities/analysis/.
9.8 Creación de ArcTools a partir de secuencias de comandos
El marco de geoprocesamiento de ArcMap permite a los usuarios crear ArcTools personalizados 
a partir de los scripts de Python desarrollados. Al configurar los scripts como ArcTools, los 
usuarios pueden configurar los parámetros de entrada y ejecutar las funciones a través de una 
interfaz gráfica. Esto hace que la función definida por el usuario sea más
http://resources.arcgis.com/en/communities/analysis/
Programación ArcGIS 173
# 
ab
ri
r e
l d
oc
um
en
to
 d
e 
m
ap
a,
 q
ue
 e
s 
el
 a
rc
hi
vo
 *
.m
xd
 m
xd
 =
 
ar
cp
y.
m
ap
pi
ng
.M
ap
D
oc
um
en
t(
'C
CM
ap
D
oc
Te
m
pl
at
e.
m
xd
')
# 
en
um
er
ar
 e
l m
ar
co
 d
e 
da
to
s 
en
 e
l d
oc
um
en
to
 d
e 
m
ap
a 
- d
fs
 e
s 
el
 p
ri
m
er
 m
ar
co
 d
e 
da
to
s 
en
 e
l d
oc
um
en
to
 d
fs
 
= 
ar
cp
y.
m
ap
pi
ng
.L
is
tD
at
aF
ra
m
es
(m
xd
)[0
]
# 
cr
ea
r u
na
 c
ap
a 
a 
pa
rt
ir
 d
el
 c
on
ju
nt
o 
de
 d
at
os
 (p
. e
j.,
 u
na
 c
la
se
 d
e 
en
ti
da
d)
 a
 la
 q
ue
 s
e 
di
se
ña
rá
 y
 m
ap
ea
rá
 ly
r 
= 
ar
cp
y.
m
ap
pi
ng
.L
ay
er
(c
la
se
 d
e 
ca
ra
ct
er
ís
ti
ca
)
# 
ab
ri
r e
l a
rc
hi
vo
 d
e 
es
ti
lo
 d
e 
sí
m
bo
lo
 *
.ly
r
sí
m
bo
lo
ly
rs
 =
 a
rc
py
.m
ap
pi
ng
.L
ay
er
('C
CM
ap
Sy
m
bo
lo
gy
Te
m
pl
at
e.
ly
r'
)
# 
ob
te
ne
r 
la
 p
ri
m
er
a 
ca
pa
 c
on
 n
om
br
e 
qu
e 
co
nt
ie
ne
 la
 c
ad
en
a 
"p
ru
eb
a"
 d
en
tr
o 
de
l a
rc
hi
vo
 *
.ly
r 
sí
m
bo
lo
ly
r =
 a
rc
py
.m
ap
pi
ng
.L
is
tL
ay
er
s(
si
m
bó
lic
ol
yr
s,
 ('
*p
ru
eb
a*
'))
[0
]
# 
ca
m
bi
ar
 e
l e
st
ilo
 d
e 
sí
m
bo
lo
 d
e 
la
 c
la
se
 d
e 
en
ti
da
d 
ly
r e
n 
el
 m
ar
co
 d
e 
da
to
s 
df
s 
al
 e
st
ilo
 p
re
de
fin
id
o 
sy
m
bo
lly
r 
ar
cp
y.
m
ap
pi
ng
.U
pd
at
eL
ay
er
(d
fs
, l
yr
, s
ym
bo
lly
r,
Ve
rd
ad
er
o)
# 
ag
re
gu
e 
la
 c
la
se
 d
e 
en
ti
da
d 
co
n 
el
 e
st
ilo
 d
e 
sí
m
bo
lo
 a
ct
ua
liz
ad
o 
en
 e
l m
ar
co
 d
e 
da
to
s 
df
s 
ar
cp
y.
m
ap
pi
ng
.A
dd
La
ye
r(
df
s,
 ly
r)
# 
es
ta
bl
ec
er
 la
 u
bi
ca
ci
ón
 y
 e
l c
on
te
ni
do
 d
el
 p
ri
m
er
 e
le
m
en
to
 d
el
 m
ap
a 
(p
. e
j.,
 c
ua
dr
o 
de
 te
xt
o)
 d
en
tr
o 
de
l d
oc
um
en
to
 d
e 
m
ap
a 
m
xd
 e
lm
 =
 a
rc
py
.m
ap
pi
ng
.L
is
tL
ay
ou
tE
le
m
en
ts
(m
xd
,'T
EX
TO
_E
LE
M
EN
TO
','
pr
ue
ba
')[
0]
 e
lm
.e
le
m
en
tP
os
it
io
nY
 =
 -1
ol
m
o.
te
xt
o 
="
es
te
 e
s 
un
 e
le
m
en
to
 d
e 
m
ap
a 
de
 
pr
ue
ba
" 
el
m
.e
le
m
en
tP
os
it
io
nX
 =
 1
5
# 
ex
po
rt
ar
 e
l m
ap
a 
us
an
do
 re
so
lu
ci
ón
 e
n 
30
0 
dp
i 
ar
cp
y.
m
ap
pi
ng
.E
xp
or
tT
oP
D
F(
m
xd
, o
ut
_m
ap
, r
es
ol
uc
ió
n 
= 
30
0)
CÓ
D
IG
O
 9
.2
3
H
ac
er
 m
ap
as
 c
on
 e
st
ilo
 d
e 
sí
m
bo
lo
 p
re
de
fin
id
o 
au
to
m
át
ic
am
en
te
.
174 Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
4. Entrada básica
información, como
nombre, etiqueta, etc.
1. Crea un
caja de herramientas
2. Crea un
conjunto de herramientas
5. Especifique el guión
ruta de archivo
6. Especificar
parámetros
3. Agregar guión
FIGURA 9.11
Pasos generales para agregar scripts como herramientas.
fácil de usar y compartible, así como más accesible para las personas que no saben cómo 
ejecutar un script independiente. Además, la herramienta personalizada también se 
puede incorporar a ModelBuilder para integrarse con otras herramientas para 
implementar procesos de análisis más avanzados.
ArcPy proporciona varias funciones de obtención y configuración de parámetros para que las secuencias de 
comandos de Python personalizadas acepten la entrada del usuario. Las funciones más típicas son las 
siguientes:
• GetParameter: Obtiene el valor del parámetro especificado de la interfaz 
como un objeto (por ejemplo, SpatialReference)
• GetParameterAsText: obtiene el valor del parámetro especificado de la interfaz 
como una cadena
• GeoParameterValue: Devuelve el valor predeterminado del parámetro 
especificado para la herramienta
• SetParameter: establece una propiedad de parámetro específica utilizando un objeto
• SetParameterAsText: Establece una propiedad de parámetro específica usando una 
Cadena
Los pasos para agregar scripts como herramienta en ArcToolBox se muestran en 
Figura 9.11.
Práctica práctica 9.12: compilar ArcTools a partir de secuencias de comandos
1. Antes de crear ArcTool, copie el Código 9.24 y guárdelo como un archivo *.py.
importararcpy
"""
El siguiente es el script de la herramienta de zona de influencia, donde el 
primer argumento es la función de entrada, el segundo argumento es la 
función de salida y el tercer argumento es la distancia de zona de influencia
"""
inputFC = arcpy.GetParameterAsText(0) outputFC = 
arcpy.GetParameterAsText(1) bufferDist = 
arcpy.GetParameterAsText(3)
# realizar análisis de búfer arcpy.Buffer_analysis(FC de entrada, FC 
de salida, distancia de búfer)
CÓDIGO 9.24
Un script con funciones GetParameter para obtener información de la interfaz de ArcTool.
Programación ArcGIS 175
2. Abra 'Catálogo' en ArcMap, haga clic en 'Caja de herramientas', haga clic con el botón 
derecho en "Mis cajas de herramientas" y seleccione "Nuevo" para crear una nueva caja de 
herramientas (Figura 9.12). Cambie "ToolBox.tbx" a un nombre significativo, como 
"MyGeoProcessor.tbx".
3. Agregue el conjunto de herramientas haciendo clic con el botón derecho y seleccione "Nuevo" -> Conjunto de herramientas (
Figura 9.13). Cambie el nombre de "conjunto de herramientas", como "Búfer".
4. Luego, haga clic derecho en "Búfer" y seleccione "Agregar" -> "Script" (Figura 9.14).
Especifique (1) información básica para la herramienta, como nombre, etiqueta, 
descripciones, etc., (2) la ruta del archivo de script y (3) parámetros de entrada y 
salida, incluidos tipos y nombres, etc. Haga clic en "Finalizar" para complete la 
creación de su ArcTool personalizado (Figura 9.15).
5. Ejecute la herramienta recién creada y vea qué sucede.
FIGURA 9.12
Agregue ArcToolBox.
FIGURA 9.13
Agregue ArcToolset.
176Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 9.14
Agregue la secuencia de comandos de Python como ArcTool.
FIGURA 9.15
Configure la propiedad de la herramienta, la ruta del script y el parámetro de entrada.
9.9 Manejo de errores y mensajes
Los mensajes informativos ayudan a los usuarios a realizar un seguimiento del estado de ejecución del 
script. La interfaz de ArcTools normalmente devuelve tres tipos de mensajes con los siguientes 
símbolos:
Mensajes informativos durante la ejecución delscript
Mensaje de error cuando surge un problema
Mensajes de advertencia
• El método arcpy.GetMessage() puede devolver los mensajes de geoprocesamiento. 
De forma predeterminada, sin ningún argumento, obtendrá todo tipo de 
mensajes. Usando 0, 1 o 2 como argumento, obtendrá la cadena del error de 
información o los mensajes de ID de advertencia por separado:
Programación ArcGIS 177
FIGURA 9.16
Resultados de ejecutar la herramienta de script con mensajes agregados.
• GetMessages(): Todos los mensajes
• GetMessages(0): Nivel de gravedad 0 - Solo mensajes informativos
• GetMessages(1): nivel de gravedad 1: solo mensajes de advertencia
• GetMessages(2): nivel de gravedad 2: solo mensajes de error
El método arcpy.AddMessage() se puede utilizar para crear mensajes de 
geoprocesamiento (nivel de gravedad = 0) para sus secuencias de comandos; el método 
arcpy.AddWarning() se puede usar para crear mensajes de advertencia (nivel de gravedad 
= 1) para sus scripts; y el método arcpy.AddError() se puede usar para crear mensajes de 
error (nivel de gravedad = 2) para sus scripts. Como se muestra enFigura 9.16, los 
mensajes entre “Hora de inicio: Mar…” y “Tuvo éxito en…” son los que se agregan usando 
el método AddMessage().
Práctica práctica 9.13: Agregar mensaje en la herramienta de secuencia de comandos personalizada
1. Cree un script de Python con Code 9.25 y luego agréguelo como ArcTool.
2. Use la herramienta para probar el análisis del búfer y verifique la salida.
9.10 Documentos externos y recursos de video
El documento de ayuda de escritorio de ArcGIS y el documento de ayuda en línea de Esri (Figura 9.1) 
debe ser el primer lugar para verificar la sintaxis y los códigos de muestra de las clases, funciones y 
módulos de ArcPy. Al buscar en línea, también podemos encontrar buenos ejemplos de código para 
muchas funciones de geoprocesamiento.
Traducido del inglés al español - www.onlinedoctranslator.com
https://www.onlinedoctranslator.com/es/?utm_source=onlinedoctranslator&utm_medium=pdf&utm_campaign=attribution
178Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
importararcpy
"""
El siguiente es el script de la herramienta de zona de influencia, donde el primer 
argumento es la función de entrada, el segundo argumento es la función de salida y 
el tercer argumento es la distancia de zona de influencia
"""
inputFC = arcpy.GetParameterAsText(0) arcpy.AddMessage('-------
Característica de entrada: '+ inputFC) outputFC = 
arcpy.GetParameterAsText(1)
arcpy.AddMessage('-------Característica de salida: '+ salidaFC) 
bufferDist = arcpy.GetParameterAsText(2)
arcpy.AddMessage('-------Distancia de búfer: '+ distanciabúfer)
# realizar análisis de búfer arcpy.Buffer_analysis(inputFC, 
outputFC, bufferDist) arcpy.AddMessage("Terminado con éxito")
CÓDIGO 9.25
Ejemplos de AddMessage.
Los siguientes recursos también podrían proporcionar la información desde otra 
perspectiva:
• Busque “Uso de Python en ArcGIS Desktop” en YouTube.
• Esri ofrece cursos gratuitos de Campus Virtual utilizando Python en 
diferentes versiones de ArcGIS Desktop, que se pueden encontrar 
buscando "Python" en el siguiente enlacehttp://training.esri.com/gateway/
index. cfm?fa=catalog.gateway&tab=0.
• ArcCafe: un blog, desarrollado y mantenido por los equipos de geoprocesamiento y análisis 
de Esri, que presenta secuencias de comandos de Python utilizadas para resolver algunas 
tareas comunes de geoprocesamiento.
• Esri suele proporcionar secciones para presentar el uso de Python y 
ArcPy en su conferencia anual de usuarios. Estos videos se pueden 
encontrar buscando "python" o "ArcPy" en el enlacehttp://
video.esri.com/channel/2/events/series.
9.11 Implementación de cálculos de relaciones 
espaciales mediante ArcGIS
Práctica práctica 9.14: Calcule el centroide, el perímetro y el área de polígonos 
usando arcpy.
Busque los datos "states.shp" y ejecute el Código 9.26 en la ventana ArcMap 
Python. Tenga en cuenta que se deben agregar nuevos campos en la tabla de 
atributos antes del cálculo para registrar los resultados (Figura 9.17).
http://training.esri.com/gateway/index.cfm?fa=catalog.gateway&tab=0
http://training.esri.com/gateway/index.cfm?fa=catalog.gateway&tab=0
http://video.esri.com/channel/2/events/series
http://video.esri.com/channel/2/events/series
Programación ArcGIS 179
# 
es
ta
bl
ec
er
 e
l e
sp
ac
io
 d
e 
tr
ab
aj
o
ar
cp
y.
en
v.
es
pa
ci
o 
de
 tr
ab
aj
o 
="
O
:\\
Li
br
o\
\C
ód
ig
o\
\9
\\
ch
p9
D
at
a"
""
"
Ag
re
gu
e 
lo
s 
ca
m
po
s 
"c
en
tX
",
 "
ce
nt
Y"
, "
po
ly
Ar
ea
" 
y 
"p
ol
yP
er
i"
 p
ar
a 
re
gi
st
ra
r l
os
 r
es
ul
ta
do
s 
ca
lc
ul
ad
os
. "
D
O
BL
E"
 e
s 
el
 ti
po
 d
e 
va
lo
r,
 2
0 
es
 la
 p
re
ci
si
ón
 d
el
 ti
po
 d
ob
le
 y
 1
0 
es
 la
 e
sc
al
a.
""
"
ar
cp
y.
Ad
dF
ie
ld
_m
an
ag
em
en
t(
"e
st
ad
os
.s
hp
",
"c
en
tX
",
"D
O
BL
E"
,2
0,
10
) 
ar
cp
y.
Ad
dF
ie
ld
_m
an
ag
em
en
t(
"e
st
ad
os
.s
hp
",
"c
en
tY
",
"D
O
BL
E"
,2
0,
10
) 
ar
cp
y.
Ad
dF
ie
ld
_m
an
ag
em
en
t(
"e
st
ad
os
.s
hp
",
"á
re
a 
po
li"
,"
D
O
BL
E"
,2
0,
6)
 
ar
cp
y.
Ad
dF
ie
ld
_m
an
ag
em
en
t(
"e
st
ad
os
.s
hp
",
"p
ol
iP
er
i"
,"
D
O
BL
E"
,2
0,
6)
""
"
Ca
lc
ul
e 
el
 c
en
tr
oi
de
, e
l á
re
a 
y 
el
 p
er
ím
et
ro
 c
on
 la
 h
er
ra
m
ie
nt
a 
Ca
lc
ul
at
eF
ie
ld
_m
an
ag
em
en
t.
 "
PY
TH
O
N
_9
.3
"
si
gn
ifi
ca
 q
ue
 la
 e
xp
re
si
ón
 d
e 
cá
lc
ul
o 
"!
SH
AP
E.
CE
N
TR
O
ID
.X
" 
es
tá
 e
n 
la
 s
in
ta
xi
s 
de
 P
yt
ho
n 
9.
3.
""
"
ar
cp
y.
Ca
lc
ul
at
eF
ie
ld
_m
an
ag
em
en
t(
"e
st
ad
os
.s
hp
",
"c
en
tX
",
"!
FO
RM
A.
CE
N
TR
O
ID
E.
X!
",
"P
YT
H
O
N
_9
.3
")
 
ar
cp
y.
Ca
lc
ul
at
eF
ie
ld
_m
an
ag
em
en
t(
"e
st
ad
os
.s
hp
",
"c
en
tY
",
"!
FO
RM
A.
CE
N
TR
O
ID
E.
Y!
",
"P
YT
H
O
N
_9
.3
")
 
ar
cp
y.
Ca
lc
ul
at
eF
ie
ld
_m
an
ag
em
en
t(
"e
st
ad
os
.s
hp
",
"á
re
a 
po
li"
,"
!Á
RE
A.
D
E.
FO
RM
A!
",
"P
YT
H
O
N
_9
.3
")
 
ar
cp
y.
Ca
lc
ul
at
eF
ie
ld
_m
an
ag
em
en
t(
"e
st
ad
os
.s
hp
",
"p
ol
iP
er
i"
,"
!F
O
RM
A.
LO
N
G
IT
U
D
!"
,"
PY
TH
O
N
_9
.3
")
CÓ
D
IG
O
 9
.2
6
Ca
lc
ul
a 
el
 c
en
tr
oi
de
, e
l p
er
ím
et
ro
 y
 e
l á
re
a 
de
 lo
s 
po
líg
on
os
 u
sa
nd
o 
ar
cp
y.
180Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 9.17
Resultado del Código 9.26.
Práctica práctica 9.15: Selección de objetos según la relación espacial (línea de 
intersección y punto en el polígono) usando arcpy.
1. Busque los dos archivos de forma "interestatales" y "ferrocarril" en el disco y 
seleccione las carreteras interestatales que se cruzan con los ferrocarriles. La 
selección se llevará a cabo en las características "interestatales" en función de su 
relación espacial con la capa "ferroviaria". Ejecute el Código 9.27 en la ventana de 
Python de ArcMap yFigura 9.18muestra el resultado.
2. Seleccione las estaciones de tren (en “amtk_sta.shp”) en Virginia. Ejecutar código
9.28 en la ventana de Python de ArcMap y vea el resultado (Figura 9.19).
9.12 Resumen
Este capítulo presenta la programación dentro de ArcGIS utilizando secuencias de comandos de 
Python y el paquete ArcPy. Este capítulo introduce
• Marco de geoprocesamiento de Esri y ArcPy.
• La capacidad y sintaxis de las funciones, clases y módulos de ArcPy.
• ¿Cómo crear flujos de trabajo de análisis simples o complejos con ArcPy?
• ¿Cómo manipular datos vectoriales u objetos a través de ArcPy?
Programación ArcGIS 181
ar
cp
y.
en
v.
es
pa
ci
o 
de
 tr
ab
aj
o 
="
O
:\\
Li
br
o\
\C
ód
ig
o\
\9
\\
ch
p9
D
at
a"
""
"
"M
ak
eF
ea
tu
re
La
ye
r_
m
an
ag
em
en
t"
 p
ue
de
 c
re
ar
 u
n 
ob
je
to
 d
e 
ca
pa
 d
e 
ca
ra
ct
er
ís
ti
ca
s 
a 
pa
rt
ir
 d
e 
la
 ru
ta
 d
e 
lo
s 
da
to
s 
de
 e
nt
ra
da
, q
uee
s 
un
a 
ca
de
na
. L
a 
se
le
cc
ió
n 
se
 re
al
iz
ar
á 
en
 la
 c
ap
a 
de
 e
nt
id
ad
es
.
""
"
ar
cp
y.
M
ak
eF
ea
tu
re
La
ye
r_
m
an
ag
em
en
t(
"i
nt
er
es
ta
ta
le
s.
sh
p"
,"
ca
rr
et
er
a"
) 
ar
cp
y.
M
ak
eF
ea
tu
re
La
ye
r_
m
an
ag
em
en
t(
"f
er
ro
ca
rr
il.
sh
p"
,"
fe
rr
oc
ar
ri
l"
)
# 
se
le
cc
io
ne
 la
s 
ca
ra
ct
er
ís
ti
ca
s 
en
 la
 c
ap
a 
in
te
re
st
at
al
, q
ue
 in
te
rs
ec
an
 c
on
 la
s 
ca
ra
ct
er
ís
ti
ca
s 
en
 la
 c
ap
a 
fe
rr
ov
ia
ri
a 
ar
cp
y.
Se
le
ct
La
ye
rB
yL
oc
at
io
n_
m
an
ag
em
en
t(
"c
ar
re
te
ra
",
"I
N
TE
RS
EC
AR
SE
",
"f
er
ro
ca
rr
il"
,s
el
ec
ci
on
_t
ip
o=
"N
U
EV
A_
SE
LE
CC
IÓ
N
")
CÓ
D
IG
O
 9
.2
7
Ca
lc
ul
ar
 in
te
rs
ec
ci
ón
 d
e 
lín
ea
s.
182Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
Ferrocarril
camino
FIGURA 9.18
Resultado de la intersección de líneas.
• ¿Cómo crear ArcTools a partir de los scripts de python?
• ¿Cómo implementar cálculos espaciales usando ArcGIS?
9.13 Asignación
• Lea la sección de ArcPy en la ayuda de escritorio de ArcGIS o la versión en línea.
• Buscar datos de una carretera o descargar datos del paquete del material del 
curso correspondiente.
• Seleccione carreteras a partir de datos de carreteras.
• Generar un buffer con 300 metros de radio para la carretera.
• Salida de la zona de influencia como una zona de contaminación del transporte.
• Agregar un campo con el nombre de “edificios” con tipo Long en los datos de la zona de 
amortiguamiento.
• Cuente el número de edificios dentro de cada zona de amortiguamiento y guárdelo en 
el nuevo campo.
• Escriba un informe para explicar cómo realizó el análisis y la 
programación.
• Comparar las diferencias de implementar cálculos espaciales utilizando 
ArcGIS y Python puro.
Programación ArcGIS 183
ar
cp
y.
en
v.
es
pa
ci
o 
de
 tr
ab
aj
o 
="
O
:\\
Li
br
o\
\C
ód
ig
o\
\9
\\
ch
p9
D
at
a"
ar
cp
y.
M
ak
eF
ea
tu
re
La
ye
r_
m
an
ag
em
en
t(
"e
st
ad
os
.s
hp
",
"m
aj
es
tu
os
o"
) 
ar
cp
y.
M
ak
eF
ea
tu
re
La
ye
r_
m
an
ag
em
en
t(
"a
m
tk
_s
ta
.s
hp
",
"e
st
ac
ió
n"
)
# 
se
le
cc
io
ne
 V
ir
gi
ni
a 
de
 la
 c
ap
a 
de
 e
st
ad
o 
pr
im
er
o
ar
cp
y.
Se
le
ct
La
ye
rB
yA
tt
ri
bu
te
_m
an
ag
em
en
t(
"m
aj
es
tu
os
o"
,"
N
U
EV
A_
SE
LE
CC
IÓ
N
",
'"
N
O
M
BR
E_
ES
TA
D
O
"=
\'V
ir
gi
ni
a\
'')
# 
lu
eg
o 
se
le
cc
io
ne
 la
s 
es
ta
ci
on
es
 d
e 
tr
en
 (p
un
to
s)
 c
om
pl
et
am
en
te
 d
en
tr
o 
de
 V
ir
gi
ni
a 
(p
ol
íg
on
o)
 a
rc
py
.S
el
ec
tL
ay
er
By
Lo
ca
ti
on
_m
an
ag
em
en
t(
"e
st
ac
ió
n"
,"
CO
M
PL
ET
AM
EN
TE
_D
EN
TR
O
",
"m
aj
es
tu
os
o"
,s
el
ec
ci
on
_t
ip
o=
"N
U
EV
A_
SE
LE
CC
IÓ
N
")
CÓ
D
IG
O
 9
.2
8
Se
le
cc
io
ne
 to
da
s 
la
s 
es
ta
ci
on
es
 d
e 
tr
en
 e
n 
Vi
rg
in
ia
.
184Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 9.19
Punto en el resultado del polígono.
NOTA :Todos los códigos se pueden ejecutar correctamente en ArcGIS para versiones 
de escritorio 10.2.2 a 10.3. Puede haber problemas al ejecutar el código en una 
versión más reciente de ArcGIS.
10
Algoritmo de datos ráster
Un ráster es un modelo de datos que representa fenómenos geográficos por píxeles y se 
puede crear utilizando una variedad de dispositivos y técnicas, como cámaras digitales, 
escáneres, máquinas de medición de coordenadas, perfiles sismográficos y radares 
aerotransportados. Este capítulo presenta el concepto de ráster, las principales 
categorías de datos ráster y cómo estos datos se muestran y almacenan en una 
computadora. Los métodos básicos de análisis y conversión de datos ráster se exploran 
mediante tres experiencias prácticas de ArcGIS.
10.1 Datos ráster
Con el modelo de datos ráster, los fenómenos geográficos se representan como superficies, regiones 
o segmentos. Por lo tanto, este modelo de datos se basa en la vista de campo del mundo real 
(Goodchild 1992). La vista de campo se usa ampliamente para la organización de la información en 
sistemas de análisis de imágenes para aplicaciones orientadas a los recursos y al medio ambiente. Los 
datos ráster tienen dos categorías principales: (1) datos discretos, también llamados datos temáticos o 
categóricos, tal como se emplean en mapas de suelo o uso de la tierra; y (2) datos continuos, también 
llamados datos no discretos o datos de superficie, como se emplean en los modelos de elevación 
digital (DEM), mapas de lluvia o mapas de concentración de contaminantes.
Un conjunto de datos ráster representa características geográficas en una 
cuadrícula 2D de celdas conocidas como elementos de imagen (píxeles) (Figura 
10.1). La ubicación de cada celda se define por sus números de fila y columna. 
El tamaño de celda dicta la resolución espacial de los datos. Las ubicaciones de 
las características geográficas solo están representadas por los píxeles más 
cercanos. El valor almacenado para cada celda indica el tipo de objeto, 
fenómeno o condición que se encuentra en esa ubicación en particular, y 
normalmente se da como el valor promedio para toda el área del terreno 
cubierta por el píxel. Los diferentes tipos de valores se pueden codificar como 
números enteros, números reales o letras del alfabeto. Si los números de 
código son enteros, es más probable que hagan referencia a atributos 
nominales (por ejemplo, nombres en una tabla asociada). Los diferentes 
atributos en la misma ubicación de celda se almacenan cada uno como temas o 
capas independientes. Por ejemplo, datos raster pertenecientes al tipo de 
suelo, cubierta forestal,
185
186Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
Columna #
Fila #
píxel
Valor de celda 1
1
2
1 Diferente
capas
Código Cobertura terrestre
1 Bosque
2
3
Agua corporal
Cultivo Tabla de búsqueda
FIGURA 10.1
Estructura de datos ráster.
10.2 Almacenamiento y compresión de ráster
Los datos ráster normalmente se almacenan fila por fila desde la parte superior izquierda, 
como se ilustra en Figura 10.2. Esta es la forma más sencilla de almacenar y buscar datos 
ráster. Sin embargo, un ráster, cuando se almacena en estado bruto sin compresión, se puede
(a) (b)
3
3
3
3
3
3
3
3
1
2
1
2
1
2
1
2
3
3
1
1
1
1
3
3
1
1
1
1
3
3
1
1
1
1
3
3
1
1
1
1
2
2
1
1
1
1
1
2
1
1
1
1
1
2
1
1
1
2
1
2
1
1
1
2
FIGURA 10.2
Imagen de la trama. (a) Cada píxel de la trama está codificado por color y (b) el valor de cada píxel y el orden de almacenamiento 
de píxeles.
Algoritmo de datos ráster 187
extremadamente ineficiente en términos de espacio de almacenamiento de la computadora. 
TomandoFigura 10.2a, para extraer el área amarilla, la computadora necesita extraer el área un 
píxel a la vez, siguiendo el orden de almacenamientoFigura 10.2b. Después de obtener las 
cuatro celdas amarillas en la primera fila, la computadora debe omitir las celdas restantes en la 
primera fila antes de llegar a las celdas objetivo en la segunda fila, lo que resulta en un tiempo 
de búsqueda adicional.
Hoy en día, los datos están cada vez más disponibles y tienen mayor resolución. Las 
capacidades informáticas también han mejorado. Por lo tanto, se necesitan mejores métodos 
de almacenamiento y compresión de datos. La compresión de trama reduce la cantidad de 
espacio en disco consumido por el archivo de datos, al tiempo que conserva la máxima calidad 
de los datos. Existen diferentes métodos para la compresión de datos ráster, incluida la 
codificación de longitud de ejecución, la codificación de árbol cuádruple y otros.
Para datasets ráster multicapa, la práctica normal es almacenar las capas por separado. También es 
posible almacenar toda la información de cada píxel en conjunto; sin embargo, esto requiere que se 
asigne espacio adicional inicialmentedentro de la ubicación de almacenamiento de cada píxel para las 
capas, que se pueden crear más tarde durante el análisis.
10.2.1 Codificación de longitud de ejecución
La codificación de longitud de ejecución (Pountain 1987) es una técnica de compresión 
ampliamente utilizada para datos raster. Los elementos de datos primarios son pares de 
valores o tuplas, que consisten en un valor de píxel y un recuento de repeticiones, que 
especifica el número de píxeles en la ejecución. Los datos se construyen leyendo cada fila en 
sucesión a través del ráster y creando una nueva tupla cada vez que cambia el valor del píxel o 
cuando se alcanza el final de la fila.Figura 10.3demuestra el proceso de codificación de longitud 
de ejecución. Supongamos que tenemos datos raster almacenados en un 4 por
84 84 90 90
88 93 93 93
93 93 93 93
87 87 87 94
Formación 84 84 90 90 88 93 93 93 93 93 93 93 87 87 87 94
Codificación de longitud de ejecución
Longitud de ejecución 84 2 90 2 88 1 93 7 87 3 94 1
e valor de píxel idéntico tiempo de repetición
FIGURA 10.3
Ejemplo de codificación de longitud de ejecución.
188Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
4 matriz. La computadora lo escaneará comenzando desde la parte superior izquierda y se moverá 
hacia la derecha, bajando, mientras mantiene los datos en una matriz. Luego, Run Length Coding 
procesará la cadena de píxeles en una cadena de pares (el valor de píxel idéntico y los tiempos de 
repetición de píxeles). La longitud de la cadena inicial es 16 y después de la codificación de longitud de 
ejecución, la longitud es 12. Por lo tanto, la codificación de longitud de ejecución reduce efectivamente 
el volumen de almacenamiento.
La codificación de longitud de ejecución tiene sus limitaciones. Por ejemplo, Run Length no 
guardará almacenamiento en los casos en que los valores de píxeles no se repitan con frecuencia. En 
algunos casos, como los datos DEM en un área montañosa, los píxeles vecinos siempre tienen valores 
diferentes y la codificación de longitud de ejecución puede aumentar la longitud del almacenamiento 
inicial. Sin embargo, la codificación de longitud de ejecución es muy exitosa cuando se trata de 
imágenes en blanco y negro, como un fax. En este caso, es relativamente eficiente porque la mayoría 
de los documentos enviados por fax son predominantemente espacios en blanco, con solo 
interrupciones ocasionales de negro.
10.2.2 Árbol cuádruple
La técnica de compresión de árbol cuádruple es el método de compresión más común 
aplicado a datos raster (Gosselin y Georgiadis 2000). La codificación de árbol cuádruple 
almacena la información subdividiendo una región cuadrada en cuadrantes, cada uno de 
los cuales se puede dividir en cuadrados hasta que el contenido de las celdas tenga los 
mismos valores.Figura 10.4demuestra el proceso de compresión del árbol cuádruple. 
Supongamos que los datos ráster se almacenan en una matriz de 4 por 4 (Figura 10.4a). 
Primero, el árbol cuádruple divide los datos ráster en cuatro matrices cuadradas (Figura 
10.4b). En la secuencia 0,1,2,3 (Figura 10.4b), las cuatro matrices se comprueban si el 
contenido de sus celdas tiene o no el mismo valor. Este proceso puede repetirse 
recursivamentenorteveces, hasta que las celdas dentro de un cuadrante tengan todas el 
mismo valor. Para el cuadrante 0, la secuencia es la misma con los niveles anteriores de 
procesos, y la división da como resultado otros cuatro
(a) (b) (C) (d)
89 68 85 85
89 75 85 85
89 89 85 85
89 77 85 85
11 13
10 12
01 03
00 02
89 68
89 75
89 89
89 77
1 3 3 85
0 2 2 85
Raíz
0 1 2
85
3
85
00 01 02 03 10 11 12 13
89 89 77 89 89 89 75 68
FIGURA 10.4
Proceso de árbol cuádruple. (a) valor de píxel del evaluador, (b) orden de búsqueda de los cuatro cuadrantes, 
(c) continuar dividiendo al encontrar valores no iguales dentro de cada cuadrante de (b), y (d) división final.
Algoritmo de datos ráster 189
cuadrados, 00,01,02,03. El mismo proceso ocurre en el cuadrante 1. Para los cuadrantes 2 
y 3, todas las celdas tienen el mismo valor, por lo que no es necesario dividir. Por lo tanto, 
la salida final del árbol cuádruple es comoFigura 10.4d. Llamamos a este arreglo un árbol, 
cuyos nodos corresponden a los cuadrados. Los nodos están conectados si uno de los 
cuadrados correspondientes contiene inmediatamente al otro. El nodo raíz del árbol 
corresponde a la imagen completa, los nodos de hoja corresponden a los píxeles 
individuales.
El árbol cuádruple funciona para imágenes con patrones de valores idénticos. Por cada división 
cuádruple utilizada, se necesitan cuatro elementos de almacenamiento más. Los árboles cuádruples 
son de gran interés para indexar datos espaciales, por lo que es más probable que las celdas que son 
adyacentes en el espacio tengan direcciones de índice espacial similares que en el esquema de 
ordenación de columnas o filas. Por lo tanto, los datos que están muy juntos también lo están en el 
sistema de almacenamiento. Esta función hace que los datos comprimidos de árbol cuádruple sean 
mucho más fáciles y rápidos de manipular y acceder.
10.3 Formatos de datos ráster*
El formato ráster define cómo se organizan los datos y el tipo o nivel de compresión 
correspondiente. Muchos formatos de datos aplican compresión a los datos ráster para 
que todos los valores de píxeles no se almacenen directamente. La compresión puede 
reducir el tamaño de los datos al 30 % o incluso al 3 % de su tamaño sin procesar, según 
la calidad requerida y el método utilizado. La compresión puede ser sin pérdida o con 
pérdida. Con la compresión sin pérdidas, la imagen original se puede recuperar 
exactamente. Con la compresión con pérdida, las representaciones de píxeles no se 
pueden recuperar exactamente. Para implementar la compresión, el archivo ráster debe 
incluir información principal sobre el método y los parámetros de compresión. Algunos 
formatos ráster, como TIFF, GeoTIFF, IMG y NetCDF, contienen información geográfica, 
mientras que otros, como BMP, SVG y JPEG, no.
10.3.1 TIFF
TIFF (Formato de archivo de imagen etiquetado) es un formato de imagen reconocido por 
muchos sistemas informáticos. El formato de archivo de imágenes TIFF se utiliza para 
almacenar y transferir imágenes satelitales digitales, fotografías aéreas escaneadas, modelos 
de elevación, mapas escaneados o los resultados de muchos tipos de análisis geográficos. TIFF 
admite varias opciones de compresión y mosaico para aumentar la eficiencia de la 
transferencia y utilización de imágenes. Los datos dentro de los archivos TIFF se clasifican como 
comprimidos sin pérdida o comprimidos con pérdida.
* "Formatos de archivo SIG". Wikipedia: Ráster. Fundación Wikipedia, Inc.http://en.wikipedia.org/ wiki/
GIS_file_formats#Raster.
http://en.wikipedia.org/wiki/GIS_file_formats#Raster
http://en.wikipedia.org/wiki/GIS_file_formats#Raster
190Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
10.3.2 GeoTIFF
GeoTIFF son archivos TIFF que tienen datos geográficos (o cartográficos) incrustados 
como etiquetas dentro del archivo TIFF (Ritter y Ruth 1997). A continuación, los datos 
geográficos se pueden usar para colocar la imagen en la ubicación y geometría correctas 
en la pantalla de una pantalla de información geográfica. La posible información adicional 
incluye proyección de mapas, sistemas de coordenadas, elipsoides, datums y todo lo 
demás necesario para establecer la referencia espacial exacta para el archivo. Cualquier 
sistema de información geográfica (GIS), diseño asistido por computadora (CAD), 
procesamiento de imágenes, mapeo de escritorio u otro tipo de sistemas que utilicen 
imágenes geográficas pueden leer archivos GeoTIFF creados en cualquier sistema que 
siga la especificación GeoTIFF.
10.3.3 IMG*
Los archivos IMG se producen utilizando el software de procesamiento de imágenes IMAGINE 
creado por ERDAS. Los archivos IMG pueden almacenar datos continuos y discretos, de banda 
única y multibanda. Estosarchivos utilizan la estructura de formato de archivo jerárquico (HFA) 
de ERDAS IMAGINE. Un archivo IMG almacena información básica, incluida la información del 
archivo, los puntos de control terrestre, la información del sensor y las capas ráster. Cada capa 
ráster del archivo de imagen contiene información además de sus valores de datos. La 
información contenida en la capa ráster incluye información de capa, compresión, atributos y 
estadísticas. Un archivo IMG se puede comprimir cuando se importa a ERDAS IMAGINE, que 
normalmente utiliza el método de compresión de longitud de ejecución (descrito en la Sección 
10.2.1).
10.3.4 NetCDF
NetCDF (Network Common Data Form) es un conjunto de bibliotecas de software y 
formatos de datos autodescriptivos e independientes de la máquina que admiten la 
creación, el acceso y el intercambio de datos científicos orientados a matrices (Rew y 
Davis 1990). Se usa comúnmente en aplicaciones de climatología, meteorología y 
oceanografía (p. ej., pronóstico del tiempo, cambio climático) y aplicaciones GIS. Es un 
formato de entrada/salida para muchas aplicaciones GIS, así como para el intercambio de 
datos científicos en general. NetCDF se almacena en binario en formato abierto con 
compresión opcional.
10.3.5 BMP
BMP (mapa de bits de Windows) admite archivos gráficos dentro del sistema operativo 
Microsoft Windows. Por lo general, los datos de los archivos BMP no están comprimidos, lo que 
puede resultar en archivos demasiado grandes. Las principales ventajas de este formato son su 
sencillez y amplia aceptación.
* "Archivos .img de ERDAS IMAGINE". Universidad de Purdue. ftp://ftp.ecn.purdue.edu/jshan/86/help/ 
html/appendices/erdas_imagine__img_files.htm.
Algoritmo de datos ráster 191
10.3.6 SVG
Los gráficos vectoriales escalables (SVG) son archivos basados en XML formateados para 
gráficos vectoriales 2D. Utiliza un algoritmo de compresión de datos sin pérdida y, por lo 
general, reduce los datos al 20 %–50 % del tamaño original.
10.3.7 JPEG
Los archivos JPEG (Grupo Conjunto de Expertos Fotográficos) almacenan datos en un formato 
con pérdida de compresión (en los casos más importantes). Casi todas las cámaras digitales 
pueden guardar imágenes en formato JPEG, que admite ocho bits por color para un total de 24 
bits, lo que generalmente produce archivos pequeños. Cuando la compresión utilizada no es 
alta, la calidad de la imagen no se ve tan afectada, sin embargo, los archivos JPEG pueden sufrir 
degradaciones notables cuando se editan y guardan de forma recurrente. Para las fotos 
digitales que necesitan edición repetida o cuando los pequeños artefactos son inaceptables, se 
deben usar formatos sin pérdida distintos de JPEG. Este formato también se utiliza como 
algoritmo de compresión para muchos archivos PDF que incluyen imágenes.
10.3.8 GIF
GIF (Graphic Interchange Format) es el primer formato de imagen utilizado en la 
World Wide Web. Este formato está limitado a una paleta de 8 bits o 256 colores. 
Utiliza compresión Lempel-Ziv-Welch (LZW) sin pérdidas, que se basa en tecnología 
de compresión patentada.
10.3.9 PNG
PNG (Portable Network Graphic) es un sucesor de código abierto de GIF. A diferencia de 
los 256 colores admitidos por GIF, este formato admite color verdadero (16 millones de 
colores). PNG supera a otros formatos cuando grandes áreas de colores uniformes 
forman una imagen. El formato lossless PNG es más apropiado para la edición de figuras 
y los formatos lossy, como JPEG, son mejores para la distribución final de fotos, porque 
los archivos JPEG son más pequeños que los archivos PNG.
10.4 Representación de color y reproducción de trama
10.4.1 Representación de colores
Los datos ráster se pueden mostrar como una imagen en escala de grises o en color (RGB) 
transformando los valores de los píxeles. Amapa de coloreses una tabla de búsqueda utilizada 
para traducir el valor de cada píxel en un color. Un valor de píxel dado se usa como índice en la 
tabla, por ejemplo, un valor de píxel de nueve seleccionará el noveno elemento, o celda de color
(Figura 10.5).
Una imagen en escala de grises se puede mostrar en pantallas monocromáticas 
transformando los píxeles en la intensidad del nivel de gris, que contiene un solo valor.
192Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
mapa de colores
19
18
17
dieciséis
I5
14
13
12
11
10
9 200
8
7
6
5
4
3
2
1
0
valor de píxel
1
0
0
1
0 Celda de color
0
0
0
FIGURA 10.5
Asignación de valor de píxel a escala de grises.
en el mapa de colores. La escala de grises se puede simular en una pantalla a color igualando 
los valores de rojo, verde y azul en una celda de color dada, configurando el brillo de los píxeles 
grises en la pantalla.
La mayoría de las pantallas a color se basan en el modelo de color RGB. Cada píxel de 
la pantalla se compone de tres fósforos: uno rojo, uno verde y uno azul, cada uno de los 
cuales es sensible a haces de electrones separados. Cuando los tres fósforos están 
completamente iluminados, el píxel aparece blanco para el ojo humano. Cuando los tres 
están oscuros, el píxel aparece negro. Cada valor de píxel en las partes visibles de una 
ventana se lee continuamente de la memoria de la pantalla y se busca en el mapa de 
colores. Los valores RGB en la celda de color especificada controlan la intensidad de los 
tres colores primarios y, por lo tanto, determinan el color que se muestra en ese punto de 
la pantalla (Figura 10.6).
Los datos ráster también se pueden transformar de modelo RGB a escala de grises. Las 
formas más comunes de realizar la transformación son Lustre (Jack 2011), Intensidad 
(Hoeffding 1963) y Luma (Bosch et al. 2007). El método Lustre promedia los colores más 
prominentes y menos prominentes. El método de intensidad simplemente promedia los 
valores. El método Luma es una versión más sofisticada del método promedio. También 
promedia los valores, pero forma un promedio ponderado para dar cuenta de la 
percepción humana; debido a que los seres humanos son más sensibles al verde que a 
otros colores, el verde tiene la mayor ponderación (Ecuación 10.1).Figura 10.7muestra los 
resultados de la transformación.
-max(R,GRAMO,B) + min(R,GRAMO,B)
- 2-
v′ = -R+GRAMO+B
, Método de brillo
,
-0.21×R+0.72×GRAMO+0.07×B,
método de intensidad
método de luminancia
(10.1)- 3
-
Algoritmo de datos ráster 193
m
ap
a 
de
 c
ol
or
es
R
G
RA
M
O
B
19 18 17 diec
is
éi
s
I5 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
va
lo
r d
e 
pí
xe
l
1
0
0
1
0
0
25
5
0
Ce
ld
a 
de
 c
ol
or
0
0
0
FI
G
U
RA
 1
0.
6
As
ig
na
ci
ón
 d
e 
va
lo
r d
e 
pí
xe
l a
 R
G
B 
co
n 
el
 m
ap
a 
de
 c
ol
or
es
.
194Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
Imagen original Método de brillo
método de intensidad método de luminancia
FIGURA 10.7
RGB a escala de grises. (Imagen original dehttp://www.coloringpages456.com/color-pictures/.)
losprofundidad del colormide la cantidad de información de color disponible para mostrar o 
imprimir cada píxel de una imagen digital. Debido a la naturaleza finita de la capacidad de 
almacenamiento, un número digital se almacena con un número finito de bits (dígitos binarios). 
El número de bits determina la resolución radiométrica de la imagen. Una profundidad de color 
alta conduce a más colores disponibles y, en consecuencia, a una representación de color más 
precisa. Por ejemplo, un píxel con una profundidad de un bit tiene solo dos colores posibles. Un 
píxel con una profundidad de 8 bits tiene 256 valores de color posibles, que van de 0 a 255 (es 
decir, 28–1), y un píxel con una profundidad de 24 bits tiene más de 16 millones de valores de 
color posibles, que van de 0 a 16 777 215 (es decir, 224–1). Por lo general, las profundidades de 
color varían entre 1 y 64 bits por píxel en imágenes digitales.
10.4.2 Representación ráster
Los conjuntos de datos ráster se pueden mostrar o representar en un mapa de muchas 
maneras diferentes.La representación es el proceso de mostrar los datos. La visualización del 
mapa depende tanto de los datos en sí como del método de representación elegido. Los 
métodos de representación de datos ráster comúnmente utilizados en el software GIS incluyen 
estirado, compuesto RGB, clasificado, valores únicos y color discreto.
losEstiradorenderer representa datos continuos estirándolos en las estadísticas del conjunto 
de datos ráster. Un estiramiento aumenta el contraste visual de la pantalla de trama, 
especialmente cuando la pantalla de trama aparece oscura o tiene poco contraste. Es posible 
que la imagen no contenga todo el rango de valores que puede mostrar una computadora (
Figura 10.8a,b); por lo tanto, al aplicar un estiramiento de contraste, la imagen
http://www.coloringpages456.com/color-pictures/
Algoritmo de datos ráster 195
(a) (b)
1400
1200
1000
800
600
400
200
0
0 50
valor de píxel
100 150 200 250
(C) (d)
1000
900
800
700
600
500
400
300
200
100
0
0 50
valor de píxel
100 150 200 250
FIGURA 10.8
Renderizador de estiramiento. (a) Figura original, (b) Histograma de figura original, (c) Figura estirada, 
(d) Histograma de figura estirada.
los valores podrían estirarse para utilizar este rango (Figura 10.8d). En el caso de ocho 
planos de bits, los valores se calculan en la Ecuación 10.2.
-v′ =metro×v+C
--
-metro=
28− 1
máx(v) − min(v)
(10.2)
-
--C=28− 1 −metro×máx(v)
dóndev′se refiere al valor de píxel estirado yvse refiere al valor de píxel original. Esto 
puede resultar en una imagen más nítida y algunas características pueden volverse más 
fáciles de distinguir (Figura 10.8c).
Distintos tramos producirán diferentes resultados en la visualización de trama; los 
métodos estándar incluyen desviación estándar, mínimo-máximo, ecualización de 
histograma y especificación de histograma.
losCompuesto RGBEl renderizador utiliza los mismos métodos que el renderizador 
estirado, pero permite combinar bandas como compuestos de rojo, verde y azul.
Co
nt
ar
Co
nt
ar
196Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
Los conjuntos de datos ráster multibanda, como imágenes satelitales o aéreas, generalmente 
se muestran en diferentes combinaciones de bandas usando RGB Composite.
losClasificadorenderer se utiliza con una capa ráster de una sola banda. El método 
clasificado muestra un ráster temático al agrupar los valores de las celdas en clases. Los 
fenómenos continuos como la pendiente, la distancia y la idoneidad se pueden clasificar 
en un pequeño número de clases que se pueden asignar como colores. La clasificación es 
una operación de datos espaciales utilizada junto con operaciones de selección 
anteriores. Esto puede crear un nuevo conjunto de datos o presentar una vista diferente 
de los mismos datos (por ejemplo, propiedades de visualización).
Dos renderizadores menos comunes sonValores únicosyColor discreto. losValores 
únicosrenderer se utiliza para mostrar cada valor en la capa ráster individualmente. Es 
adecuado para datos que contienen categorías discretas que representan objetos 
particulares, como un mapa temático que representa el uso o los tipos de suelo. El 
renderizador de valores únicos puede mostrar cada valor como un color aleatorio o usar 
un mapa de colores. Color discretorenderer muestra los valores en el conjunto de datos 
ráster usando un color aleatorio. Este renderizador es similar al renderizador de valores 
únicos, pero es más eficiente cuando hay una gran cantidad de valores únicos porque no 
tiene que calcular cuántos valores únicos existen. El renderizador de color discreto asigna 
un color a cada valor único hasta que alcanza el número máximo de colores elegido. El 
siguiente valor único comienza al principio del esquema de color; este proceso continúa 
hasta que cada valor único tiene un color asignado.
10.5 Análisis de trama
El análisis ráster incluye varios tipos de cálculos basados en píxeles. En esta 
sección, presentamos varios análisis de datos ráster que se realizan con frecuencia, 
incluidas operaciones de reclasificación, superposición y descriptivas.
La reclasificación es el proceso de reasignar nuevos valores de salida a un valor, 
un rango de valores o una lista de valores en un ráster. Se lleva a cabo cuando (1) se 
debe cambiar el valor de una celda, por ejemplo, en el caso de un cambio de terreno 
a lo largo del tiempo; (2) se deben agrupar varios tipos de valores; o (3) los valores 
específicos deben eliminarse del análisis. Existen varios enfoques para la 
reclasificación, como el uso de tablas de búsqueda y rangos de valores.
Usando una tabla de búsqueda, la reclasificación realiza un cambio de uno a uno. 
por ejemplo, enFigura 10.9, para realizar un análisis de hábitat, los valores de 
píxeles en un ráster de uso del suelo, que representan numerosos tipos de uso del 
suelo, deben cambiarse para representar valores de preferencia simples de alto, 
medio y bajo (p. ej., valores 1, 2 y 3). Los tipos de tierra más preferidos se reclasifican 
a valores más altos y los menos preferidos a valores más bajos. Por ejemplo, bosque 
se reclasifica a 3, pastizales a 2 y suelo residencial de baja densidad a 1.
Usando unrangos de valoresproceso, la reclasificación se lleva a cabo en un 
cambio de muchos a uno, reclasificando un rango de valores a alguna alternativa
Algoritmo de datos ráster 197
Uso del suelo
0
1
2
3
4
5
6
7
8
9
Uso del suelo
preferencia
1
2
3
FIGURA 10.9
La reclasificación de datos categóricos implica reemplazar valores individuales con nuevos valores. Por 
ejemplo, los valores de uso de la tierra se pueden reclasificar en valores de preferencia de bajo (1), medio (2) y 
alto (3).
valor y otro rango a un valor alternativo diferente. En nuestro análisis hipotético del 
hábitat, la segunda capa del modelo de idoneidad se basa en la preferencia por 
ubicaciones alejadas de las carreteras. ilustrado enFigura 10.10, se crea un mapa de 
distancia (datos continuos) a partir del tema de carreteras existente. En lugar de 
reclasificar individualmente cada uno de los miles de valores de distancia en una 
escala de preferencia de 1 a 3, los valores se pueden dividir en tres grupos. El grupo 
más lejano recibe el valor de preferencia más alto, un valor de 3, y el grupo más 
cercano, un valor de 1.
Las operaciones descriptivas también se pueden utilizar para realizar análisis de trama. Las 
operaciones incluyen valores mínimos, máximos, medios y medianos, y se pueden operar en 
una escala espacial diferente, como local, focal, zonal o global. Las operaciones locales 
funcionan en celdas ráster individuales o píxeles. Las operaciones focales funcionan en las 
celdas y sus vecinos, mientras que las operaciones globales funcionan en toda la capa. 
Finalmente, las operaciones zonales trabajan en áreas de celdas que comparten el mismo valor. 
En el software GIS, las operaciones se pueden realizar en una calculadora raster, donde están 
disponibles los cálculos matemáticos y las funciones trigonométricas.
Distancia
a las carreteras
Alto: 1784.73 Distancia
preferencia
1
2
3Bajo : 0
FIGURA 10.10
La reclasificación de datos continuos implica reemplazar un rango de valores con nuevos valores. Por ejemplo, 
un ráster que representa la distancia desde las carreteras se puede reclasificar en tres zonas de distancia.
198Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
Otras aplicaciones del análisis raster pueden ser DEMdisplay, análisis hidrológico 
(introducido enCapítulo 12), estadísticas zonales, análisis de búfer, etc.
10.6 Experiencia práctica con ArcGIS
10.6.1 Práctica práctica 10.1: Representaciones de color ráster
1.Figura 10.11amuestra un conjunto de datos de cobertura terrestre almacenado 
en la geodatabase "chp10data.gdb". El ráster se representa utilizando valores 
únicos con un mapa de color preespecificado. Observando la capa en el “Table 
of Contents” en ArcMap, cuando la etiqueta de esta capa se muestra como
Figura 10.11b, la capa debe contenerun mapa de color. Intente abrir la ventana 
de propiedades de la capa (Figura 10.11c) haciendo clic con el botón derecho en 
el nombre de la capa en la "Tabla de contenido" y seleccione "Propiedades..." y 
seleccione la pestaña "Simbología" en la ventana. El conjunto de datos ráster 
representado con color debe tener la opción de "Valores únicos", "Color 
discreto" y "Clasificado". La representación del mapa de color se aplica al 
dataset ráster con una banda.
2. Cambie el modo de reproducción de color. Como se muestra enFigura 10.12a, exporte 
los datos de cobertura terrestre. En la ventana "Exportar datos ráster" (Figura 10.12b
), seleccione "Usar renderizador", que permite que el ráster de salida use el mismo 
esquema de color, y seleccione "Forzar RGB", que transferirá el ráster de banda única 
al nuevo ráster que almacena los valores de píxeles en modo RGB.
Cuando el ráster se almacena en modo RGB, veremos tres subcapas en la 
"Tabla de contenido" (Figura 10.13) y en la pestaña "Simbología" en la ventana 
"Propiedades de capa", hay una opción de renderizador "Compuesto RGB", 
pero "Valor único", "Clasificado" y "Color discreto" ya no están disponibles.
(a) (b) (C)
FIGURA 10.11
Datos ráster representados mediante un mapa de color en ArcMap. (a) La capa ráster renderizada usando un mapa de 
color. (b) La etiqueta de la capa. (c) La ventana de propiedades.
Algoritmo de datos ráster 199
(a)
(b)
FIGURA 10.12
Pasos para exportar datos ráster en ArcMap. (a) Exportar los datos de cobertura terrestre y (b) la ventana "Exportar 
datos ráster".
10.6.2 Práctica práctica 10.2: Análisis de datos ráster: 
Encuentre el área con el rango de elevación entre 60 
y 100 y el tipo de cobertura terrestre como "bosque"
1. En chp10data.gbd, hay dos conjuntos de datos ráster "dem" y "landcover". 
Ejecute Code 10.1 en la ventana Python de ArcMap para clasificar los datos 
DEM en varios rangos de elevación (0–10, 10–30, 30–60, 60–100 y >100 
grados). El resultado se muestra enFigura 10.14.
200Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 10.13
Ráster mostrado en RGB.
Tenga en cuenta que la función "Reclasificar" requiere que los usuarios de 
ArcMap tengan la extensión "Spatial Analyst"; por lo tanto, verifique la licencia 
de la extensión antes de ejecutar el análisis.
La función Reclassify proporciona dos métodos para definir las clases: 
RemapRange redefine un rango de valores en un nuevo valor de clase; 
RemapValue define la relación de mapeo uno a uno, es decir, 
reemplaza un solo valor original con un solo valor nuevo.
2. El conjunto de datos de cobertura terrestre almacena los tipos de cobertura terrestre 
en detalle. Por ejemplo, “Bosque” se divide en tres subtipos: “Bosque Caducifolio”, 
“Bosque Perennifolio” y “Bosque Mixto”. Ejecute el código 10.2 en la ventana de 
Python de ArcMap para generalizar el conjunto de datos de cobertura terrestre. El 
resultado se muestra enFigura 10.15.
3. Ejecute el código 10.3 en la ventana de Python de ArcMap para superponer los conjuntos de 
datos de cobertura terrestre y DEM clasificados para encontrar el área en el bosque (valor 
de píxel del conjunto de datos de cobertura terrestre = 4) con una elevación entre 60 y 100 
(valor de píxel del conjunto de datos DEM = 100). Para este conjunto de datos específico, 
una forma de encontrar el área esperada es agregar las dos capas y encontrar los píxeles 
con el valor en 104, luego reclasificar todos los píxeles con el valor en 104 en una clase (1), y 
todos los demás píxeles en otra clase (0).Figura 10.16 muestra el resultado de la 
reclasificación.
10.6.3 Práctica práctica 10.3. Acceda a la información de atributos del 
conjunto de datos ráster y calcule el área
1. Ejecute el Código 10.4 en la ventana Python de ArcMap para calcular el área del 
conjunto de datos ráster. El conjunto de datos ráster ya debería estar proyectado.
Algoritmo de datos ráster 201
# clasificar elevaciones en clases
# establecer espacio de trabajo
arcpy.env.espacio de trabajo ="C:\\ArcGISdata\\chp10data\\chp10data.gdb"
"""
Compruebe la licencia de la extensión de analista espacial. El valor 
devuelto "disponible" significa que las funciones de esta extensión se 
pueden utilizar.
"""
arcpy.CheckExtension("espacial")
"""
Defina los datos de entrada. "Dem" es un conjunto de datos ráster de geodatabase de 
archivos almacenado en "chp10data.gdb"
"""
en Ráster ="dem"
"""
Defina las clases de valor. Los primeros dos elementos entre paréntesis [0,10,10] 
significan los valores mínimo y máximo en la clase y el tercer elemento 
significa el nuevo valor para los siguientes píxeles en la clase.
"""
rangos = arcpy.sa.RemapRange([[0,10,10],[10,30,30],[30,60,60], [60,100,100],
[100,175,175]])
"""
Ejecute la función Reclasificar según el campo "Valor" del ráster utilizando 
RemapRange y establezca los valores faltantes como "NODATA".
"""
outDEM = arcpy.sa.Reclassify(inRaster,"Valor", rangos,"SIN DATOS")
"""
Genere el resultado de la función de reclasificación como un nuevo dataset ráster 
en la geodatabase de archivos, denominado "classifiedElevation" (Figura x 
izquierda).
"""
outDEM.save("elevaciónclasificada")
CÓDIGO 10.1
Clasificar datos DEM.
2. Utilizando el conjunto de datos de cobertura terrestre clasificado que resultó de 
la práctica anterior, ejecute el Código 10.5 en la ventana de ArcMap Python para 
calcular el área de cada tipo de cobertura terrestre. El área de cada tipo de 
cobertura terrestre se puede calcular primero utilizando la proporción de los 
recuentos de píxeles de este tipo con respecto al recuento total de píxeles y 
luego multiplicar el área total del conjunto de datos ráster. En consecuencia, 
utilice el SearchCursor (verCapítulo 8) para capturar los recuentos de píxeles.
202Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 10.14
Resultado de reclasificar datos DEM en Código 10.1.
# generalizar los tipos de cobertura terrestre
# datos de entrada
inLandcover ="cobertura terrestre"
"""
Establezca la relación de mapeo entre valores antiguos y valores nuevos. El 
primer elemento entre paréntesis [11,1] significa el valor anterior y el segundo 
elemento significa el valor nuevo.
"""
valores = arcpy.sa.RemapValue([[11,1],[21,2],[22,2],[23,2],[24,2],[31,3],
[41,4],[42,4],[43,4],[52,5],[71,7],[81,8],[82,8],[90,9], [95 ,9]])
# ejecutar la función de reclasificación y guardar como un nuevo conjunto de 
datos "classifiedLandcover"
outLandcover = arcpy.sa.Reclassify(inLandcover,"Valor",valores) 
outLandcover.save("Cubierta terrestre clasificada")
CÓDIGO 10.2
Generalizar el conjunto de datos de cobertura terrestre.
Algoritmo de datos ráster 203
FIGURA 10.15
Resultado de reclasificar datos de tipo de cobertura terrestre en el Código 10.2.
"""
Use la calculadora ráster para agregar dos capas. Tenga en cuenta que la 
calculadora ráster puede ejecutar muchos otros cálculos de álgebra en el
conjunto de datos ráster.
"""
temp = arcpy.gp.RasterCalculator_sa("'outLandcover' + 'outDEM'", 
"superposiciónRáster")
"""
Reclasifique las capas en dos clases: 1 y 0. 1 representa el área que está en 
el bosque y tiene la elevación esperada.
"""
outReclassify = arcpy.sa.Reclassify("superposiciónRáster","Valor", arcoíris.
sa.RemapRange([[12,103,0], 
[104,104,1],[105,184,0]]), "SIN 
DATOS")
CÓDIGO 10.3
Reclasificar y encontrar áreas específicas.
204Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
FIGURA 10.16
Resultado de reclasificar datos de tipo de cobertura terrestre en el Código 10.3.
# describir la extensión espacial del conjunto de datos y calcular el 
área desc = arcpy.Describe("Cubierta terrestre clasificada") area = 
desc.ancho * desc.alto
CÓDIGO 10.4
Calcular área.
# describir la extensión espacial del conjunto de datos y calcular el 
área desc = arcpy.Describe("Cubierta terrestre clasificada") area = 
desc.ancho * desc.alto
# almacenar el recuento total de píxeles en el conjunto de datos 
recuento total = 0
# inicializaruna matriz para poner los recuentos de píxeles en cada tipo de cobertura terrestre 
cuenta = []
"""
Utilice SearchCursor para acceder a los campos Valor y Recuento. El campo 
Valor es el valor del tipo de cobertura terrestre.
"""
conarcpy.da.SearchCursor("Cubierta terrestre clasificada", ["Valor","Contar"]) como\ 
cursor:
porfilaencursor:
totalCount = totalCount + fila[1] cuenta.append({'escribe': 
fila[0],'contar':fila[1]})
# calcular e imprimir el área de cada tipo de cobertura terrestre por
elementoencuenta:
impresión'El área del tipo de cobertura terrestre {0} es: {1}'. 
formato(ele['escribe'],ele['contar']/recuentototal*área)
CÓDIGO 10.5
Calcular el área total.
Algoritmo de datos ráster 205
10.7 Resumen del capítulo
Este capítulo presenta algoritmos de procesamiento de datos ráster y los demuestra 
en ArcGIS utilizando la programación Arcpy, que incluye lo siguiente:
1. Estructura de datos ráster
2. Representación de color
3. Almacenamiento de datos ráster
4. Compresión de datos ráster
5. Formatos de datos ráster
6. Análisis de trama
7. Experiencia práctica con arcpy
PROBLEMAS
Para los datos ráster de su elección, diseñe un escenario que requiera 
reclasificación. Explique el razonamiento para la reclasificación y determine el 
propósito de las nuevas clases. Calcule el área para cada clase y use diferentes 
métodos de reproducción de color para presentar el resultado.
NOTA :Todos los códigos se pueden ejecutar con éxito en ArcGIS para versiones de 
escritorio 10.2.2 a 10.3. Puede haber un problema al ejecutar el código en una versión 
más reciente de ArcGIS.
http://taylorandfrancis.com
11
Algoritmos de datos de red
Una red es un sistema de elementos interconectados, como bordes (líneas) y cruces 
de conexión (puntos) que representan posibles rutas de un lugar a otro. Las 
personas, los recursos y los bienes tienden a viajar a lo largo de las redes: los 
automóviles y los camiones viajan por carreteras, los aviones vuelan en rutas de 
vuelo predeterminadas, el petróleo fluye por los oleoductos. Al modelar rutas de 
viaje potenciales con una red, es posible realizar análisis relacionados con el 
movimiento del petróleo, camiones u otros agentes en la red. El análisis de red más 
común es encontrar el camino más corto entre dos puntos (McCoy et al., 2001). Este 
capítulo presenta la representación de red, los algoritmos y las aplicaciones en SIG, 
y brinda experiencia práctica con ArcGIS.
11.1 Representación de la red
11.1.1 Representación básica de la red
Una red, a veces llamada grafo, es un grupo o sistema de objetos 
interconectados. Podría ser el sistema de transporte o varias 
computadoras, máquinas u operaciones interconectadas. Hay dos 
componentes esenciales en una red: bordes y nodos (Figura 11.1).
Cada punto de una red se denomina vértice o nodo. Las conexiones entre 
vértices se denominan aristas o enlaces. Matemáticamente, una red 
consiste en una colecciónVde vértices y una colecciónmide bordes cada 
bordemi∈miSe dice que une dos vértices, que se llaman sus extremos. 
Cuando hay un bordemique une vérticestuyv, se denominan adyacentey 
bordemi= (tu,v) se dice que es incidente con vérticestuyv, respectivamente. 
Por ejemplo, la red enFigura 11.2puede ser representado por lo siguiente:
• V= {v1,v2,v3,v4}
• mi= {(v1,v2), (v2,v4), (v1,v3), (v1,v4), (v3,v4)}
11.1.2 Redes dirigidas y no dirigidas
Hay dos tipos de sistemas de red: redes dirigidas y redes no dirigidas. Una 
red dirigida es una red en la que los bordes tienen direcciones,
207
208Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
Bordes
Nodos
FIGURA 11.1
Un ejemplo de elementos básicos de red.
lo que significa que no hay distinción entre los dos vértices asociados con cada borde. Por 
ejemplo,Figura 11.2es en realidad una red no dirigida. Las redes no dirigidas se utilizan 
para modelar redes en líneas aéreas, rutas de navegación y rutas de tránsito. Por 
ejemplo, una ruta de vuelo bidireccional que conecta un conjunto de ciudades se puede 
representar como un gráfico no dirigido. Las ciudades podrían definirse por los vértices y 
los bordes desordenados pueden representar rutas de vuelo de dos vías que conectan las 
ciudades.
En contraste, los bordes en una red dirigida dirigen un vértice a otro. En redes 
dirigidas, una ventajamise define por pares ordenados como <X,y> donde vérticeXes el 
origen y el vérticeyes el destino. Por ejemplo, borde <V2,V3>se dirige desdeV2aV3. El 
ejemplo de la red dirigida en Figura 11.3ase puede representar comoV= {<V1,V2>, <V3,V2>, 
<V3,V1>}. Las redes dirigidas se utilizan para modelar sistemas de carreteras, electricidad, 
teléfono, cable, alcantarillado y agua. Por ejemplo, una red de carreteras que conecta un 
conjunto de ubicaciones en una ciudad con carreteras de un solo sentido se puede 
representar como un gráfico dirigido. Las ubicaciones se pueden representar mediante 
los vértices y los bordes dirigidos pueden representar las carreteras que conectan las 
ubicaciones teniendo en cuenta el flujo de tráfico. Tenga en cuenta que definir una red 
como dirigida o no depende en gran medida del problema que está tratando de modelar.
v3mi3
v1
mi mi51 mi4
v2
mi2 v4
FIGURA 11.2
Un ejemplo de representación de red básica.
Algoritmos de datos de red 209
(a) (b)
v1 v1
v2 v3 v2 v3
FIGURA 11.3
Ejemplo de red dirigida y no dirigida. (a) Red dirigida, (b) Red no dirigida.
11.1.3 La Matriz de Adyacencia
Hay muchas formas de representar una red. Una de las formas más populares es 
utilizar una matriz de adyacencia. Una matriz de adyacencia es una matriz cuadrada 
utilizada para representar un gráfico finito. Los elementos de la matriz indican si los 
pares de vértices son adyacentes o no en el gráfico. Por ejemplo, para una red con
nortevértices, la matriz de adyacencia para esta red será unanorte×norte matriz, 
donde (i,j) es el índice de la conexión entre el vérticeiyj. Si elemento (i,j) es distinto de 
cero (es decir, "1"), significa que los vérticesiyjestán conectados, si es cero significa 
que no están conectados. Tenga en cuenta que las matrices de adyacencia no 
dirigidas son simétricas.Figura 11.4muestra la diferencia entre matrices de 
adyacencia para matrices dirigidas y no dirigidas.
11.1.4 Representación de red en SIG
La mayoría del software GIS utiliza la representación de borde de nodo para el análisis de red, 
que es una variante de la matriz de adyacencia. Representación de red de borde de nodo
(a) (b)
v1 v1
v2 v3 v2 v3
v1
0
v2
1
v3
0
v1
0
v2
1
v3
1v1
v2
v3
v1
v2
v3
0
1
0
1
0
0
1
1
0
1
1
0
FIGURA 11.4
Matriz de adyacencia de red dirigida y no dirigida. (a) Red dirigida, (b) Red no dirigida.
210Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
TABLA 11.1
Ejemplo de tabla de nodos para la red enFigura 11.2
IDENTIFICACIÓN X Y
v1
v2
v3
v4
23.2643
23.1443
23.2823
23.1442
75.1245
74.1242
75.1315
75.1286
TABLA 11.2
Ejemplo de Tabla de Enlace para la Red enFigura 11.2
IDENTIFICACIÓN Origen Destino Un camino
mi1
mi2
mi3
mi4
mi5
v1
v2
v1
v1
v3
v2
v4
v3
v4
v4
No
No
No
No
No
mantiene una tabla de nodos y una tabla de aristas, como se demuestra en 
Tablas 11.1y11.2.
• Tabla de nodos: Esta tabla contiene al menos tres campos: uno para almacenar 
un identificador único y los otros para almacenar el nodoXyYcoordenadas 
Aunque estas coordenadas pueden ser definidas por cualquier sistema de 
referencia cartesiano, las longitudes y latitudes aseguran una fácil portabilidad 
a un SIG (Rodrigue, 2016).
• Tabla de enlaces: esta tabla también contiene al menos tres campos: uno para 
almacenar un identificador único, uno para almacenar el nodo de origen y otro para 
almacenar el nodo de destino. Se puede utilizar un cuarto campo para indicar si el 
enlace es unidireccional o no.
11.2 Encontrar el camino más corto
11.2.1 Declaración del problema
En la teoría de grafos, un camino en un gráfico es una secuencia finita o infinita de aristas 
que conectan una secuencia de vérticesque, según la mayoría de las definiciones, son 
todos distintos entre sí (Bondy y Murty, 1976). Encontrar el camino más corto es uno
Algoritmos de datos de red 211
de los algoritmos de análisis de red más importantes. Se refiere a encontrar el 
camino entre dos vértices en una red que minimiza la distancia acumulada (o 
distancia ponderada) de sus bordes constituyentes. Para un problema regular de 
ruta más corta, generalmente hacemos las siguientes suposiciones:
• Los bordes pueden ser dirigidos o no dirigidos. Un camino más corto debe respetar la 
dirección de sus bordes.
• La longitud de cada borde no tiene que ser una distancia espacial. También 
podría referirse al tiempo o algún otro costo.
• Las distancias entre los nodos deben ser no negativas.
• No todos los vértices son accesibles. Si un vértice no es accesible desde 
el otro, no hay camino posible entre ellos.
11.2.2 Un enfoque de fuerza bruta para el algoritmo de ruta más corta
Un enfoque de fuerza bruta para encontrar el camino más corto entre dos vértices en una 
red se puede describir como
• Paso 1: encuentre todos los caminos posibles desde el punto de inicio hasta el punto final.
• Paso 2: Calcular la longitud de cada camino.
• Paso 3: elige el camino más corto comparando las longitudes de todos los 
caminos diferentes.
Por ejemplo, dada la red enFigura 11.5, nos gustaría encontrar el camino más 
corto desdeAa todos los demás vértices. El número de cada borde es el costo y
Tabla 11.3muestra todos los caminos posibles desdeAa los otros vértices. 
Aunque este método para encontrar el camino más corto es simple y directo, la 
complejidad de este enfoque aumenta exponencialmente con el número de 
vértices y aristas. Por ejemplo, si conectamosByC, habrá al menos dos rutas 
más desdeAami. En una aplicación de red real,
B
1 2
1
A D mi
2 2
C
FIGURA 11.5
Un ejemplo de red utilizado para ilustrar cómo encontrar el problema de la ruta más corta.
212Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
TABLA 11.3
Enfoque de fuerza bruta para resolver el problema de la ruta más corta 
(Encuentre la ruta más corta desdeAami)
Punto de destino Posibles caminos y longitud Ruta más corta
B
C
D
mi
AB: 1; ACDB: 6
CA: 2; ABDC: 5
ABD: 3; CDA: 4
ABDA: 4; ACD: 5
AB: 1
CA: 2
DAB: 2
ABDA: 4
generalmente tienen una gran cantidad de vértices y aristas (por ejemplo, un sistema de 
transporte), lo que sería muy costoso y requeriría mucho tiempo desde el punto de vista 
computacional. Por lo tanto, se necesita un algoritmo computacionalmente eficiente para 
calcular el camino más corto.
11.2.3 Algoritmo de Dijkstra
El algoritmo de Dijkstra es un algoritmo ampliamente utilizado para resolver el 
problema del camino más corto. Consta de los siguientes seis pasos. Deje que el 
nodo en el que estamos comenzando se llame el nodo inicial. Deje que la distancia 
del nodoYSea la distancia desde el nodo inicial hastaY. El algoritmo de Dijkstra 
asignará unos valores iniciales de distancia y tratará de mejorarlos paso a paso 
(Dijkstra, 1959).
• Asigne a cada nodo un valor de distancia tentativo: configúrelo en cero para el 
nodo inicial y en infinito para todos los demás nodos.
• Establecer el nodo inicial como actual. Marque todos los demás nodos como no visitados. 
Cree un conjunto de todos los nodos no visitados denominado conjunto no visitado.
• Para el nodo actual, considere todos sus vecinos no visitados y calcule 
sus distancias tentativas. Compare la distancia tentativa recién 
calculada con el valor asignado actual y asigne la más pequeña. Por 
ejemplo, si el nodo actualAestá marcado con una distancia de 6, y el 
borde que lo conecta con un vecinoBtiene longitud 2, entonces la 
distancia aB(medianteA) será 6 + 2 = 8. SiBestaba previamente marcado 
con una distancia mayor a 8, luego cámbielo a 8. De lo contrario, 
mantenga el valor actual.
• Después de considerar todos los vecinos del nodo actual, marque el 
nodo actual como visitado y elimínelo del conjunto no visitado.
Un nodo visitado nunca se volverá a comprobar.
• Si el nodo de destino ha sido marcado como visitado (al planificar una 
ruta entre dos nodos específicos) o si la distancia tentativa más 
pequeña entre los nodos en el conjunto no visitado es infinito (al 
planificar un recorrido completo; ocurre cuando no hay conexión
Algoritmos de datos de red 213
TABLA 11.4
Proceso de uso del algoritmo de Dijkstra para resolver el camino más 
corto desdeAa otros vértices (CXSignifica el costo deAaX)
Paso Punto Seleccionado CA CA CA CA CA Sendero
A
METRO
1
2
3
4
5
A
B
C
D
mi
0 ∞
1
∞
2
2
∞
∞
∞
∞
A
AB
A B C
A B C D
A B C D E
AB
C.A.
ABD
ABDE
3
3
3
∞
∞
1 2 4
entre el nodo inicial y los nodos restantes no visitados), luego deténgase. El 
algoritmo ha terminado.
• De lo contrario, seleccione el nodo no visitado que está marcado con la distancia 
tentativa más pequeña, configúrelo como el nuevo "nodo actual" y regrese al 
paso 3.
Como ejemplo, el problema mencionado en la última sección se puede resolver 
utilizando el algoritmo de Dijkstra (Tabla 11.4). El pseudocódigo del algoritmo de 
Dijkstra se muestra enTabla 11.5.
La implementación del algoritmo de Dijkstra es bastante compleja y requiere 
diferentes tipos de estructuras de datos y consideraciones elaboradas. Por lo tanto, 
los ejemplos de ArcGIS se utilizan para demostrar cómo se admite el análisis de red 
en GIS. El código fuente también está disponible en muchos paquetes de software 
de código abierto como QGIS.
TABLA 11.5
Pseudocódigo para el algoritmo de Dijkstra
Entrada: conjunto de datos de red (G), vértice inicial (A) {
NS1:
NS2:
NS3:
NS4:
NS5:
NS6:
NS7:
DK8:
DK9:
DK10:
DK11:
DK12:
DK13:
}
para cada vértice v en G:
distancia[v] = ∞
dist[A] := 0
T = el conjunto de todos los vértices en G 
mientras que T no está vacío:
s = vértices en T con menor dist[ ] 
eliminar s de T
para cada (vecino) conectado v de s:
distancia_temp = dist[s] + dist_entre(s, v)
si distancia_temp < dist(v)
dist [v] = distancia_temp. Distancia_más 
corta [v] = Distancia_temp. return 
Distancia_más corta []
214Introducción a la Programación GIS y Fundamentos con Python y ArcGIS®
11.3 Tipos de análisis de red
El análisis de red le permite resolver problemas comunes de red, como encontrar la mejor ruta 
a través de una ciudad, encontrar el vehículo o la instalación de emergencia más cercana, 
identificar un área de servicio alrededor de una ubicación, atender un conjunto de pedidos con 
una flota de vehículos o elegir el Las mejores instalaciones para abrir o cerrar. Todos estos 
problemas podrían resolverse utilizando el algoritmo de Dijkstra o sus variantes.
11.3.1 Enrutamiento
Ya sea que busque una ruta simple entre dos ubicaciones o una que visite 
varias ubicaciones, las personas generalmente intentan tomar la mejor ruta. 
Pero la “mejor ruta” puede significar diferentes cosas en diferentes situaciones. 
La mejor ruta puede ser la más rápida, la más corta o la más pintoresca, según 
elimpedanciaelegido. La mejor ruta se puede definir como la ruta que tiene la 
impedancia más baja, donde la impedancia la elige el usuario. Si la impedancia 
es el tiempo, entonces la mejor ruta es la ruta más rápida. Cualquier atributo de 
costo de red válido se puede usar como impedancia al determinar la mejor 
ruta.
11.3.2 Instalación más cercana
Encontrar el hospital más cercano a un accidente o la tienda más cercana a la dirección de la 
casa de un cliente son ejemplos de problemas de las instalaciones más cercanas. Al buscar las 
instalaciones más cercanas, puede especificar cuántas buscar y si la dirección del viaje es hacia 
ellas o alejándose de ellas mediante el software GIS. Una vez que haya encontrado las 
instalaciones más cercanas, puede mostrar la mejor ruta hacia o desde ellas, devolver el costo 
del viaje para cada ruta y mostrar las indicaciones para llegar a cada instalación. Además, 
puede especificar un límite de impedancia para Network Analyst. Por ejemplo, puede 
configurar un problema

Mais conteúdos dessa disciplina