Pregunta

Tengo una base de datos habilitada para operaciones espaciales (DB2, en este caso). Necesito almacenar un gran número de cuadrados en una mesa. ¿Qué tipo de datos estándar SQL espacial es más adecuado?

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 intentado encontrar un ST_rectangle o ST_square tipo, pero que no parecen existir (?)

Mientras estoy trabajando con DB2, también estoy interesado en soluciones que no funcionan en DB2, siempre y cuando se cumpla con los estándares.

¿Fue útil?

Solución

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 un cuadrado

Este código es de

documentación de DB2

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))

Consulte ID = 5? el último POLÍGONO == ST_Envelope (geometría)

Otros consejos

Incluso si los datos representan un rectángulo o cuadrado, todavía se tendrá que utilizar el tipo ST_Polygon. Sin embargo, cuando se realiza una consulta en los datos, se puede utilizar un filtro de primer orden como ST_EnvIntersects .

Normalmente, una base de datos espacial comparará los sobres (es decir un rectángulo que contiene el polígono) para una intersección. A continuación, se realiza la más cara cálculo de la intersección de polígonos a polígono. En este caso, puesto que sus polígonos son iguales a la envoltura, puede omitir el segundo paso más caro.

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

Es posible que se busca ST_Envelope - no sé a ciencia cierta acerca de DB2 pero es parte del estándar OGC. Cualquier línea no vertical o no horizontal, o un polígono, generarán un rectángulo a través de esta función, el almacenamiento de las coordenadas típicamente como flotadores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top