Este documento describe cómo realizar consultas espaciales en Oracle Spatial mediante el uso de operadores espaciales, funciones y relaciones topológicas. Explica cómo utilizar SDO_FILTER, SDO_RELATE y los operadores SDO_RELATIONSHIP para consultar datos espaciales, así como la diferencia entre SDO_RELATE y SDO_GEOM.RELATE. También proporciona ejemplos de consultas espaciales comunes.
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Consulta de Datos Espaciales con Oracle Spatial
1. 8 Consulta de Datos
Espaciales
OBJETIVOS
•Explicar el modelo de consulta de Oracle Spatial
•Describir y comparar los operadores espaciales y funciones
•Describir las relaciones topológicas utilizadas por los operadores espaciales y funciones
•Utilizar SDO_FILTER, SDO_RELATE, y EL operador SDO_ <RELATIONSHIP>
•Diferenciar entre el operador SDO_RELATE y la función SDO_GEOM.RELATE
Algunos ejemplos de las consultas típicas de los datos espaciales:
¿Cuál de los millones de caminos en los EE.UU. tienen cierta relación con el estado de
Texas?
¿Que condados están dentro del estado de New Hampshire?
¿Cuál es el total de la población en una zona rectangular de interés?
¿Qué interestatales interactúan con el Condado de Passaic?
¿Qué tipo de relaciones topológica tiene el estado de Nueva Jersey con sus condados?
1 EJEMPLOS DE CONSULTAS ESPACIALES
2. 2 FILTROS PRIMARIOS Y SECUNDARIOS
El filtro primario compara aproximaciones de geometrías, por lo que el resultado no es
exacto.
Las optimizaciones del Interior, se aplican a los candidatos que se pone.
Las comparaciones de geometría son hechas sólo cuando sea necesario.
3 MODELO DE CONSULTA OPTIMIZADA
3. 4 OPERADORES ESPACIALES
Usar un índice espacial para ofrecer un rendimiento óptimo
Requieren un índice espacial la primera geometría especificada en el operador
Debe ser utilizado en la cláusula WHERE de una consulta
Incluye:
SDO_FILTER:
Realiza sólo un filtro primario
SDO_RELATE y SDO_ <RELATIONSHIP>
Realiza un filtro primario y secundario
5 PLANTILLA DE SINTAXIS DE OPERADORES ESPACIALES
SDO_<operator_name>(
<geometry-1>,
<geometry-2> ) = 'TRUE'
Los operadores espaciales siguen una plantilla para su sintaxis.
<geometry-1> es la columna del tipo de SDO_GEOMETRY que se busca. La columna
debe ser espacialmente indexada.
<geometry-2> es la ventana de consulta.
Con los operadores espaciales, especifique siempre TRUE en mayúsculas. No
especifique <> 'false' o = 'true'.
6 FUNCIONES Y PROCEDIMIENTOS ESPACIALES
•No utilice los índices espaciales
•Puede ser utilizado en pequeñas tablas que espacialmente no son indexadas.
•Puede ser utilizado en la lista SELECT o la cláusula WHERE
•Debe estar en el mismo sistema de coordenadas si se requieren dos geometrías
•Puede ser aplicado en el conjunto de resultados de un operador espacial
•Función espacial discutido en esta lección:
SDO_GEOM.RELATE: Para determinar la relación entre dos geometrías sin necesidad
de utilizar un índice espacial
7 OPERADOR SDO_FILTER
SDO_FILTER ( <geometry-1>,<geometry-2> ) = 'TRUE'
4. SDO_FILTER:
•Sólo lleva a cabo la operación filtro primario
•Utiliza el índice espacial para identificar el conjunto de objetos espaciales potencialmente
interactúan con una ventana de consulta
•Debe ser utilizado como una expresión en la cláusula WHERE
Evalúa como True para los pares de aproximación de geometría que actúan recíprocamente
<geometry-1>: Es la búsqueda de la columna
<geometry-2>: Es la ventana de consulta
Buscar todos los condados que interactúan con una zona rectangular. El resultado es aproximado.
Conocer todos los municipios cuya aproximaciones interactúan con un área
rectangular:
SELECT c.county, c.totpop
FROM proj_counties c
WHERE sdo_filter (
c.geom,
sdo_geometry (2003, 32775, null,
sdo_elem_info_array (1,1003,3),
sdo_ordinate_array (1720300,1805461,
1820000, 2210000))
) = 'TRUE';
Nota: Todos los operadores espaciales retornar true o false. Al escribir las consultas
espaciales, siempre prueba con = 'TRUE' nunca, el uso <> 'FALSE' o = 'true'.
5. 8 RELACIONES ESPACIALES CON FILTROS SECUNDARIOS
Para determinar la relación espacial entre dos geometrías, aplicar un filtro secundario.
Las relaciones espaciales se basan principalmente en la topología y la distancia.
Cada objeto espacial tiene un límite, un exterior y un interior.
9 RELACIONES TOPOLÓGICAS ESPACIALES
6. ANYINTERACT:
Devuelve TRUE si las geometrías no son disjuntas
Es una máscara óptima, ya que no tiene que determinar la relación entre geometrías
Sólo determina que las geometrías no son disjuntas
10 OPERADOR SDO_RELATE
SDO_RELATE
( <geometry-1>,
<geometry-2>,
'MASK=<mask>'
) = 'TRUE'
•Realiza tanto filtros primarios como secundarios procesando una consulta
•Utiliza el filtro secundario para garantizar que que sólo los objetos de candidato
que interactúan recíprocamente son seleccionados
•Evalúa como True para las geometrías que tienen la relación topológica
especificada por <mask>
<geometry-1> es la capa que desea buscar.
Debe ser una columna de una tabla
Debe ser del tipo SDO_GEOMETRY
Deben ser indexados
<geometry-2> es la ventana de consulta.
Es una variable o columna de una tabla
Debe ser del tipo SDO_GEOMETRY
<mask> identifica la relación espacial de la prueba.
Algunos valores de palabra clave de máscara válidos son: CONTAINS,
COVERS, ANYINTERACT, ON, TOUCH
Múltiples máscaras son combinadas así: 'INSIDE+COVEREDBY'
Encontrar todos los condados que INSIDE+COVEREDBY del estado de New Hampshire
7. SELECT c.county, c.state_abrv
FROM geod_counties c,
geod_states s
WHERE s.state = 'New Hampshire'
AND sdo_relate (c.geom,
s.geom,
'mask=INSIDE+COVEREDBY')
='TRUE';
Nota: Para un rendimiento óptimo, crear un índice no espacial en GEOD_STATES
(estado).
Encontrar todos los condados vecinos al condado de Passaic en Nueva
Jersey
SELECT c1.county, c1.state_abrv
FROM geod_counties c1,
geod_counties c2
WHERE c2.state = 'New Jersey'
AND c2.county = 'Passaic'
AND sdo_relate (c1.geom,
c2.geom,
'mask=TOUCH')='TRUE';
8. Ejemplo ANYINTERACT de: SDO_RELATE
Buscar todas las ciudades en una zona rectangular:
SELECT c.city, c.pop90
FROM geod_cities c
WHERE sdo_relate (
c.location,
sdo_geometry (2003, 8307, null,
sdo_elem_info_array (1,1003,3),
sdo_ordinate_array (-109,37,-102,40)),
'mask=ANYINTERACT') ='TRUE';
Para las consultas de punto-en-polígono, use la máscara ANYINTERACT si
no le importa devolver los puntos que caen en la frontera;
ANYINTERACT es una operación SDO_RELATE muy rápida.
Debido a GEOD_CITIES contiene sólo datos de puntos, para el
funcionamiento óptimo, el índice debería haber sido creado con
LAYER_GTYPE = PUNTO.
11 RECTÁNGULO OPTIMIZADO GEODÉSICO
•Rectángulos optimizados geodésicos pueden ser representados internamente como un
MultiPolygon.
•El rectángulo R está dentro del primer polígono, no está dentro del segundo
MultiPolygon.
9. 12 USO DE SDO_RELATE CON PL/SQL
Encuentre el total de la población en una zona rectangular:
set serveroutput on;
DECLARE
rectangle sdo_geometry;
total_population number;
BEGIN
rectangle := sdo_geometry (2003, 8307, null,
sdo_elem_info_array (1,1003,3),
sdo_ordinate_array (-109,37,-102,40));
SELECT sum(c.totpop) into total_population
FROM geod_counties c
WHERE sdo_relate (c.geom, rectangle,
'mask=ANYINTERACT') = 'TRUE';
dbms_output.put_line('Population = '||
total_population||'.');
END;
/
13 USO DEL OPTIMIZADOR DE PISTA ORDERED
•Para un rendimiento óptimo, cuando la ventana de consulta proviene de una tabla,
utilice el /* +ordered */ sugerencia de optimizador.
•La pista ORDERED instruye al optimizador para usar índices en tablas en el orden que
se enumeran en la cláusula FROM.
•Lista de la tabla de la primera ventana de la consulta en la cláusula FROM.
•Esto permite a Oracle Optimizer para encontrar la ventana de consulta, y luego buscar
la capa espacial.
Buscar todas las carreteras interestatales que interactúan con un condado:
10. 14 OPERADORES DE RELACIÓN SIMPLIFICADA
Cada valor de máscara de SDO_RELATE tiene su correspondiente operador de
relación simplificada.
El nombre de operador es de la forma SDO _ <la RELACIÓN> donde <la
RELACIÓN> puede ser ANYINTERACT, DENTRO, CUBIERTAS, SE
SUPERPONE, SOBRE, COVEREDBY, etcétera.
<geometry1>: columna de búsqueda
<geometry2>: ventana de consulta
Buscar todos los Condados al rededor del condado Passaic en New
Jersey:
Anteriormente:
15 CONSULTA PARA OBTENER GEOMETRÍAS DISJUNTAS
SDO_<RELATIONSHIP> (<geometry1>, <geometry2>) = 'TRUE'
SELECT /*+ ordered */ a.county
FROM geod_counties b,
geod_counties a
WHERE b.county = 'Passaic'
AND b.state = 'New Jersey'
AND SDO_TOUCH(a.geom,b.geom) = 'TRUE';
. . .
AND SDO_RELATE(a.geom,b.geom,
'MASK=TOUCH') = 'TRUE';
•No hay un operador independiente o relación de máscara para obtener geometrías
disjuntas.
•Para obtener geometrías disjuntas, utiliza la lógica de la siguiente consulta:
•De todas las geometrías, menos las geometrías que tiene interacción.
•Geometrías que no interactúan o son disjuntas se devuelven.
11. SELECT city, state_abrv
FROM geod_cities
MINUS
SELECT /*+ ordered */ c.city, c.state_abrv
FROM geod_states s, geod_cities c
WHERE sdo_anyinteract(c.location,s.geom) = 'TRUE'
AND s.state_abrv='CA';
16 TRANSFORMACIONES DE SISTEMA DE COORDENADA
IMPLÍCITAS
En un operador espacial, la geometría de la ventana de consulta puede ser diferente
del sistema de coordenadas de la capa de la geometría que se busca.
La ventana de consulta, se transforma automáticamente al sistema de coordenadas de
la capa
Buscar todos los condados en el estado de New Hampshire.
El estado de New Hampshire es proyectada en un sistema de coordenadas.
Los condados están en un sistema de coordenadas geodésicas.
s.geom implícitamente transformado al sistema de coordenadas de la capa de c.geom.
SELECT /*+ ordered */ c.county, c.state_abrv
FROM proj_state s,
geod_counties c
WHERE s.state = 'New Hampshire'
AND sdo_inside (c.geom,s.geom)='TRUE';
17 Función SDO_GEOM.RELATE
SDO_GEOM.RELATE
( <geometry-1>, '<mask>', <geometry-2>, <tolerance> )
= '<relationship>'
Se examinan dos objetos de la geometría para determinar su relación espacial
Realiza una consulta exacta (filtro secundario)
Devuelve verdadero o falso para una máscara de ANYINTERACT
Devuelve la relación de igualdad si se utiliza cualquier otra máscara, devuelve FALSE si
la relación especificada en la máscara no existe entre la geometría
12. Determinar la relación del estado de Nueva Jersey a sus condados:
La consulta devuelve:
SELECT c.county,
sdo_geom.relate (s.geom,'determine',c.geom, 0.5)
relationship
FROM geod_states s,
geod_counties c
WHERE s.state = 'New Jersey'
AND s.state = c.state;
COUNTY RELATIONSHIP
------------------------------- --------------
Atlantic COVERS
Cape May COVERS
Cumberland COVERS
Essex CONTAINS
Buscar todos los condados alrededor de Nueva Jersey:.
La función no aprovecha un índice espacial.
Utilice SDO_RELATE (o cualquiera de los operadores SDO_ <RELATIONSHIP>) en su lugar.
SELECT c.county, c.state
FROM geod_states s,
geod_counties c
WHERE s.state = 'New Jersey'
AND sdo_geom.relate(c.geom,'touch',s.geom, 0.5)
='TOUCH';
18 ¿SDO_RELATE o SDO_GEOM.RELATE?
Utilice SDO_RELATE:
En la mayoría de los casos, ya que un índice espacial es más selectivo que cualquier otro
índice
Utilice SDO_GEOM.RELATE:
Cuando un índice no espacial es más selectivo que el índice espacial
Comparando solamente una geometría
13. Considere el siguiente ejemplo:
Datos: La tabla de US_IMAGERY tiene 10 millones de imágenes de satélite.
El índice no espacial sobre el porcentaje CLOUD_COVER
Índice de la longitud de onda no espacial
Índice espacial en GEOM, que es la medida de cada imagen
Consulta: Encuentre todas las imágenes en los Estados Unidos con el porcentaje
CLOUD_COVER = 0 (el día muy claro) y la WAVELENGTH = 400.
¿Qué pasa si la combinación de CLOUD_COVER y predicados WAVELENGTH son mucho
más selectivas que los predicado espaciales?
El predicado espacial devuelve solo cinco millones filas.
Predicados no espacial sola devuelven 15 filas.
Respuesta: Utilice SDO_GEOM.RELATE.
SELECT i.image_id
FROM us_areas a,
us_images i
WHERE i.cloud_cover = 0
AND i.wavelength = 400
AND a.area = 'Eastern US'
AND sdo_geom.relate(i.geom, 'anyinteract', a.geom, 0.5)
='TRUE';