Спецификация "Simple Features Specification for SQL" OpenGIS определяет
стандартные типы объектов ГИС, функции для манипуляции ими, и набор таблиц
метаданных. В целях сохранения корректности метаданных, такие операции как
создание и удаление столбцов с пространственными данными осуществляются с помощью специальных
процедур, определенных OpenGIS.
Существуют две таблицы метаданных OpenGIS: SPATIAL_REF_SYS и
GEOMETRY_COLUMNS. Таблица SPATIAL_REF_SYS содержит числовые
ID и текстовые описания систем координат, используемых в пространственной базе
данных.
4.2.1. Таблица SPATIAL_REF_SYS
Таблица SPATIAL_REF_SYS определяется следующим образом:
CREATE TABLE spatial_ref_sys (
srid INTEGER NOT NULL PRIMARY KEY,
auth_name VARCHAR(256),
auth_srid INTEGER,
srtext VARCHAR(2048),
proj4text VARCHAR(2048)
) |
SPATIAL_REF_SYS имеет следующие столбцы:
- SRID
- Целое число - уникальный идентификатор системы координат (Spatial Referencing System, SRS) в пределах базы данных.
AUTH_NAME
- Название стандарта или стандартизирующего организации, являющейся источником информации о данной системе координат. Например, правильным значением AUTH_NAME будет "EPSG".
AUTH_SRID
- Идентификатор системы координат, так как он определяется организацией указанной в
AUTH_NAME. В случае EPSG, это должен быть код проекции EPSG.
SRTEXT
- WKT представление системы координат. Пример WKT SRS
представления:
PROJCS["NAD83 / UTM Zone 10N",
GEOGCS["NAD83",
DATUM["North_American_Datum_1983",
SPHEROID["GRS 1980",6378137,298.257222101]
],
PRIMEM["Greenwich",0],
UNIT["degree",0.0174532925199433]
],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",-123],
PARAMETER["scale_factor",0.9996],
PARAMETER["false_easting",500000],
PARAMETER["false_northing",0],
UNIT["metre",1]
]
|
-
-
Список кодов проекций EPSG и соответствующих им представлений WKT можно найти
на http://www.opengis.org/techno/interop/EPSG2WKT.TXT. Общее обсуждение WKT
можно прочитать в документе Open GIS "Coordinate Transformation Services Implementation Specification": http://www.opengis.org/techno/specs.htm. Информацию о European Petroleum Survey Group (EPSG) и их базе данных
систем координат можно найти на
http://epsg.org.
PROJ4TEXT
- PostGIS использует библиотеку Proj4 для преобразований систем координат. Столбец PROJ4TEXT содержит строку определение координат
Proj4 для данного SRID. Например:
+proj=utm +zone=10 +ellps=clrk66 +datum=NAD27 +units=m |
Смотрите подробности на сайте Proj4:
http://www.remotesensing.org/proj. Файл spatial_ref_sys.sql
содержит определения SRTEXT и PROJ4TEXT для всех проекций
EPSG.
4.2.2. Таблица GEOMETRY_COLUMNS
Таблица GEOMETRY_COLUMNS определяется следующим образом:
CREATE TABLE geometry_columns (
f_table_catalog VARRCHAR(256) NOT NULL,
f_table_schema VARCHAR(256) NOT NULL,
f_table_nam VARCHAR(256) NOT NULL,
f_geometry_column VARCHAR(256) NOT NULL,
coord_dimension INTEGER NOT NULL,
srid INTEGER NOT NULL,
type VARCHAR(30) NOT NULL
) |
Она имеет следующие столбцы:
- F_TABLE_CATALOG, F_TABLE_SCHEMA, F_TABLE_NAME
- Все составляющие имени таблицы, содержащей столбец геометрии. Заметим,
что термины "catalog" и "scheme" заимствованы из Oracle. В PostgreSQL нет
аналога для "catalog", поэтому этот столбец остается пустым. Для "scheme"
используется имя схемы PostgreSQL (по умолчанию public).
F_GEOMETRY_COLUMN
- Имя столбца геометрии в таблице объектов.
COORD_DIMENSION
- Пространственная размерность столбца (2, 3 или 4 измерения).
SRID
- Идентификатор системы координат, используемой для
геометрии в этой таблице. Он является внешним ключом для таблицы SPATIAL_REF_SYS.
TYPE
- Тип пространственного объекта. Можно использовать один из следующих: POINT, LINESTRING, POLYGON, MULTIPOINT,
MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION или соответствующим
XYM-версиям POINTM, LINESTRINGM, POLYGONM, MULTIPOINTM, MULTILINESTRINGM,
MULTIPOLYGONM, GEOMETRYCOLLECTIONM. Для разнородных коллекций смешанных типов можно использовать "GEOMETRY" как тип.
Замечание
Этот атрибут, возможно, не является частью спецификации OpenGIS, но необходим
для обеспечения типового единообразия.
4.2.3. Создание пространственной таблицы
Создание таблицы с пространственными данными выполняется в два шага:
- Создайте обычную непространственную таблицу.
Например: CREATE TABLE ROADS_GEOM ( ID int4, NAME varchar(25) )
- Добавьте в таблицу пространственный столбец с помощью функции
OpenGIS "AddGeometryColumn".
Ее синтаксис:
AddGeometryColumn(
<schema_name>,
<table_name>,
<column_name>,
<srid>,
<type>,
<dimension>
) |
Или с использованием текущей схемы:
AddGeometryColumn(
<table_name>,
<column_name>,
<srid>,
<type>,
<dimension>
) |
Пример 1: SELECT AddGeometryColumn('public', 'roads_geom', 'geom', 423,
'LINESTRING', 2)
Пример 2: SELECT AddGeometryColumn( 'roads_geom', 'geom', 423,
'LINESTRING', 2)
Приведем пример использования SQL для создания таблицы и добавления
пространственного столбца (при условии, что SRID 128 уже существует):
CREATE TABLE parks (
park_id INTEGER,
park_name VARCHAR,
park_date DATE,
park_type VARCHAR
);
SELECT AddGeometryColumn('parks', 'park_geom', 128, 'MULTIPOLYGON', 2 ); |
Приведем другой пример, использующий общий тип "geometry" и неопределенный SRID -1:
CREATE TABLE roads (
road_id INTEGER,
road_name VARCHAR
);
SELECT AddGeometryColumn( 'roads', 'roads_geom', -1, 'GEOMETRY', 3 ); |
4.2.4. Обеспечение совместимости геометрий с OpenGIS
Большинство функций, предоставленных библиотекой GEOS, основаны на
предположении, что ваша геометрии соответствуют спецификации
Simple Feature Specification OpenGIS. Вы можете проверить соответствие геометрий функцией
IsValid():
gisdb=# select isvalid('LINESTRING(0 0, 1 1)'),
isvalid('LINESTRING(0 0,0 0)');
isvalid | isvalid
---------+---------
t | f |
По умолчанию PostGIS не применяет проверку соответствия вводимой геометрии, так как проверка требует дополнительного процессорного
времени для сложных геометрий, особенно для полигонов. Если вы не доверяете
вашим исходным данным, вы можете вручную включить такую проверку для своей
таблицы, добавив ограничение "CHECK":
ALTER TABLE mytable
ADD CONSTRAINT geometry_valid_check
CHECK (isvalid(the_geom)); |
Если вы столкнулись с непонятной ошибкой, такой как например "GEOS Intersection()
threw an error!" или "JTS Intersection() threw an error!", которые генерируются
функциями PostGIS на правильных геометриях, то, возможно, вы обнаружили
ошибку в PostGIS или в одной из используемых им библиотек, и вам следует
обратиться к разработчикам PostGIS. Это касается и тех случаев, когда функция
PostGIS возвращает неправильную геометрию при правильном вводе.
Замечание
Геометрии, строго соответствующие OGC, не должны иметь значений Z или M.
Функция IsValid() не считает
многомерные геометрии неправильными! Вызывая
AddGeometryColumn(),
вы можете указать ограничение числа измерений геометрии. Для строгого
соответствия ограничьте число измерений двумя.
Последнее обновление: August 14 2008 (Наверх)
|