Question

J'ai une base de données spatialisée (DB2, dans ce cas). J'ai besoin de stocker un grand nombre de places dans un tableau. Ce qui type SQL spatiale est la norme la plus appropriée?

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

  • meilleure performance
  • de 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_square de type, mais ils ne semblent pas exister (?)

Alors que je travaille avec DB2, je suis également intéressé par des solutions qui ne fonctionnent pas sur DB2, tant qu'ils sont conformes aux normes.

Était-ce utile?

La solution

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

Ce code est de

documentation 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;

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 POLYGON == ST_Envelope (géométrie)

Autres conseils

Même si vos données représente un rectangle ou un carré, vous aurez toujours besoin d'utiliser le type ST_Polygon. Toutefois, lorsque vous effectuez une requête sur les données, vous pouvez utiliser un filtre de premier ordre tels que ST_EnvIntersects .

Normalement, une base de données spatiales permettra de comparer les enveloppes (par exemple un rectangle qui contient le polygone) pour une intersection. Il effectue ensuite le polygone à polygone plus cher calcul d'intersection. Dans ce cas, puisque vos polygones sont égaux à l'enveloppe, vous pouvez sauter la deuxième étape plus cher.

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.

Vous pouvez rechercher ST_Envelope - Je ne sais pas sûr a propos de DB2, mais il fait partie de la norme OGC. Toute ligne non verticale ou non horizontale, ou d'un polygone, va générer un rectangle par l'intermédiaire de cette fonction, le stockage des coordonnées typiquement sous la forme de flotteurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top