Пространственный SQL:Самый подходящий тип данных для квадрата?

StackOverflow https://stackoverflow.com/questions/1286749

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть база данных с пространственным доступом (в данном случае DB2).Мне нужно сохранить большое количество квадратов в таблице.Какой стандартный тип данных пространственного SQL наиболее подходит?

Я думаю, я мог бы использовать ST_полигон, но, возможно, существует более специализированный тип, который даст

  • лучшая производительность
  • лучшие гарантии данных (я хочу уловить это как ошибку, если кто-то хранит неквадратное значение в конкретном столбце)

Я пытался найти ST_прямоугольник или ST_квадрат типа, но их вроде не существует(?)

Пока я работаю с DB2, меня также интересуют решения, которые не работают в DB2, если они соответствуют стандартам.

Это было полезно?

Решение

В DB2 это тоже Polygon.Похоже, вы храните сетки, поэтому можно быстро проверить, что если ST_ENVELOPE(geometry) == geometry, то у вас есть квадрат.

Этот код взят из

документация 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;

Полученные результаты:

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

Видите ID = 5?последний ПОЛИГОН == ST_ENVELOPE(геометрия)

Другие советы

Даже если ваши данные представляют собой прямоугольник или квадрат, вам все равно придется использовать тип ST_POLYGON.Однако при выполнении запроса к данным вы можете использовать фильтры первого порядка, такие как ST_EnvIntersects.

Обычно пространственная база данных сравнивает конверты (т.е.прямоугольник, содержащий многоугольник) для пересечения.Затем он выполняет более дорогостоящий расчет пересечения полигонов.В этом случае, поскольку ваши полигоны равны конверту, вы можете пропустить второй, более затратный шаг.

Что касается проверки данных, вы можете добавить триггер базы данных, который проверяет ST_EQUALS(ST_ENVELOPE(geom),geom) = 1.

Возможно, вы ищете ST_Конверт -- Я не знаю точно насчет DB2, но это часть стандарта OGC.Любая невертикальная или негоризонтальная линия или многоугольник с помощью этой функции создаст прямоугольник, сохраняя координаты обычно в виде чисел с плавающей запятой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top