2009-08-17 13 views
5

Tengo una base de datos habilitada espacialmente (DB2, en este caso). Necesito almacenar una gran cantidad de cuadrados en una tabla. ¿Qué tipo de datos de SQL espacial estándar es el más adecuado?SQL espacial: ¿tipo de datos más adecuado para un cuadrado?

Creo que podría utilizar un ST_Polygon, pero tal vez hay un tipo más especializado que daría

  • mejor rendimiento
  • mejores garantías de datos (quiero cogerlo como un error si alguien dónde almacenar un valor que no es cuadrado de la columna en particular)

he tratado de encontrar una ST_rectangle o ST_squar e tipo, pero no parecen existir (?)

Mientras trabajo con DB2, también me interesan las soluciones que no funcionan en DB2, siempre que sean compatibles con los estándares .

Respuesta

1

En DB2 también es un polígono. Parece que está almacenando las redes, por lo que una comprobación rápida podría ser que si ST_Envelope (geometría) == geometría entonces usted tiene una plaza

Este código es de

DB2's documentation

SET CURRENT PATH = CURRENT PATH, db2gse; 
CREATE TABLE sample_geoms (id INTEGER, geometry ST_Geometry); 

INSERT INTO sample_geoms VALUES 
(1, ST_Geometry(ST_Point('point EMPTY',0))); 

INSERT INTO sample_geoms VALUES 
(2, ST_Geometry(ST_Point('point zm (10 10 16 30)' ,0))); 

INSERT INTO sample_geoms VALUES 
(3, ST_Geometry(ST_Multipoint('multipoint m (10 10 5, 50 10 6, 
     10 30 8)' ,0))); 

INSERT INTO sample_geoms VALUES 
(4, ST_Geometry(ST_Linestring('linestring (10 10, 20 10)',0))); 

INSERT INTO sample_geoms VALUES 
(5, ST_Geometry(ST_Polygon('polygon((40 120, 90 120, 90 150, 
     40 150, 40 120))',0))); 


SELECT id, CAST(ST_AsText(ST_Envelope(geometry)) as VARCHAR(160)) Envelope 
FROM sample_geoms; 

Resultados:

ID   ENVELOPE 
----------- --------------------------------------------------------------- 
     1  - 

     2  POLYGON ((9 9, 11 9, 11 11, 9 11, 9 9)) 

     3  POLYGON ((10 10, 50 10, 50 30, 10 30, 10 10)) 

     4  POLYGON ((10 9, 20 9, 20 11, 10 11, 10 9)) 

     5  POLYGON ((40 120, 90 120, 90 150, 40 150, 40 120)) 

See ID = 5? el último POLYGON == ST_ENVELOPE (geometría)

1

Quizás esté buscando ST_Envelope - No estoy seguro acerca de DB2 pero es parte del estándar OGC. Cualquier línea o polígono no vertical o no horizontal generará un rectángulo a través de esta función, almacenando las coordenadas típicamente como flotantes.

+1

Pero ST_envolope es una función, no un tipo, por lo que yo puedo ver? –

+0

Disculpa, he eliminado una gran cantidad de tonterías enrevesadas ahora. Los puntos se almacenan como una secuencia de float4 en Postgis, no está seguro acerca de DB2 pero debe ser más o menos el mismo, o tal vez uno de los tipos de db2/Oracle 'number'. Supongo que todos los rectángulos son simplemente coordenadas almacenadas como un tipo de flotación básica, con la funcionalidad geográfica habilitada a través de la indexación inteligente para consultas espaciales comunes. – unmounted

+1

Troels es correcto. ST_ENVELOPE es una función que devuelve un ST_POLYGON; ST_ENVELOPE no es un tipo. La optimización de "flotación" es específica de PostGIS. –

4

Incluso si sus datos representan un rectángulo o cuadrado, igual necesitará usar el tipo ST_POLYGON. Sin embargo, cuando realiza una consulta con los datos, puede usar filtros de primer orden como ST_EnvIntersects.

Normalmente, una base de datos espacial comparará las envolventes (es decir, un rectángulo que contiene el polígono) para una intersección. Luego realiza el cálculo de intersección de polígono a polígono más caro. En este caso, dado que sus polígonos son iguales a la envolvente, puede omitir el segundo paso más costoso.

En cuanto a la validación de datos, se puede agregar un trigger que comprueba ST_Equals (ST_Envelope (geom), geom) = 1.

Cuestiones relacionadas