Pergunta

Eu tenho um banco de dados ativado espacialmente (DB2, neste caso). Eu preciso armazenar um grande número de quadrados em uma tabela. Que tipo de dados SQL espacial padrão é mais adequado?

Eu acho que eu poderia usar um ST_Polygon , mas talvez haja um tipo mais especializado que daria

  • melhor desempenho
  • melhores garantias de dados (eu quero pegá-lo como um erro se alguém onde armazenar um valor diferente de quadrado na coluna particular)

Eu tentei encontrar um ST_rectangle ou ST_square tipo, mas eles não parecem existir (?)

Enquanto eu estou trabalhando com DB2, eu também estou interessado em soluções que não funcionam em DB2, contanto que eles são compatíveis com padrões.

Foi útil?

Solução

No DB2 é também um polígono. Parece que você está armazenando grades, então uma verificação rápida pode ser que se ST_Envelope (geometria) == geometria, então você tem um quadrado

Este código é de

documentação do 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;

Resultado:

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

Veja ID = 5? o último POLYGON == ST_Envelope (geometria)

Outras dicas

Mesmo que os dados representarem um retângulo ou quadrado, você ainda precisa usar o tipo ST_Polygon. No entanto, quando você executa uma consulta em relação a dados, você pode usar um de primeira ordem filtros, como ST_EnvIntersects .

Normalmente, uma base de dados espacial irá comparar os envelopes (isto é, um rectângulo que contém o polígono) para um cruzamento. Em seguida, ele executa o cálculo intersecção mais caro polígono-to-polígono. Neste caso, uma vez que seus polígonos são iguais ao envelope, você pode pular a etapa de segundo mais caro.

Quanto validação de dados, você pode adicionar um gatilho de banco de dados que os controlos ST_Equals (ST_Envelope (geom), geom) = 1.

Você pode estar procurando ST_Envelope - Não sei ao certo sobre o DB2, mas é parte do padrão OGC. Qualquer linha não-vertical ou não-horizontal, ou polígono, vai gerar um rectângulo através desta função, armazenar as coordenadas tipicamente como flutuadores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top