Administre datos espaciales con IBM DB2 Spatial Extender. Parte 1: Cómo adquirir datos espaciales y desarrollar aplicaciones

Consejos y técnicas para desarrollar aplicaciones espaciales eficientes

Esta serie de tutoriales describe las tareas comunes al administrar datos espaciales con IBM DB2® Spatial Extender, incluida la importación y creación de datos espaciales, la elaboración y ejecución de consultas sobre datos espaciales, la utilización de herramientas espaciales de IBM, de terceros y de fuente abierta, la adaptación del desempeño y la consideración de circunstancias especiales en el entorno de almacenamiento de datos. En el primer artículo de esta serie, aprenda a adquirir datos espaciales y a desarrollar aplicaciones. Aprenda a utilizar archivos de forma, tablas de datos espaciales e índices espaciales.

David Adler, Senior Software Engineer, IBM China

David AdlerDavid Adler ha sido responsable del desarrollo de tecnología de base de datos espaciales en IBM durante más de 20 años y ha dedicado los últimos 10 años al desarrollo de DB2 Spatial Extender.



31-07-2012

Antes de comenzar

Conozca lo que aprenderá en este tutorial y cómo aprovecharlo al máximo.

Acerca de esta serie

Durante más de 10 años, DB2 Spatial Extender ha brindado la capacidad de administrar y analizar datos espaciales almacenados en tablas relacionales de DB2. Las columnas de la tabla se pueden definir con tipos espaciales de puntos, líneas y polígonos, los cuales pueden representar objetos como los siguientes:

Ubicaciones de puntos
Clientes, tiendas minoristas, transformadores eléctricos, torres celulares
Líneas
Carreteras, líneas costeras, rutas de entrega, líneas de transmisión eléctrica
Polígonos
Territorios de servicio/ventas, riesgo de inundaciones/incendios, estados/provincias/condados

Las consultas de SQL pueden incorporar funciones espaciales para analizar relaciones espaciales, como determinar los clientes dentro de una zona de inundaciones. Listado 1 muestra un ejemplo del código que incorpora funciones espaciales.

Listado 1. Consulta que incorpora funciones espaciales
SELECT cust_name, cust_addr
FROM customers, floodzones
WHERE ST_Within(cust_loc, flood_loc) = 1

El resultado de esta consulta genera una serie de nombres y direcciones de clientes cuyos hogares podrían estar en zonas de riesgo de inundaciones. Esta información es útil al calcular tarifas de seguro o al enviar una oferta sobre la adquisición de un seguro contra inundaciones.

Esta serie de tutoriales repasará las tareas comunes al trabajar con datos espaciales en DB2 Spatial Extender. Esto incluye la importación y creación de datos espaciales, la elaboración y ejecución de consultas sobre datos espaciales, la utilización de herramientas espaciales de IBM, de terceros y de fuente abierta, la adaptación del desempeño y la consideración de circunstancias especiales en el entorno de almacenamiento de datos.

A pesar de que esta serie de tutoriales se centra en DB2 Spatial Extender en sistemas operativos Linux®, UNIX®y Windows,® muchos de los conceptos se aplican de manera similar a otras ofertas de bases de datos de IBM con capacidades espaciales, incluidas las siguientes:

  • Spatial Support for DB2 for z/OS®
  • Informix® Spatial Datablade
  • Netezza® Spatial

Tutoriales en esta serie

Los siguientes tutoriales adicionales están planificados para esta serie de 5 partes.

Parte 2: Cómo implementar casos típicos de uso espacial
Existen algunos casos típicos de uso en la aplicación espacial, los cuales incluyen enlaces espaciales, consultas sobre distancias, perimetrajes y consultas sobre proximidad. Este tutorial ofrece ejemplos para implementar eficientemente estos casos de uso.
Parte 3: Adaptación de la aplicación espacial
El desempeño de la aplicación siempre es algo importante a considerar. Este tutorial explora los factores del desempeño de la aplicación espacial y las herramientas para comprender el comportamiento de la consulta. Algunos de los factores considerados incluyen los datos incorporados, la agrupación en clúster de datos, la comprensión y la generalización.
Parte 4: Análisis espacial en un entorno de almacenamiento de datos
Alcanzar buena escalabilidad en un entorno InfoSphere Warehouse no compartido requiere consideraciones adicionales. Este tutorial aborda las técnicas para obtener una buena co-ubicación de consultas espaciales. Además, brinda consideraciones especiales al trabajar con middleware de Esri.
Parte 5: Herramientas de visualización espacial de IBM, de terceros y de fuente abierta.
La visualización de datos espaciales es, con frecuencia, un aspecto importante de la aplicación espacial. Este tutorial presenta algunas de las herramientas que se encuentran disponibles, incluida la herramienta gratuita IBM Geobrowser, el software Esri, los servicios de mapas web (como Google maps) y los software de fuente abierta que utilizan el controlador GeoTools para DB2.

Acerca de este tutorial

Este tutorial le presenta la tecnología proporcionada por DB2 Spatial Extender. Además, el tutorial ofrece enfoques para completar las tablas de DB2 con datos espaciales: un paso esencial antes de implementar las consultas espaciales. Este tutorial también aborda entornos para la ejecución de consultas espaciales, incluido el procesador de línea de comandos DB2, IBM Data Studio y la incorporación en una aplicación con JDBC, CLI y otras interfaces.

Objetivos

Cuando finalice este tutorial, usted podrá:

  • Comprender importantes conceptos espaciales relacionados con los tipos espaciales y los sistemas de coordenadas
  • Conocer los enfoques para importar y crear datos espaciales
  • Comprender la indexación espacial
  • Estar familiarizado con los entornos para ejecutar consultas espaciales

Prerrequisitos

Este tutorial está destinado a arquitectos y desarrolladores de aplicaciones que cuentan con conocimiento práctico del lenguaje de DB2 y SQL.

Descargue los scripts SQL de muestra, la aplicación Java y los datos de muestra de la sección Descargas y guárdelos en un directorio conveniente para seguir los ejemplos de este tutorial.

Requerimientos del sistema

Para seguir los pasos del tutorial, necesita un entorno de trabajo DB2 con Spatial Extender instalado y configurado. Consulte Recursos para obtener información sobre cómo configurar este entorno.


Introducción

Visión general de DB2 Spatial Extender

La instalación y configuración de DB2 Spatial Extender brinda las características y los componentes que se detallan a continuación:

Tipos de datos espaciales
Un conjunto de tipos de datos que se puede utilizar para definir columnas que incluirán datos espaciales. Esto incluye ST_Point, ST_Linestring y ST_Polygon para valores espaciales atómicos. Además, incluye ST_MultiPoint, ST_MultiLinestring y ST_MultiPolygon para colecciones homogéneas de valores espaciales.
Predicados y funciones espaciales
Un gran número de funciones definidas por el usuario (UDF, sigla en inglés) de SQL para crear valores espaciales, devolver información sobre valores espaciales, identificar relaciones espaciales y realizar operaciones sobre valores espaciales. Estas UDF espaciales se pueden incorporar a las consultas de SQL, lo que aprovecha todas las capacidades del lenguaje de SQL.
Índice espacial
Se proporciona un mecanismo de índice espacial para soportar la naturaleza bidimensional de los datos espaciales. Las herramientas se encuentran disponibles para ayudar a especificar un índice espacial.
Procesador de línea de comandos espaciales (CLP) - db2se
El db2se CLP brinda una cómoda interfaz de línea de comandos destinada a procedimientos espaciales almacenados para operaciones como la activación espacial de una base de datos, y la importación o exportación de datos espaciales.

Consulte Recursos para obtener más detalles sobre Spatial Extender en el centro de información de DB2.

Sistemas de referencia espacial y sistema de coordenadas

Generalmente, los datos espaciales se representan con conjuntos de variables de valores de coordenadas, con frecuencia x, y, pero también se brinda soporte para coordenadas z y m . Este tutorial tiene en cuenta datos solo con valores de coordenadas x e y . También se incluyen los datos que utilizan únicamente valores de latitud y longitud en grados como valores decimales. Tenga en cuenta que al trabajar con latitud y longitud, la longitud corresponde a x y la latitud corresponde a y.

Con el fin de llevar a cabo operaciones espaciales de manera correcta, cada valor espacial debe tener un sistema de coordenadas asociado, el cual debe describir la relación de los valores de coordenadas con una posición sobre la superficie de la tierra. A pesar de que Spatial Extender brinda más de 3000 sistemas de coordenadas predefinidos y diferentes, este tutorial solo aborda los dos sistemas más utilizados habitualmente: NAD83 para coordenadas en América del Norte y WGS84 para coordenadas en todo el mundo. Tenga en cuenta que la mayoría de los dispositivos GPS indican las coordenadas utilizando el sistema WGS84.

Para almacenar y procesar eficientemente datos espaciales, Spatial Extender representa las coordenadas internamente como enteros de 64 bits. Spatial Extender lo administra mediante el uso de un sistema de referencia espacial (SRS, sigla en inglés) que especifica los desplazamientos y un factor de escala utilizado para convertir la representación del usuario en un valor DOBLE de un lugar a otro de la representación interna. Cada SRS también cuenta con un sistema de coordenadas asociado. En realidad, es el SRS el que está asociado con cada valor espacial. Se puede hacer referencia al SRS por su nombre de valor de 128 caracteres (denominado srsName o SRS_NAME) o por su identificador de enteros de 32 bits (denominado srid o SRS_ID). El srid se utiliza en los argumentos SQL y el srsName se utiliza con db2se CLP, con mayor frecuencia al importar datos espaciales.

Spatial Extender ofrece el SRS llamado NAD83_SRS_1 con el srid 1 para los datos que utilizan el sistema de coordenadas NAD83. Spatial Extender ofrece el SRS llamado WGS84_SRS_1003 con el srid 1003 para los datos que utilizan el sistema de coordenadas WGS84. Consulte la documentación en el centro de información de DB2 si necesita trabajar con un sistema de coordenadas diferente.


Cómo importar desde archivos de forma

Cómo obtener archivos de forma

El estándar de hecho para almacenar e intercambiar datos espaciales en formato de archivo es la representación de archivo de forma creada por Esri. Esri proporciona archivos de forma de datos de muestra para descargarlos y utilizarlos con Spatial Extender (consulte Recursos), pero el archivo de forma necesario para este tutorial se incluye en Descargas para su comodidad. Los archivos de forma de Esri representan los siguientes tipos de datos:

  • Límites de países
  • Límites de estados
  • Límites de condados
  • Límites de códigos postales y centroides
  • Carreteras principales
  • Ciudades, aeropuertos, hospitales, escuelas
  • Ríos

Puede descargar otros archivos de forma desde otros recursos. El uso de algunos archivos de forma no tiene cargo, pero algunos requieren derechos de licencia.

Un archivo de forma, en realidad, es una colección de archivos relacionados que tienen el mismo nombre pero diferentes extensiones de archivo. Los archivos más comunes, y los utilizados por Spatial Extender, incluyen los siguientes tipos de archivo:

<name>.shp
Este es un archivo binario obligatorio que contiene un encabezado con el tipo de datos (puntos, líneas, polígonos y otras geometrías), el número de registros y los datos de coordenadas reales.
<name>.dbf
Este es un archivo binario obligatorio que contiene los atributos numéricos y caracteres asociados con cada registro. En realidad, utiliza el formato DBASE y se puede visualizar con aplicaciones que soportan este formato. Existen limitaciones importantes con este formato. El límite para nombres de atributo es 11 caracteres de largo y los datos del carácter no pueden ser mayores a 255 bytes.
<name>.prj
Este es un archivo de texto opcional que contiene la definición del sistema de coordenadas asociado con los datos espaciales. El sistema de coordenadas en el archivo .prj debe coincidir con el sistema de coordenadas del SRS, de la columna a la cual se cargan los datos. Si este archivo no existe, Spatial Extender asume que los datos se encuentran en el sistema de coordenadas del SRS especificado.
<name>.shx
Este es un archivo binario opcional que proporciona un índice en el archivo .shp. El principal uso de este archivo con Spatial Extender es iniciar la importación en registros que no son el primer registro.

No es necesario conocer los detalles de estos archivos pero si está interesado, haga clic en el enlace sobre las especificaciones de Esri en la sección Recursos .

Cómo obtener detalles sobre los archivos de forma

Puede usar el comando db2se shape_info de Spatial Extender para obtener información sobre un archivo de forma específico, incluido el tipo de geometrías, las extensiones geográficas de los datos, y todos los nombres y tipos de atributo. Listado 2 ofrece un ejemplo del comando utilizado con el archivo de forma counties (condados) que se brinda como muestra con este tutorial (consulte Descargas). La lista de atributos en Listado 2 está resumida para ahorrar espacio.

Listado 2. Atributos del archivo de forma
db2se shape_info -fileName counties.shp

Shape file information
----------------------
File code                  = 9994
File length (16-bit words) = 758872
Shape file version         = 1000
Shape type                 = 5 (ST_MULTIPOLYGON)
Number of records          = 3141

Minimum X coordinate = -178.217598
Maximum X coordinate = -66.969271
Minimum Y coordinate = 18.921786
Maximum Y coordinate = 71.406235

Shapes do not have Z coordinates.
Shapes do not have M coordinates.
Shape index file (extension .shx) is present.

Attribute file information
--------------------------
dBase file code                = 3
Date of last update            = 2002-02-04
Number of records              = 3141
Number of bytes in header      = 1569
Number of bytes in each record = 461
Number of columns              = 48

Column Number  Column Name      Data Type       Length  Decimal
-------------  ---------------  --------------  ------  -------
            1  NAME             C ( Character)      32        0
            2  STATE_NAME       C ( Character)      25        0
            3  STATE_FIPS       C ( Character)       2        0
...
           48  AVG_SALE97       N (   Numeric)       7        2

Coordinate system definition: "GEOGCS["GCS_North_American_1983",
DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137,298.257222101]],
PRIMEM["Greenwich",0],UNIT["Degree",0.0174532925199433]]"

Cómo importar un archivo de forma utilizando el enfoque más simple

El comando db2se import_shape de Spatial Extender proporciona una forma fácil de importar archivos de forma. Puede escribir este comando en un archivo de script de SQL, como db2 -tvf import_counties.sql. Listado 3 muestra un ejemplo simple.

Listado 3. Contents of import_counties.sql
erase counties.msg;

!db2se import_shape sample
-fileName         counties.shp
-srsName          nad83_srs_1
-tableSchema      test
-tableName        counties
-spatialColumn    shape
-client           1
-messagesFile     counties.msg
;

!db2se register_spatial_column sample
-tableSchema      test
-tableName        counties
-columnName       shape
-srsName          nad83_srs_1
;

connect to sample;

create index test.countiesidx on test.counties(shape)
extend using db2gse.spatial_index(.5, 2.0, 0);

runstats on table test.counties and indexes all;

select count(*) from test.counties;

describe table test.counties;

Notas:

  1. Los comandos del sistema operativo se pueden incluir en un script de DB2 si tienen un signo de exclamación de cierre como prefijo.
  2. Si existe el archivo de mensajes, se borra con el comando erase counties.msg . La operación import_shape finalizará si el archivo de mensajes ya existe.
  3. La mayoría de los parámetros del comando db2se import_shape son bastante intuitivos. La tabla con el nombre y el esquema especificados se crea con las columnas de atributo que corresponden a los atributos del archivo de forma. Si la tabla ya existe, la operación finalizará. El nombre de la columna espacial es arbitrario pero habitualmente se utiliza el nombre shape (forma).
  4. El parámetro -client 1 es importante. Este comando ejecuta la operación de importación en el cliente de DB2 y permite el acceso local al archivo de importación. Si el parámetro se define como -client 0, la operación de importación se ejecutará en el servidor y es necesario que la especificación del archivo sea una ubicación en el servidor que se encuentra disponible para el servidor DB2.
  5. El comando db2se register_spatial_column crea una limitación por medio de la cual todos los valores espaciales utilizan SRS nad83_srs_1. También crea una entrada en la vista db2gse.st_geometry_columns que asocia este SRS con esta columna espacial. Esto es útil y, en ocasiones, es necesario para algunas aplicaciones de visualización.
  6. El código connect to sample logra la conexión con la base de datos de muestra.
  7. Un índice espacial se crea con el comando create index y con valores razonables. Los índices espaciales se discuten más adelante en otra sección.
  8. El comando runstats actualiza las estadísticas de la tabla, lo cual es siempre una buena idea después de realizar una carga o de llevar a cabo actualizaciones significativas.
  9. El comando select count(*) le permite obtener información sobre la cantidad de filas que se importaron.
  10. El comando describe table lo ayuda a obtener información sobre las columnas creadas de la tabla.

Cómo importar un archivo de forma utilizando un ejemplo un poco más complejo

En ocasiones, es necesario implementar más flexibilidad en el proceso de importación. En particular, es posible que usted desee importar en columnas de tipos de datos diferentes pero compatibles, seleccionar un subconjunto de columnas para importar o utilizar nombres de columnas diferentes de los nombres del atributo del archivo de forma. Listado 4 ilustra estas capacidades.

Listado 4. Contenidos de import_counties2.sql
!erase counties.msg;
connect to sample;

drop table test.counties;

create table test.counties(
   county_name    varchar(32)
  ,state_name     varchar(25)
  ,state_fips     varchar(2)
  ,county_fips    varchar(3)
  ,area           double
  ,population2000 integer
  ,shape          db2gse.st_multipolygon
  )
  ;

!db2se import_shape sample
-fileName         counties.shp
-inputAttrColumns N(name,state_name,state_fips,cnty_fips,area,pop2000)
-srsName          nad83_srs_1
-tableSchema      test
-tableName        counties
-tableAttrColumns county_name,state_name,state_fips,county_fips,area,population2000
-createTableFlag  0
-spatialColumn    shape
-typeSchema       db2gse
-typeName         st_multipolygon
-messagesFile     counties.msg
-client 1
;

!db2se register_spatial_column sample
-tableSchema      test
-tableName        counties
-columnName       shape
-srsName          nad83_srs_1
;

create index test.countiesidx on test.counties(shape)
extend using db2gse.spatial_index(.5, 2.0, 0);

runstats on table test.counties and indexes all;

select count(*) from test.counties;

describe table test.counties;

Notas:

  1. La tabla se crea con las columnas, los tipos de datos y los nombres de columnas que desee.
  2. El parámetro -inputAttrColumns especifica los nombres de los atributos en el archivo de forma que se importará.
  3. El parámetro -tableAttrColumns especifica los nombres de las columnas de la tabla en las cuales se importan los datos. Tenga en cuenta que los nombres -inputAttrColumns y -tableAttrColumns son diferentes.
  4. El parámetro -createTableFlag indica que la tabla ya existe y no es necesario crearla.
  5. Los parámetros -typeSchema y -typeName especifican el tipo de la columna espacial. Una de las peculiaridades del formato de archivo de forma es que este no especifica si el tipo espacial es una colección (múltiple), entonces, import_shape se establece de manera predeterminada como tipo múltiple. En el caso del ejemplo, especificar el tipo múltiple no es necesario, ya que los polígonos de condados son, en realidad, Multipolígonos. Sin embargo, para algunas aplicaciones, los datos que se importarán no son un tipo múltiple y usted puede importarlos en una columna que no sea múltiple.

Cómo crear una tabla espacial a partir de coordenadas de punto

Cómo comprender las ubicaciones de puntos

Muchos de los datos espaciales importantes en el análisis se basan en ubicaciones de puntos, incluido lo siguiente:

  • Ubicaciones de las viviendas de los clientes
  • Ubicación móvil del cliente
  • Ubicaciones de tiendas
  • Ubicaciones de servicios
  • Ubicaciones de torres celulares
  • Hospitales

La representación más común de ubicaciones de puntos utiliza grados de latitud y longitud, los cuales derivan de un proceso de codificación geográfica , desde un GPSo posiblemente desde coordenadas en un mapa. La codificación geográfica es el proceso mediante el cual se convierte la dirección de una calle en un valor de latitud y longitud. Generalmente, es un software especializado el que realiza este proceso utilizando un amplio conjunto de datos de direcciones o de segmentos de calles. Con frecuencia, esto se lleva a cabo en lotes para poder administrar gran cantidad de direcciones; de todos modos, también es habitual que un servicio web realice este proceso para lograr una codificación geográfica de una dirección ingresada por un usuario. Muchas empresas ya tienen este software instalado y cuentan con ubicaciones en un archivo o en columnas de bases de datos. Consulte Recursos para acceder a un artículo de developerWorks con más detalles sobre la codificación geográfica con DB2 Spatial Extender.

Cómo cargar y mantener valores espaciales

Esta sección del tutorial analiza la carga y el mantenimiento de valores espaciales en una tabla, y asume que la latitud y la longitud ya se encuentran disponibles. Este ejemplo aborda la administración de una tabla de ubicaciones de hospitales.

Consulte Descargas para descargar los datos y los scripts SQL utilizados en esta sección.

Cómo importar y crear desde un archivo

Listado 5 muestra un ejemplo que usted puede ejecutar con el comando db2 -tvf create_hospitals.sql

Listado 5. Contenidos de create_hospitals.sql
drop table test.hospitals;

create table test.hospitals(name varchar(70), longitude double, latitude double);

import from "hospitals.csv" of del
modified by coldel, decpt.
method p (1, 2, 3)
messages "import.msg"
insert into test.hospitals (name, longitude, latitude);

alter table test.hospitals add column location db2gse.st_point;

!db2se register_spatial_column sample
-tableSchema      test
-tableName        hospitals
-columnName       location
-srsName          nad83_srs_1
;

update test.hospitals
set location = db2gse.st_point(longitude, latitude,1)
;

reorg table test.hospitals;

create index test.hospitalsidx on test.hospitals(location)
extend using db2gse.spatial_index(.1, 0, 0);

runstats on table test.hospitals and indexes all;

select count(*) from test.hospitals;

select
  substr(name, 1, 25) as name
 ,decimal(longitude, 8, 4) as longitude
 ,decimal(latitude, 8, 4) as latitude
 ,varchar(db2gse.st_astext(location), 30) as location_wkt
from test.hospitals
 where name like 'New York%'
 ;

Notas:

  1. Coloque la tabla en caso de que ya exista. Haga esto solo a modo de prueba.
  2. La tabla "hospital" se crea con columnas para el nombre, la longitud y la latitud.
  3. La utilidad import (importar) de DBS se utiliza para completar la tabla a partir de un archivo con campos delimitados con los datos para el nombre, la longitud y la latitud.
  4. La tabla se modifica para agregar una columna de tipo. db2gse.ST_Point. Si la tabla ya existiera con la latitud y la longitud, los pasos anteriores se hubiesen omitido.
  5. El comando db2se register_spatial_column crea una limitación por medio de la cual todos los valores espaciales utilizan SRS nad83_srs_1. También crea una entrada en la vista db2gse.st_geometry_columns que asocia este SRS con esta columna espacial.
  6. El trabajo de crear el valor espacial se realiza de manera muy sencilla con un argumento update SQL, el cual establece la columna de ubicación para el resultado del constructor ST_Point que acepta valores de longitud, latitud y srid. Es importante tener en cuenta que el valor de longitud es lo primero, a diferencia del orden que usted comúnmente ve. El valor srid 1 indica que se debe utilizar el sistema de referencia espacial para NAD83.
  7. La utilidad reorg de DB2 se invoca a medida que el proceso de actualización de la columna de ubicación aumenta el tamaño de la fila y, probablemente, provocará que se exceda el tamaño de la página.
  8. Un índice espacial se crea con valores razonables.
  9. El comando runstats se ejecuta para actualizar las estadísticas de la tabla. Siempre es aconsejable hacer esto después de cargar datos o después de llevar a cabo actualizaciones de datos significativas.
  10. Se requiere la cantidad de filas y están seleccionadas algunas filas para los hospitales de Nueva York. La función espacial db2gse.ST_AsText se utiliza para devolver una representación legible del valor espacial.

Cómo mantener valores espaciales

Es muy probable que una tabla de ubicaciones tenga actualizaciones, y es importante asegurarse de que los valores espaciales estén establecidos o actualizados de manera adecuada a medida que las filas se inserten o actualicen. El mecanismo SQL para llevar esto a cabo es establecer desencadenantes en la tabla cuando los valores de latitud o longitud se modifican.

Listado 6 muestra un ejemplo de cómo crear desencadenantes y cómo evaluar las consecuencias.

Listado 6. Contenidos de create_hospitals_triggers.sql
create trigger test.hosp_loc_update no cascade
before update of latitude, longitude
on test.hospitals
referencing  new as n
for each row mode db2sql
set n.location = db2gse.st_point(n.longitude, n.latitude, 1)
;

create trigger test.hosp_loc_insert no cascade
before insert
on test.hospitals
referencing new as n
for each row mode db2sql
set n.location = db2gse.st_point(n.longitude, n.latitude, 1)
;

select
  substr(name, 1, 25) as name
 ,decimal(longitude, 8, 4) as longitude
 ,decimal(latitude, 8, 4) as latitude
 ,varchar(db2gse.st_astext(location), 30) as location_wkt
from test.hospitals
 where name like 'New York%'
 ;

insert into test.hospitals(name, longitude, latitude)
values('New York2', -76.5, -42.3)
;

update test.hospitals
set (longitude, latitude) = (-76.5, -42.3)
where name = 'New York Hospital'
;

select
  substr(name, 1, 25) as name
 ,decimal(longitude, 8, 4) as longitude
 ,decimal(latitude, 8, 4) as latitude
 ,varchar(db2gse.st_astext(location), 30) as location_wkt
from test.hospitals
 where name like 'New York%'
 ;

Notas:

  1. Se crean dos desencadenantes separados pero muy similares: uno para actualizar y otro para insertar. Antes de que los datos de la fila se inserten o actualicen, se invoca el constructor espacial para devolver el valor ST_Point, el cual se almacenará en la columna de ubicación.
  2. Para ver el efecto de los desencadenantes, se seleccionan las filas que se modificarán, tal como se muestra en Listado 7.
Listado 7. Filas para modificar
NAME                      LONGITUDE  LATITUDE   LOCATION_WKT
------------------------- ---------- ---------- ------------------------------
New York Hospital           -73.9537    40.7645 POINT (-73.953751 40.764542)
New York Hospital           -73.7537    41.0275 POINT (-73.753746 41.027599)
New York State Hospital     -73.9517    41.5273 POINT (-73.951797 41.527317)
  3 record(s) selected.
  1. Se inserta una nueva fila y se actualizan las filas para Hospital en Nueva York. Puede ver los valores de ubicación actualizados, tal como se muestra en Listado 8.
Listado 8. Valores de ubicación actualizados
NAME                      LONGITUDE  LATITUDE   LOCATION_WKT
------------------------- ---------- ---------- ------------------------------
New York Hospital           -76.5000   -42.3000 POINT (-76.500000 -42.300000)
New York Hospital           -76.5000   -42.3000 POINT (-76.500000 -42.300000)
New York State Hospital     -73.9517    41.5273 POINT (-73.951797 41.527317)
New York2                   -76.5000   -42.3000 POINT (-76.500000 -42.300000)
  4 record(s) selected.
  1. Para una mejor legibilidad, se selecciona la primera parte del nombre; la longitud y la latitud se convierten en valores decimales y la columna de ubicación se convierte en una representación de texto (wkt) conocido.

Cómo trabajar con índices espaciales

En la mayoría de las aplicaciones de bases de datos es importante definir los índices en columnas para evitar tener que controlar todas las filas de una tabla y verificar cada fila para determinar si cumple con los criterios de una consulta. Esto es muy importante para las consultas espaciales, ya que la verificación espacial es más compleja que la verificación de valores numéricos o caracteres simples.

En una base de datos relacionales, generalmente, se crea un índice según los valores en una columna donde hay una secuencia lineal simple de valores que van de menor a mayor. Esto permite que se cree un índice de árbol binario o B-tree , lo que permite que la base de datos navegue rápidamente a un determinado valor o rango secuencial de valores.

Los datos espaciales son, intrínsecamente, bidimensionales (o mayores), lo cual no se aplica directamente a un índice B-tree, lo que ha dado lugar a diferentes técnicas. El enfoque utilizado en Spatial Extender es un grid index(índice de grilla), que asocia valores espaciales con una cuadrícula. Los valores espaciales de línea y polígono pueden atravesar más de una celda de la grilla, mientras que un valor espacial de punto puede atravesar, como máximo, una celda de la grilla. Al definir los tamaños de las celdas de la grilla, se debe establecer un equilibrio entre la necesidad de minimizar la cantidad de celdas que atraviesan un valor espacial y la necesidad de minimizar la cantidad de valores espaciales en una celda de la grilla. Para poder administrar de manera eficiente los valores espaciales con tamaños muy diferentes, se pueden especificar hasta tres tamaños de celda en la grilla. Luego, Spatial Extender indexa las celdas de la grilla con el índice B-tree de DB2.

Un índice espacial se crea con el comando create index de DB2 con una cláusula adicional extend using , tal como se muestra en Listado 9.

Listado 9. Cómo utilizar el comando create index (crear índice)
create index test.countiesidx on test.counties(shape)
extend using db2gse.spatial_index(1.2, 3.0, 14.0);

Las unidades para especificar los tamaños de las celdas de la grilla son las mismas unidades del sistema de coordenadas, las cuales son grados de latitud y longitud para los datos de los condados. Como es de esperar, los condados tienen diferentes tamaños, por lo tanto, tiene sentido especificar los diferentes tamaños de celdas en la grilla que se adapten mejor a los diferentes tamaños de los condados.

Un grado de latitud equivale a aproximadamente 70 millas o 110 kilómetros. Un grado de longitud varía de aproximadamente 70 millas en el ecuador a alrededor de 45 millas o 72 kilómetros, a 50° de latitud.

Cómo determinar los tamaños de las celdas de la grilla del índice espacial

Determinar un tamaño óptimo para las celdas de la grilla quizás no sea tan obvio. En general, para valores espaciales de polígonos y líneas, el tamaño de la celda de la grilla debe ser un poco mayor que el tamaño promedio de un polígono o una línea. Para los valores espaciales de punto, el tamaño de la celda de la grilla debe ser aproximadamente 1/10 del ancho de una región de consulta típica.

Para poder simplificar esta determinación, se proporcionan dos herramientas que analizan los valores espaciales en una tabla y ofrecen los tamaños recomendados para las celdas de la grilla al momento de crear el índice. No se preocupe por hacer todo con exactitud; el desempeño será bueno para una variación suficientemente amplia en los parámetros del índice.

Cómo utilizar la herramienta gseidx index advisor

La línea de comandos gseidx se proporciona con la instalación de Spatial Extender y se encuentra disponible en todas las plataformas soportadas. Se ofrece información importante sobre los índices espaciales y los detalles sobre gseidx en el centro de información de DB2, en la sección Cómo utilizar índices y vistas para acceder a datos espaciales.

Listado 10 muestra un ejemplo simple sobre cómo utilizar gseidx.

Listado 10. Contenidos de advise_counties.sql
!gseidx "connect to sample
  get geometry statistics
  for column test.counties(shape)
  advise";

Este comando se puede ejecutar utilizando el comando db2 -tvf advise_counties.sql y dará el resultado que se muestra en Listado 11.

Listado 11. Resultado del comando db2 -tvf advise_counties.sql
Number of Rows: 3141
Number of non-empty Geometries: 3141
Number of empty Geometries: 0
Number of null values: 0

Extent covered by data:
    Minimum X: -178.217598
    Maximum X: -66.969271
    Minimum Y: 18.921786
    Maximum Y: 71.406235

Query Window Size:     Suggested Grid Sizes:           Index Entry Cost:
--------------------   -----------------------------   ----------------------
      0.01:              1.2,         3,        14             4.6
      0.02:              1.2,         3,        14             4.6
      0.05:              1.2,         3,        14             4.7
       0.1:              1.2,         3,        14             4.9
       0.2:              1.2,         3,        14             5.3
       0.5:              1.2,         3,        14             6.6
         1:              1.2,         3,        14             9.3
         2:              1.2,         3,        14              16
         5:              1.8,       3.6,        13              49
        10:              2.9,       8.7,        26             130
        20:              4.6,        14,        49             390
        50:               12,        72,         0            1700

Las primeras dos secciones de Listado 11 proporcionan estadísticas sobre los datos espaciales que se analizaron. Las tres columnas del medio de la última sección proporcionan sugerencias sobre los tamaños de la grilla para utilizar al crear un índice espacial.

La primera columna contiene valores que corresponden a los tamaños típicos para la ventana de consulta. En el caso de una aplicación que se muestra en un mapa, este sería el ancho típico de la región que se mostraría. Por ejemplo, si lo más común fuera que un usuario mostrara un mapa de 10 millas en sentido horizontal, esto correspondería a casi 0,25°. Al observar la tabla, puede ver que los tamaños sugeridos para la grilla son los mismos que los tamaños de la ventana de consulta de 0,2 y 0,5°; por lo tanto, usted podría usar (1.2, 3, 14) para crear el índice.

La última columna no es muy importante. Es un valor estimativo de la cantidad de entradas del índice que se podrían hacer para satisfacer una consulta.

Java index advisor

También puede descargar del sitio web de Spatial Extender un index advisor basado en Java. Esta herramienta ofrece una interfaz de usuario para seleccionar una tabla y columna espaciales para analizar. Consulte Recursos para saber dónde puede obtener esta herramienta.

Un ejemplo de la interfaz de usuario para la herramienta Java index advisor se muestra en Figura 1.

Figura 1. Interfaz de usuario de Java index advisor
Interfaz de usuario de Java index advisor

El algoritmo que se utiliza en este index advisor es diferente de la herramienta gseidx y, como resultado, tiene diferentes recomendaciones. Sin embargo, los valores sugeridos también deberían funcionar. El valor cost (costo) es la cantidad estimada de páginas de índice a las que se haría referencia, y no es la cantidad de entradas del índice que informa la herramienta gseidx.


Cómo explorar problemas comunes y consejos

Cómo simplificar la sintaxis de la función espacial

Todas las funciones espaciales se definen en el esquema db2gse, el cual debe contar con el prefijo del nombre de la función para que DB2 pueda identificarlo correctamente. Existen dos maneras de simplificar la sintaxis espacial.

Cómo verificar db2gse

La primera manera de simplificar la sintaxis espacial es indicarle a DB2 asuma que verifique el esquema db2gse al resolver funciones. Esto es posible mediante la utilización del argumento set current function path antes de ejecutar consultas que involucran funciones espaciales. Esto le permite eliminar el nombre del esquema en los llamados de función. Listado 12 muestra un ejemplo.

Listado 12. Establecimiento del argumento de la ruta de función actual
set current function path = current function path, db2gse;
select
   substr(name, 1, 25) as name
  ,st_distance(location,st_point(-74.237449, 42.036976,1), 'STATUTE MILE') as distance
from test.hospitals
where st_distance(location,st_point(-74.237449, 42.036976,1), 'STATUTE MILE') < 25.0

NAME                      DISTANCE
------------------------- ------------------------
Adventist Home              +2.42936545898570E+001
Greene County Memorial Ho   +2.27887983783443E+001
  2 record(s) selected.

Cómo utilizar la notación method (método)

La segunda manera de simplificar la sintaxis espacial es utilizar la notación method , la cual es compatible con DB2 LUW, pero no es compatible con los demás productos de bases de datos espaciales de IBM. Al utilizar la notación method, usted especifica el nombre de la función espacial después del valor espacial, tal como se muestra en Listado 13.

Listado 13. Cómo utilizar la notación method (método)
set current function path = current function path, db2gse;
select
   substr(name, 1, 25) as name
  ,location..st_distance(st_point(-74.237449, 42.036976,1), 'STATUTE MILE') as distance
from test.hospitals
where st_distance(location,st_point(-74.237449, 42.036976,1), 'STATUTE MILE') < 25.0

NAME                      DISTANCE
------------------------- ------------------------
Adventist Home              +2.42936545898570E+001
Greene County Memorial Ho   +2.27887983783443E+001
  2 record(s) selected.

En las siguientes secciones, los ejemplos no especifican el esquema, ya que se asume que la ruta de función se estableció previamente.

Cómo ordenar coordenadas

Al trabajar con coordenadas utilizando latitud y longitud, la longitud corresponde a "x" y la latitud corresponde a "y". Cuando se informan coordenadas de ubicación o se utiliza un dispositivo como un GPS, generalmente, las coordenadas están en el orden latitud, longitud; por lo tanto, es un error muy común del usuario especificar las coordenadas en el orden inverso al trabajar con latitud y longitud.

Por ejemplo, para encontrar hospitales dentro de un radio de 20 millas o 32 kilómetros de Woodstock, NY (latitud 42.036976, longitud -74.237449), la consulta se escribiría como es muestra en Listado 14.

Listado 14. Ejemplo de coordenada
select name
from test.hospitals
where st_distance(location,st_point(-74.237449, 42.036976,1), 'STATUTE MILE') < 25.0

Cómo trabajar con well-known text (texto conocido)

Spatial Extender soporta la representación de texto conocido (well-known text, WKT) de valores espaciales utilizados como constantes en consultas espaciales. La representación WKT es una especificación internacional creada por Open Geospatial Consortium. Consulte la sección espacial del centro de información de DB2 (consulte Recursos) para obtener detalles sobre WKT soportado en Spatial Extender.

Al utilizar WKT, la consulta de muestra en Listado 14 se podría escribir como se muestra en Listado 15.

Listado 15. Ejemplo de coordenada en WKT
select name
from test.hospitals
where st_distance(location,st_point('POINT (-74.237449 42.036976)',1), 'STATUTE MILE')
      < 25.0

Tenga en cuenta que las coordenadas están separadas por un espacio en lugar de una coma, como lo habitual.

WKT también se puede utilizar para representar valores espaciales de polígono y línea. Es importante tener en cuenta que los valores que definen un par de coordenadas están separados por un espacio y los pares de coordenadas están separados por una coma. Además, al definir valores de polígono, se incluyen paréntesis dobles al comienzo y al final de la lista de coordenadas que definen el polígono, tal como se muestra en Listado 16.

Listado 16. Cómo definir valores de polígono
select name
from test.hospitals
where st_within(location,st_polygon(
'POLYGON ((-74.1 42.0, -74.1 42.1, -74.0 42.1, -74.0 42.0, -74.1 42.0))',1)) = 1

Cómo seleccionar valores espaciales

Habitualmente, se utilizan valores espaciales en una consulta pero no es necesario que se los devuelva al usuario o a la aplicación como parte del conjunto de resultados, como en el ejemplo anterior. Si ejecuta una consulta como select * from test.hospitals o select location from test.hospitals, es probable que vea una larga cadena hexadecimal que no tiene mucho sentido, ya que es la representación interna comprimida de los datos espaciales. Si desea ver las coordenadas de manera legible, debe usar la función ST_AsText para volver el valor espacial a la representación WKT. Es una buena idea restringir la extensión de los datos de caracteres devueltos con las funciones SUBSTR o VARCHAR SQL, tal como se muestra en Listado 17.

Listado 17. Cómo utilizar la función st_astext
select
   substr(name, 1, 25) as name
  ,varchar(st_astext(location), 30) as location
from test.hospitals
where st_distance(location,st_point(-74.237449, 42.036976,1), 'STATUTE MILE') < 25.0

NAME                      LOCATION
------------------------- ------------------------------
Adventist Home            POINT (-73.785400 42.139526)
Greene County Memorial Ho POINT (-73.878181 42.230648)
  2 record(s) selected.

Otro formato legible es Geography Markup Language (GML), el cual es una representación XML para valores espaciales definido por Open Geospatial Consortium. Puede seleccionar valores espaciales en este formato utilizando la función ST_AsGML , tal como se muestra en Listado 18.

Listado 18. Cómo utilizar la función st_asgml
select
   substr(name, 1, 25) as name
  ,varchar(st_asgml(location), 90) as location
from test.hospitals
where st_distance(location,st_point(-74.237449, 42.036976,1), 'STATUTE MILE') < 25.0

NAME                      LOCATION
------------------------- ----------------------------------------
Adventist Home            <gml:Point srsName="EPSG:4269"><gml:pos>
                          -73.785400 42.139526</gml:pos></gml:Point>

Greene County Memorial Ho <gml:Point srsName="EPSG:4269"><gml:pos>
                          -73.878181 42.230648</gml:pos></gml:Point>
  2 record(s) selected.

Al trabajar con aplicaciones de mapas web y mostrar marcadores de objetos de punto en la base de datos, por lo general, es útil seleccionar las coordenadas como "x" e "y" (o, lo más probable, longitud y latitud). Esto se lleva a cabo con facilidad con las funciones ST_X y ST_Y , tal como se muestra en Listado 19.

Listado 19. Cómo utilizar las funciones st_x y st_y
select
   substr(name, 1, 25) as name
  ,st_x(location) as longitude
  ,st_y(location) as latitude
from test.hospitals
where st_distance(location,st_point(-74.237449, 42.036976,1), 'STATUTE MILE') < 25.0

NAME                      LONGITUDE                LATITUDE
------------------------- ------------------------ ------------------------
Adventist Home              -7.37854000000000E+001   +4.21395260000000E+001
Greene County Memorial Ho   -7.38781810000000E+001   +4.22306480000000E+001
  2 record(s) selected.

Al tratar con un valor espacial

Cierto número de funciones espaciales que pueden crear diferentes tipos de valores espaciales se documentan a medida que se devuelve el tipo genérico ST_Geometry. Si luego intenta utilizar una función espacial que es válida solo para un tipo espacial específico, surgirá un error, tal como se muestra en Listado 20.

Listado 20. Mensaje de error para tipo espacial incompatible
The invocation of routine "ST_PERIMETER" is ambiguous. The argument in position "1"
does not have a best fit.. SQLCODE=-245, SQLSTATE=428F5, DRIVER=3.62.80

Por ejemplo, el código en Listado 21 devuelve este error debido a que la función st_buffer tiene un tipo de retorno de st_geometry, a pesar de que el resultado real sea del tipo st_polygon.

Listado 21. Ejemplo de código utilizando un tipo espacial incompatible
 select
  name
 ,st_perimeter(st_buffer(location, .1)) as perimeter
from test.hospitals
where name like 'New York%'

Esto se puede resolver al informar a DB2 que debería tratar el resultado como st_polygon, tal como se muestra en Listado 22.

Listado 22. Cómo utilizar la función treat
select
  name
 ,st_perimeter(TREAT(st_buffer(location, .1) as db2gse.st_polygon))
  as perimeter
from test.hospitals
where name like 'New York%'

El código se ejecuta sin error y devuelve el resultado que se muestra en Listado 23.

Listado 23. Resultado del uso de la función treat
NAME                    PERIMETER
----------------------- ------------------------
New York Hospital         +6.28206837256265E-001
New York Hospital         +6.28206837256265E-001
New York State Hospital   +6.28206837256265E-001
  3 record(s) selected.

Cómo ejecutar consultas espaciales

Debido a que las consultas espaciales son iguales a cualquier otra consulta de SQL, cualquier entorno que se utilice para ejecutar las consultas de SQL se puede utilizar para ejecutar las consultas que incluyen operaciones espaciales. En las secciones anteriores, las consultas espaciales se ejecutaron con el procesador de líneas de comandos DB2 al consultar un archivo de argumentos SQL. Esta sección analiza algunos de los demás entornos para ejecutar consultas espaciales, incluido IBM Data Studio, aplicaciones de lenguaje Java y aplicaciones de lenguaje C.

Cómo trabajar con IBM Data Studio

IBM Data Studio es un entorno gratuito basado en Eclipse en el cual se pueden desarrollar y probar aplicaciones de bases de datos. Data Studio reemplaza a DB2 Control Center, el cual no se utiliza y ya no se encuentra disponible con la versión 10 de DB2. Consulte Recursos para obtener información sobre la descarga y configuración de Data Studio.

El cliente completo de IBM Data Studio le permite ejecutar los comandos de SQL y desarrollar programas en Java. Se recomienda el cliente completo para las siguientes secciones de este tutorial.

Cuando haya instalado IBM Data Studio y lo haya abierto, siga los siguientes pasos para configurar un entorno y ejecutar las consultas.

  1. Haga clic en File > New > Data Development Project.
  2. Especifique un nombre para su proyecto, como SpatialProject.
  3. Seleccione una base de datos para conectarse.
  4. Adjunte DB2GSE a la ruta predeterminada y haga clic en Finish.
  5. Haga clic derecho en el nombre de su proyecto, en el panel de la izquierda y seleccione New SQL o XQuery Script.
  6. Póngale un nombre a su proyecto, como query_hospital_counties y haga clic en Finish.
  7. Pegue el código en Listado 24 en el área de entrada de script.
Listado 24. Código para el área de entrada de script
SELECT h.name, st_astext(h.location)
FROM test.hospitals AS h, test.counties AS c
WHERE st_within(h.location, c.shape) = 1
AND c.state_name = 'New York'
AND c.county_name = 'Greene';
  1. Presione Ctrl+S para guardar el script.
  2. Presione F5 para ejecutar la consulta. La consulta se ejecuta y presenta una pantalla, tal como se muestra en Figura 2. Haga clic en la pestaña Result1 para ver sus resultados reales.
Figura 2. Consulta en Data Studio sobre hospitales en el condado
Consulta en Data Studio sobre hospitales en el condado

Haga clic para ampliar la imagen

Figura 2. Consulta en Data Studio sobre hospitales en el condado

Consulta en Data Studio sobre hospitales en el condado

Repita los pasos para la consulta de SQL sobre la distancia que se muestran en Listado 25.

Listado 25. Consulta en SQL sobre la distancia
select
  name
 ,st_astext(location) as location_wkt
 ,st_distance(location, st_point(-74.237449, 42.036976, 1), 'STATUTE MILE') as distance
from test.hospitals
where st_distance(location, st_point(-74.237449, 42.036976, 1), 'STATUTE MILE') < 25.0
order by distance

La consulta se ejecuta y presenta una pantalla, tal como se muestra en Figura 3.

Figura 3. Consulta en Data Studio sobre la distancia hasta hospitales
Consulta en Data Studio sobre la distancia hasta hospitales

Cómo trabajar con la interfaz JDBC en aplicaciones Java

Esta sección describe cómo ejecutar consultas espaciales utilizando JDBC en el entorno de Data Studio. Si tiene JAVA SDK instalado, el programa JDBC de muestra disponible en Descargas también se puede compilar con facilidad y ejecutar en un entorno de línea de comandos.

Complete los siguientes pasos para crear un proyecto de desarrollo Java en Data Studio y ejecute las mismas consultas que ejecutó como scripts SQL.

  1. Haga clic en File > New > Java Development Project.
  2. Especifique un nombre para su proyecto, como SpatialJDBCProject y haga clic en Next.
  3. En la ventana Java Settings, haga clic en la pestaña Libraries .
  4. Haga clic en el botón Add External JARs y navegue por el directorio sqllib\java en su instalación DB2.
  5. Seleccione los archivos db2jcc.jar y db2jcc_license_cu.jar , y haga clic en Finish.
  6. Haga clic derecho en el nodo src debajo de su nuevo proyecto, y haga clic en New > Class.
  7. Especifique JDBCSpatialQuery como el nombre de su clase y haga clic en Finish.
  8. Abra el programa Java de muestra desde Descargas en un editor de texto, copie todo el texto y reemplace la definición de clase mínima en la ventana editor de Data Studio.
  9. Haga clic en Ctrl+S para guardar el archivo.
  10. Si no está utilizando la base de datos de MUESTRA, modifique el código fuente para sustituir el nombre de su base de datos y guarde el archivo.
  11. Haga clic derecho en la ventana editor y seleccione Run As > Java Application. Figura 4 muestra la ventana console en el panel de la parte inferior.
Figura 4. Consulta JDBC en Data Studio
Consulta JDBC en Data Studio

Explicación de la aplicación

La función estática main simplemente crea una conexión con la base de datos de MUESTRA utilizando la autorización de usuario actual de manera predeterminada, o según la identificación y contraseña especificadas por el usuario, siempre que se proporcionen como parámetros. Se crea una instancia de la clase y, luego, cada uno de los métodos de la instancia para realizar consultas se invoca con la conexión a la base de datos y los parámetros adecuados.

Función hospitalInCounty1

Esta sección describe el enfoque más simple, aunque no el más eficiente. La consulta de SQL se crea de la misma manera que la consulta ejecutada anteriormente en el tutorial, en el editor de script Data Studio, al sustituir en la cadena de caracteres los valores del parámetro de nombres del condado y del estado como constantes. Se crea un objeto statement de Java y, luego, la consulta de SQL se pasa al método executeQuery . Luego, se configura un bucle para leer cada fila del conjunto de resultados, y se obtienen el nombre y la ubicación como cadenas de texto, las cuales se envían a la consola. Cuando esto se completa, el conjunto de resultados y el argumento se cierran. Listado 26 muestra un ejemplo.

Listado 26. Ejemplo con constantes
 void hospitalInCounty1(Connection con, String stateName, String countyName)
                        throws SQLException {
                Statement stmt;
                ResultSet rs;
                // Query hospitals that are within the specified state and county
                String sel1 = "SELECT h.name, db2gse.st_astext(h.location) "
                                + "FROM test.hospitals AS h, test.counties AS c "
                                + "WHERE db2gse.st_within(h.location, c.shape) = 1 "
                                + "AND c.state_name = '" + stateName + "' "
                                + "AND c.county_name = '" + countyName + "' ";

                System.out.println("\n\nQuery hospitals in " + countyName + ", "
                                + stateName);
                stmt = con.createStatement();
                rs = stmt.executeQuery(sel1);

                // display the result set
                // rs.next() returns false when there are no more rows
                while (rs.next()) {
                        String name1 = rs.getString(1);
                        String location = rs.getString(2);
                        System.out.println("Hospital name: '" + name1 + "'; location: "
                                        + location);
                }
                rs.close();
                stmt.close();
        }

Función hospitalInCounty2

Esta función es similar a Listado 26pero utiliza marcadores de parámetros, en lugar de constantes, para los parámetros. Esto es muy importante si se ejecutarán argumentos SQL de manera reiterada, ya que DB2 copiará en caché los argumentos SQL compilados recientemente y volverá a utilizarlos cuando los vea nuevamente, incluso si provienen de una aplicación diferente. Esto puede ser útil cuando múltiples usuarios ejecutan la misma aplicación con valores diferentes.

Para utilizar marcadores de parámetros, coloque un signo de pregunta de cierre (?) en el argumento SQL, en lugar del valor del parámetro real. Se crea un objeto PreparedStatement de Java a partir de la conexión y pasa al argumento SQL. El método setString se invoca liego para configurar los valores del parámetro para los nombres del estado y del condado. El resto de la lógica es la misma.

Si se ejecutará varias veces el mismo argumento SQL dentro de la misma aplicación, entonces sería aún más eficiente guardar el objeto PreparedStatement y volver a utilizarlo al proporcionar nuevos valores del parámetro. Listado 27 muestra un ejemplo.

Listado 27. Ejemplo con signos de pregunta en lugar de valores de parámetro
void hospitalInCounty2(Connection con, String stateName, String countyName)
                        throws SQLException {
                PreparedStatement pstmt;
                ResultSet rs;
                // Query hospitals that are within the specified state and county
                String sel1 = "SELECT h.name, db2gse.st_astext(h.location) "
                                + "FROM test.hospitals AS h, test.counties AS c "
                                + "WHERE db2gse.st_within(h.location, c.shape) = 1 "
                                + "AND c.state_name = ?" + "AND c.county_name = ? ";

                System.out.println("\n\nQuery hospitals in " + countyName + ", "
                                + stateName);
                pstmt = con.prepareStatement(sel1);
                pstmt.setString(1, stateName); // set state name parameter
                pstmt.setString(2, countyName); // set county name parameter
                rs = pstmt.executeQuery();

                // display the result set
                // rs.next() returns false when there are no more rows
                while (rs.next()) {
                        String name1 = rs.getString(1);
                        String location = rs.getString(2);
                        System.out.println("Hospital name: '" + name1 + "'; location: "
                                        + location);
                }
                rs.close();
                pstmt.close();
        }

Función hospitalDistance

Esta función hospitalDistance implementa la consulta para encontrar hospitales dentro de un radio de 25 millas o 40 kilómetros de la ubicación especificada. El enfoque también utiliza marcadores de parámetros para las coordenadas de la ubicación especificada. Tenga en cuenta la expresión CAST en el argumento SQL. Listado 28 muestra un ejemplo.

Listado 28. Cómo utilizar la función hospitalDistance
String sel2 = "SELECT name, db2gse.st_astext(location), "
            + "db2gse.st_distance(location, db2gse.st_point(CAST (? AS DOUBLE), "
            + "CAST (? AS DOUBLE), 1), 'STATUTE MILE') AS distance "
            + "FROM test.hospitals "
            + "WHERE db2gse.st_distance(location, "
            + "db2gse.st_point(CAST (? AS DOUBLE), CAST (? AS DOUBLE), 1), "
            + "STATUTE MILE')  < 25.0 "
            + "ORDER BY distance";

Para que el constructor de punto sea reconocido de manera adecuada, es necesario convertir explícitamente los parámetros de longitud y latitud a valores DOBLES.

Cómo trabajar con la interfaz CLI en aplicaciones de lenguaje C

La instalación de DB2 Spatial Extender incluye un programa gseRunGseDemo de muestra en el directorio sqllib/samples/extenders/spatial que se puede ejecutar directamente para verificar la instalación espacial mediante la carga de datos espaciales, la ejecución de varios procedimientos espaciales almacenados y la ejecución de consultas espaciales de ejemplo en los datos que fueron cargados. gseRunGseDemo es una aplicación de lenguaje C que utiliza la interfaz DB2 CLI y se proporciona en formato de fuente que usted puede examinar, modificar y compilar en su propio entorno. La aplicación se documenta en la sección espacial del centro de información de DB2, en el tema Cómo escribir aplicaciones y utilizar el programa de muestra (consulte Recursos).

Cómo trabajar con otros lenguajes de aplicaciones

Por lo general, cualquier lenguaje que le permita ejecutar argumentos SQL en DB2 se puede utilizar para ejecutar consultas espaciales. Esto es particularmente útil con lenguajes orientados a la Web, como PHP, Ruby y Perl, los cuales se pueden utilizar junto con las API de mapas web proporcionadas por servicios como Google, Yahoo y ArcGIS Online de Esri.


Conclusión

Este primer tutorial de series presentó las capacidades espaciales de DB2, los enfoques para implementar y crear datos espaciales, y los entornos para ejecutar consultas espaciales. Los próximos tutoriales cubrirán los casos de usos espaciales típicos, las adaptaciones para lograr el mejor desempeño, el trabajo en un entorno de almacenamiento de datos y la utilización de herramientas de visualización.

Reconocimientos

Agradezco a Amyris Rada por su revisión y sugerencias para mejorar este tutorial.


Descargas

DescripciónNombretamaño
Sample SQL scripts and Java code for this tutorialsqlscripts.zip5KB
Sample spatial data for this tutorialsampledata.zip1400KB

Recursos

Aprender

Obtener los productos y tecnologías

  • Descargue DB2 Express-C y DB2 Spatial Extender, las cuales son versiones completamente funcionales y sin cargo de DB2 y DB2 Spatial Extender.
  • Descargue DB2 Spatial Extender, la cual pertenece a una instalación de servidor de DB2 existente. También se encuentran disponibles datos espaciales de muestra en formato de archivo de forma para utilizar con Spatial Extender.
  • Descargue Geobrowser para DB2 e Informix, los cuales no tienen cargo para usted si los utiliza con cualquier versión de DB2 o Informix con la característica espacial instalada.
  • Descargue IBM Data Studio, que brinda a los desarrolladores y DBAs las capacidades básicas para administrar y desarrollar bases de datos para DB2 e Informix sin cargo.
  • Construya su próximo proyecto de desarrollo con software de prueba IBM, disponible para descarga directamente de developerWorks.

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Information mgmt
ArticleID=827879
ArticleTitle=Administre datos espaciales con IBM DB2 Spatial Extender. Parte 1: Cómo adquirir datos espaciales y desarrollar aplicaciones
publish-date=07312012