2009-08-17 6 views
5

J'ai une base de données spatialement activée (DB2, dans ce cas). J'ai besoin de stocker un grand nombre de carrés dans une table. Quel type de données SQL spatial standard convient le mieux?SQL spatial: le type de données le plus approprié pour un carré?

Je suppose que je pourrais utiliser un ST_Polygon, mais peut-être il y a un type plus spécialisé qui donnerait

  • meilleures performances
  • meilleures garanties de données (je veux l'attraper comme une erreur si quelqu'un où stocker une valeur non carrée dans la colonne particulière)

J'ai essayé de trouver un ST_rectangle ou ST_squar e tapez, mais ils ne semblent pas exister (?)

Pendant que je travaille avec DB2, je suis également intéressé par les solutions qui ne fonctionnent pas sur DB2, à condition qu'elles soient conformes aux normes .

Répondre

1

Dans DB2, il s'agit également d'un polygone. Il semble que vous stockez des grilles, donc une vérification rapide pourrait être que si ST_Envelope (géométrie) == géométrie alors vous avez un carré

Ce code est 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; 

Résultats:

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

Voir ID = 5? le dernier POLYGONE == ST_ENVELOPE (géométrie)

1

Vous cherchez peut-être ST_Envelope - Je ne sais pas avec certitude DB2 mais cela fait partie de la norme OGC. Toute ligne non-verticale ou non-horizontale, ou polygone, générera un rectangle via cette fonction, en stockant les coordonnées typiquement comme des flottants.

+1

Mais ST_envolope est une fonction, pas un type, pour autant que je peux voir? –

+0

Désolé, j'ai enlevé beaucoup de bêtises alambiquées juste maintenant. Les points sont stockés comme une séquence de float4 dans Postgis, pas sûr de DB2 mais il doit être à peu près le même, ou peut-être l'un des types 'number' db2/Oracle. Je suppose que tous les rectangles sont simplement des coordonnées stockées sous forme de type flottant de base, avec la fonctionnalité géographique activée via l'indexation intelligente pour les requêtes spatiales communes. – unmounted

+1

Troels est correct. ST_ENVELOPE est une fonction qui retourne un ST_POLYGON; ST_ENVELOPE n'est pas un type. L'optimisation "float" est spécifique à PostGIS. –

4

Même si vos données représentent un rectangle ou un carré, vous devrez toujours utiliser le type ST_POLYGON. Toutefois, lorsque vous exécutez une requête sur les données, vous pouvez utiliser des filtres de premier ordre tels que ST_EnvIntersects.

Normalement, une base de données spatiale comparera les enveloppes (c'est-à-dire un rectangle qui contient le polygone) pour une intersection. Ensuite, il effectue le calcul d'intersection polygone-polygone le plus coûteux. Dans ce cas, puisque vos polygones sont égaux à l'enveloppe, vous pouvez passer la deuxième étape plus coûteuse.

En ce qui concerne la validation des données, vous pouvez ajouter un élément déclencheur de base de données qui vérifie ST_Equals (ST_Envelope (geom), geom) = 1.

Questions connexes