Frage

Ich habe eine räumlich aktivierten Datenbank (DB2, in diesem Fall). Ich brauche eine große Anzahl von Plätzen in einer Tabelle zu speichern. Welcher Standard räumlicher SQL-Datentyp am besten geeignet ist?

Ich glaube, ich könnte ein ST_Polygon verwenden, aber vielleicht ist es eine spezielle Art, welche geben würde,

  • bessere Leistung
  • bessere Datengarantien (ich möchte es als Fehler fangen, wenn jemand, wo einen nicht-Quadrat-Wert in der jeweiligen Spalte speichern)

Ich habe versucht, eine ST_rectangle oder ST_square Typen zu finden, aber sie scheinen nicht zu existieren (?)

Während ich mit DB2 gerade arbeite, ich interessiere mich auch für Lösungen, die auf DB2 nicht funktionieren, solange sie sind standardkonform.

War es hilfreich?

Lösung

In DB2 ist es auch ein Polygon. Es sieht aus wie Sie Gitter speichern, so dass eine schnelle Überprüfung könnte sein, dass, wenn ST_Envelope (Geometrie) == Geometrie dann haben Sie ein Quadrat

Dieser Code ist aus

DB2 Dokumentation

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;

Ergebnisse:

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

Siehe ID = 5? der letzte POLYGON == ST_Envelope (Geometrie)

Andere Tipps

Auch wenn Sie Ihre Daten ein Rechteck oder Quadrat stellen, müssen Sie noch den ST_Polygon Typen verwenden. Wenn Sie jedoch eine Abfrage der Daten durchführen, können Sie ein Filter erster Ordnung wie ST_EnvIntersects .

Normalerweise wird eine räumliche Datenbank wird die Umschläge vergleichen (das heißt ein Rechteck, das das Polygon enthält) für eine Kreuzung. Dann führt sie die teurere Polygon-zu-Polygon Schnittberechnung. In diesem Fall, da Ihre Polygone auf den Umschlag gleich sind, können Sie den zweiten teurer Schritt überspringen.

Soweit die Datenvalidierung können Sie eine Datenbank-Trigger hinzufügen, die ST_Equals (ST_Envelope (geom), geom) prüft = 1.

Sie suchen können ST_Envelope - Ich weiß es nicht sicher Teil des OGC-Standard zu DB2, aber es ist. Jede nicht-senkrechte oder nicht-horizontale Linie oder Polygon, wird ein Rechteck über diese Funktion erzeugen, die Koordinaten typischerweise als Schwimmer speichert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top