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

Подписаться через RSS2Email.ru
Руководство по PostGIS. Глава 4. Использование PostGIS. 4.2. Использование стандартов OpenGIS
Назад Вперед

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

OpenGIS-овская "Спецификация простых возможностей для SQL" определяет стандартные типы объектов ГИС, функции для манипуляции ими, и набор таблиц метаданных. В целях сохранения совместимости метаданных, такие операции как создание и удаление пространственных столбцов осуществляются специальными процедурами, определенными 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

Название стандарта или стандартизирующего органа, на который ссылается данная справочная система. Например, "EPSG" будет валидным значением для AUTH_NAME.

AUTH_SRID

Идентификатор пространственной ссылочной системы, указанной в AUTH_NAME. В случае EPSG, это должен быть код проекции EPSG.

SRTEXT

Текст представления пространственной ссылочной системы. Например, 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 можно прочитать как "Спецификацию реализаций сервисов координатной трансформации": 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

Все составляющие имени таблицы, содержащей геометрический столбец. Заметим, что термины "каталог" и "схема" понимаются в смысле Оракла. В PostgreSQL нет аналога для "каталог", поэтому левый столбец всегда пуст. Для "схемы" используется имя схемы PostgreSQL (по умолчанию - "public").

F_GEOMETRY_COLUMN

Имя геометрического столбца в особой таблице.

COORD_DIMENSION

Пространственная размерность столбца (2, 3 или 4 измерения).

SRID

Идентификатор пространственной справочной системы, используемой для координатной геометрии в указанной таблице. Он является внешним ключом на таблицу SPATIAL_REF_SYS.

TYPE

Тип пространственного объекта. Ограничивает пространственный столбец единственным типом. Одним из следующих: POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION (или POINTM, соответствующим XYM-версиям), 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, основаны на предположении, что ваши геометрии валидны согласно 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(), вы можете указать ограничение числа измерений геометрии. Для строгого соответствия ограничьте число измерений двумя.


Назад Выше Вперед
Глава 4. Использование PostGIS Начало 4.3. Загрузка данных ГИС
Биржа долевых инвестиций SIMEX.

Последнее редактирование: 2008-03-24 14:05:18

Метки материала: PostGIS, OpenGIS, ГИС, SQL, SPATIAL_REF_SYS, GEOMETRY_COLUMNS


3 комментария

13.07.2012 10:35:57 #
Mozilla Firefox Гость gala
Как создать пространственную связь?
Создаю таблицу geometry_column, при групповом копировании из AutoCAD Map 3D, выводится сообщение об ошибке: relation "geometry_columns" does not exist.
19.02.2012 09:54:22 #
Mozilla Firefox dima
Простейший способ - вычислить минимальный объемлющий бокс этих соседних точек и заменить их центром вычисленного объемлющего бокса.
18.02.2012 23:53:26 #
Google Chrome Гость ГЕОМЕН
как сделать групирование соседих точек в одну?

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

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

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


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