VK Cloud logo
Обновлена 21 марта 2024 г. в 11:48

Использование расширения PostGIS в PostgreSQL и PostgresPro

Как построить пространственный запрос?

Чтобы построить пространственный запрос, вы должны создать таблицу со столбцом типа geometry, который будет содержать ваши ГИС-данные. Соединитесь с вашей базой данных с помощью PSQL и выполните SQL:

CREATE TABLE gtest ( ID int4, NAME varchar(20) ); SELECT AddGeometryColumn('', 'gtest','geom',-1,'LINESTRING',2);

Если не получилось добавить столбец геометрии, то, вероятно, вы не загрузили функции и объекты PostGIS в свою базу данных. Смотрите инструкцию по установке.

Далее, вы можете вставлять геометрию в таблицу с помощью SQL-команды insert. Объект ГИС будет форматирован согласно формату well-known text Консорциума OpenGIS:

INSERT INTO gtest (ID, NAME, GEOM) VALUES ( 1, 'Первая геометрия', GeomFromText('LINESTRING(2 3,4 5,6 5,7 8)', -1) );

Подробную информацию о других объектах ГИС можно посмотреть в справочнике объектов. Просмотр ваших ГИС-данных в таблице:

SELECT id, name, AsText(geom) AS geom FROM gtest;

Результат должен выглядеть примерно так:

id | name           | geom --- +----------------+------------------------------ 1  | First geometry | line(2 3,4 5,6 5,7 8) (1 row)

Как вставить объект ГИС в базу данных?

Так же, как вы строите другие запросы к базе данных, используя SQL-запрос для получения значений, функций, логических тестов.

При построении пространственных запросов следует учитывать:

  • существует ли пространственный индекс, которым можно воспользоваться;
  • нужно ли произвести сложные вычисления на большом числе геометрий.

Чаще всего вам будет нужен «оператор пересечения» (&&), который проверяет пересекаются ли границы объектов. Польза оператора && заключается в том, что он может использовать пространственный индекс, если он существует. Это ускорит выполнения запроса.

Кроме того, вы можете использовать пространственные функции, такие как Distance(), ST_Intersects(), ST_Contains() and ST_Within() и другие для сужения результатов поиска. Большинство пространственных запросов включают тест на индекс и тест на пространственную функцию. Тест индекса полезен тем, что ограничивает число проверок значений теми, которые могут попасть в требуемый набор. Далее используются пространственные функции для окончательной проверки условия.

SELECT id, the_geom FROM thetable WHERE the_geom && 'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))' AND _ST_Contains(the_geom,'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))');