<<< предыдущая глава | оглавление | следующая глава >>>
Спецификация "Simple Features Specification for SQL" OpenGIS определяет стандартные типы объектов ГИС, функции для манипуляции ими, и набор таблиц метаданных. В целях сохранения корректности метаданных, такие операции как создание и удаление столбцов с пространственными данными осуществляются с помощью специальных процедур, определенных OpenGIS.
Существуют две таблицы метаданных OpenGIS: SPATIAL_REF_SYS и GEOMETRY_COLUMNS. Таблица SPATIAL_REF_SYS содержит числовые ID и текстовые описания систем координат, используемых в пространственной базе данных.
Таблица 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 имеет следующие столбцы:
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.
+proj=utm +zone=10 +ellps=clrk66 +datum=NAD27 +units=m
Смотрите подробности на сайте Proj4: http://www.remotesensing.org/proj. Файл spatial_ref_sys.sql содержит определения SRTEXT и PROJ4TEXT для всех проекций EPSG.
Таблица 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 )
Она имеет следующие столбцы:
Этот атрибут, возможно, не является частью спецификации OpenGIS, но необходим для обеспечения типового единообразия.
Создание таблицы с пространственными данными выполняется в два шага:
Например: CREATE TABLE ROADS_GEOM ( ID int4, NAME varchar(25) )
Ее синтаксис:
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 );
Большинство функций, предоставленных библиотекой 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(), вы можете указать ограничение числа измерений геометрии. Для строгого соответствия ограничьте число измерений двумя.
<<< предыдущая глава | оглавление | следующая глава >>>
Обсудить в форуме Комментариев 21
Последнее обновление: July 23 2010
© GIS-Lab и авторы, 2002-2021. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов. (подробнее).