Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru
Руководство по PostGIS. Глава 3. Часто задаваемые вопросы
Назад Вперед

Глава 3. Часто задаваемые вопросы

3.1. Какие виды геометрических объектов имеются в моем распоряжении?
3.2. Как вставить объект ГИС в базу данных?
3.3. Как построить пространственный запрос?
3.4. Как повысить скорость пространственных запросов на больших таблицах?
3.5. Почему не поддерживаются R-Tree индексы PostgreSQL?
3.6. Почему я должен использовать функцию AddGeometryColumn() и все прочие штуки OpenGIS?
3.7. Какой способ лучше использовать для поиска всех объектов в радиусе от другого объекта?
3.8. Как запросом представить репроекцию координат?
3.1. Какие виды геометрических объектов имеются в моем распоряжении?

В вашем распоряжении точка, линия, полигон, мультипойнт, мультилайн, мультиполигон и геометрическая коллекция. Они определены Open GIS в формате Well Known Text (с расширениями XYZ, XYM, XYZM).

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

Сначала вы должны создать таблицу со столбцом типа "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 | Первая геометрия | LINESTRING(2 3,4 5,6 5,7 8)
(1 row)
3.3. Как построить пространственный запрос?

Так же как вы строите другие запросы к базе данных, - 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))');
3.4. Как повысить скорость пространственных запросов на больших таблицах?

Быстрые запросы на больших таблицах является назначением пространственной базы данных (вместе с поддержкой транзакций). Поэтому очень важно иметь в ней хорошие индексы.

Для создания пространственного индекса на таблице со столбцом geometry, используйте запрос "CREATE INDEX", как показано ниже:

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometrycolumn] );

Опция "USING GIST" означает, что сервер должен использовать индекс GiST (Generalized Search Tree - обобщенное поисковое дерево).

Замечание

Индексы GiST допускают потери. Индексы с потерями используют замещающие объекты (в пространственном случае - границу области) для создания индекса.

Вы должны также обеспечить планировщик запросов PostgreSQL информацией о вашем индексе, чтобы он мог выбирать разумные решения об их использовании. Чтобы сделать это вам понадобится "собранная статистика" по вашим геометрическим таблицам.

Для PostgreSQL 8.0.x и старше, выполните команду VACUUM ANALYZE.

Для PostgreSQL 7.4.x и младше, выполните команду SELECT UPDATE_GEOMETRY_STATS().

3.5. Почему не поддерживаются R-Tree индексы PostgreSQL?

Ранние версии PostGIS-а использовали R-Tree индексы PostgreSQL. Однако эти R-Tree индексы PostgreSQL стали совершенно ненужными начиная с версии 0.6, когда появились пространственные индексы со схемой R-Tree-над-GiST.

Наши тесты показали, что скорости поиска с использованием нативных R-деревьев и GiST сопоставимыми. Нативные R-деревья PostgreSQL имеют два ограничения, которые делают их нежелательными для реализации возможностей ГИС (заметим, что эти ограничения присущи текущей реализации нативных R-деревьев в PostgreSQL, а не самой концепции R-деревьев):

  • R-Tree индексы в PostgreSQL не умеют работать со значениями, размер которых превышает 8K. Индексы GiST умеют, используя трюк "потерь" с заменой соббственно значений на границы областей.

  • R-Tree индексы в PostgreSQL не являются "null-безопасными", т.е. бесполезно создавать индекс на геометрическом столбце, в котором содержатся геометрии null.

3.6. Почему я должен использовать функцию AddGeometryColumn() и все прочие штуки OpenGIS?

Если у вас нет необходимости использовать функции поддержки OpenGIS, не используйте их. Просто создайте таблицы как в старых версиях, определите геометрические столбцы с помощью CREATE. Все ваши геометрии могут иметь SRID-ы, установленные в -1, а таблицы мета-данных OpenGIS могут не быть заполнены должным образом. Однако большинство приложений, основанных на PostGIS, не смогут с этим работать, и мы советуем вам использовать AddGeometryColumn() при создания геометрических таблиц.

Одним из приложений, которое использует мета-данные geometry_columns, является Mapserver. Особенно Mapserver нуждается в SRID-ах геометрических столбцов для репроекции фигур на лету в текущую проекцию карты.

3.7. Какой способ лучше использовать для поиска всех объектов в радиусе от другого объекта?

Использование базы данных наиболее эффективно. Лучше делать запросы, которые проверяют попадпние в объекта в радиус данного объекта: используется пространственный индекс, который предоставляет быстрый доступ к подмножеству данных, находящихся в заданном радиусе от испытумого.

Для нахождения дистанций удобна функция ST_DWithin(geometry, geometry, distance). Она создает поисковый прямоугольник, достаточно большой, чтобы включить все на расстояние радиуса. Потом этот прямоугольник использует для нахождения точных расстояний в результирующем проиндексированном подмножестве.

Например, чтобы найти все объекты в 100 метрах от POINT(1000 1000), хорошо работает следующий запрос:

SELECT * FROM geotable
  WHERE ST_DWithin(geocolumn, 'POINT(1000 1000)', 100.0);
3.8. Как запросом представить репроекцию координат?

При выполнении репроекции, оба начала и направления систем координат должны быть определены в таблице SPATIAL_REF_SYS, а геометрии уже должны иметь на них набор SRID. Если все это есть, репроекция столь же проста, как отправка SRID в нужном направлении.

SELECT ST_Transform(the_geom,4269) FROM geotable;

Назад Выше Вперед
Глава 2. Инсталляция Начало Глава 4. Использование PostGIS
Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2008-02-13 14:49:45

Метки материала: PostGIS, GIS, PostgreSQL, ГИС, БД, базы данных, геоинформационные системы

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2017, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.