GIS-Lab: Руководство по PostGIS: 4.2. Использование стандартов OpenGIS

Руководство по PostGIS

4.2. Использование стандартов OpenGIS

<<< предыдущая глава | оглавление | следующая глава >>>

Спецификация "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
(Наверх)

Back to top

(С) Виктор Вислобоков, 2008-2023