2009-08-17 6 views
5

Ho un database abilitato spazialmente (DB2, in questo caso). Ho bisogno di memorizzare un gran numero di quadrati in un tavolo. Quale tipo di dati SQL spaziale standard è più adatto?SQL spaziale: il tipo di dati più adatto per un quadrato?

Credo che avrei potuto usare un ST_Polygon, ma forse c'è un tipo più specializzato che darebbe

  • migliori prestazioni
  • migliori garanzie di dati (voglio prendere come un errore se qualcuno dove memorizzare un valore non quadrati nella colonna particolare)

ho cercato di trovare una ST_rectangle o ST_squar e tipo, ma non sembrano esistere (?)

Mentre lavoro con DB2, sono interessato anche a soluzioni che non funzionano su DB2, purché siano conformi agli standard .

risposta

1

In DB2 è anche un poligono. Sembra che si archiviano le griglie, quindi un rapido controllo potrebbe essere che se ST_Envelope (geometria) == geometria allora avete un quadrato

Questo codice è da

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; 

risultati:

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

Vedere ID = 5? l'ultimo POLYGON == ST_ENVELOPE (geometria)

1

Si sta cercando ST_Envelope - Non so per certo su DB2 ma fa parte dello standard OGC. Qualsiasi linea non verticale o non orizzontale, o poligono, genererà un rettangolo tramite questa funzione, memorizzando le coordinate tipicamente come galleggianti.

+1

Ma ST_envolope è una funzione, non un tipo, per quanto posso vedere? –

+0

Scusa, ho rimosso molte sciocchezze contorte ora. I punti sono memorizzati come una sequenza di float4 in Postgis, non sono sicuro di DB2 ma deve essere grosso modo lo stesso, o forse uno dei tipi 'numero' di db2/Oracle. Sto indovinando che tutti i rettangoli sono solo coordinate memorizzate come un tipo float di base, con la funzionalità geo abilitata tramite l'indicizzazione intelligente per le query spaziali comuni. – unmounted

+1

I ferri sono corretti. ST_ENVELOPE è una funzione che restituisce ST_POLYGON; ST_ENVELOPE non è un tipo. L'ottimizzazione "float" è specifica per PostGIS. –

4

Anche se i dati rappresentano un rettangolo o un quadrato, sarà comunque necessario utilizzare il tipo ST_POLYGON. Tuttavia, quando si esegue una query sui dati, è possibile utilizzare filtri di primo ordine come ST_EnvIntersects.

Normalmente, un database spaziale confronterà le buste (cioè un rettangolo che contiene il poligono) per un'intersezione. Quindi esegue il più costoso calcolo di intersezione da poligono a poligono. In questo caso, poiché i poligoni sono uguali alla busta, puoi saltare il secondo passaggio più costoso.

Per quanto riguarda la convalida dei dati, è possibile aggiungere un trigger del database che controlla ST_Equals (ST_Envelope (geom), geom) = 1.

Problemi correlati