Подписаться через 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;
|
Последнее редактирование: 2008-02-13 14:49:45
Метки материала:
PostGIS, GIS, PostgreSQL, ГИС, БД, базы данных, геоинформационные системы
Оставьте свой комментарий:
|