Chapter 9. 지형(topology)

Table of Contents

PostGIS 지형 유형 및 함수는 표면(face), 가장자리(edge), 노드(node)와 같은 위상기하학적 객체를 관리했습니다.

Sandro Santilli's presentation at PostGIS Day Paris 2011 conference gives a good synopsis of PostGIS Topology and where it is headed Topology with PostGIS 2.0 slide deck.

Vincent Picavet provides a good synopsis and overview of what is Topology, how is it used, and various FOSS4G tools that support it in PostGIS Topology PGConf EU 2012.

지형에 기반한 GIS 데이터베이스의 예로는 US Census Topologically Integrated Geographic Encoding and Referencing System (TIGER) 데이터베이스가 있습니다. PostGIS 지형 유형을 테스트해보고 싶은데 데이터가 필요하다면, Topology_Load_Tiger 를 확인해보십시오.

PostGIS 지형 모듈은 PostGIS 이전 버전에도 있었지만, 공식 PostGIS 문서에 포함된 적은 없었습니다. PostGIS 2.0.0 버전에서, 지원이 중단된 모든 함수를 제거하고, 알려진 사용성 문제들을 해결하고, 기능 및 함수들을 새로이 문서화하며, 새로운 함수들을 추가하고, SQL-MM 표준을 더 잘 준수하도록 개선하는 등 주요한 정리 작업이 이루어졌습니다.

이 프로젝트에 대한 자세한 내용을 PostGIS Topology Wiki 에서 찾아볼 수 있습니다.

이 모듈과 관련된 모든 함수 및 테이블이 topology 라는 스키마에 설치돼 있습니다.

SQL/MM 표준이 정의하는 함수들은 접두사 ST_ 가 붙은 명칭을 가지고 있으며, PostGIS에 특화된 함수들의 명칭에는 접두사가 붙지 않습니다.

Topology support is build by default starting with PostGIS 2.0, and can be disabled specifying --without-topology configure option at build time as described in Chapter 2, PostGIS 설치

9.1. 지형 유형

Abstract

이 단원에서 PostGIS 지형이 설치한 PostgreSQL 데이터 유형을 소개합니다. 사용자 지정 함수를 설계할 때 특히 중요한 이 유형들의 형변환 습성(cast behavior)을 설명한다는 점에 주의하십시오.

  • getfaceedges_returntype — A composite type that consists of a sequence number and an edge number.
  • TopoGeometry — A composite type representing a topologically defined geometry.
  • validatetopology_returntype — A composite type that consists of an error message and id1 and id2 to denote location of error. This is the return type for ValidateTopology.

9.2. 지형 도메인

Abstract

이 단원에서 PostGIS 지형이 설치한 PostgreSQL 도메인을 소개합니다. 함수가 반환하는 유형 또는 테이블 열 등, 도메인을 객체 유형처럼 이용할 수 있습니다. 도메인과 유형의 차이점은, 도메인이 확인 제약조건으로 묶여 있는 기존 유형이라는 점입니다.

  • TopoElement — 일반적으로 TopoGeometry 구성 요소를 식별하는 데 쓰이는 정수형 2개의 배열입니다.
  • TopoElementArray — An array of TopoElement objects.

9.3. 지형 및 TopoGeometry 관리

Abstract

이 단원에서 새로운 지형 스키마를 빌드하고, 지형이 유효한지 확인하고, TopoGeometry 열을 관리하기 위한 지형 함수들을 소개합니다.

  • AddTopoGeometryColumn — 기존 테이블에 TopoGeometry 열을 추가하고, topology.layer에 이 새 열을 레이어로 추가하며, 새 layer_id를 반환합니다.
  • RenameTopoGeometryColumn — Renames a topogeometry column
  • DropTopology — 이용에 주의하십시오: 지형 스키마를 삭제하고 topology.topology 테이블에서 해당 참조를, 그리고 geometry_columns 테이블에서 해당 스키마에 있는 테이블의 참조를 삭제합니다.
  • RenameTopology — Renames a topology
  • DropTopoGeometryColumn schema_name 스키마 안의 table_name 명칭의 테이블에서 Topogeometry 열을 삭제하고 topology.layer 테이블에서 해당 열을 등록 해제합니다.
  • Populate_Topology_Layer — Adds missing entries to topology.layer table by reading metadata from topo tables.
  • TopologySummary — Takes a topology name and provides summary totals of types of objects in topology.
  • ValidateTopology — Returns a set of validatetopology_returntype objects detailing issues with topology.
  • ValidateTopologyRelation — Returns info about invalid topology relation records
  • FindTopology — Returns a topology record by different means.
  • FindLayer — Returns a topology.layer record by different means.

9.4. Topology Statistics Management

Abstract

This section discusses management of database statistics during topology building.

Adding elements to a topology triggers many database queries for finding existing edges that will be split, adding nodes and updating edges that will node with the new linework. For this reason it is useful that statistics about the data in the topology tables are up-to-date.

PostGIS Topology population and editing functions do not automatically update the statistics because a updating stats after each and every change in a topology would be overkill, so it is the caller's duty to take care of that.

[Note]

That the statistics updated by autovacuum will NOT be visible to transactions which started before autovacuum process completed, so long-running transactions will need to run ANALYZE themselves, to use updated statistics.

9.5. 지형 작성자

Abstract

이 단원에서 새 지형을 생성하기 위한 지형 함수에 대해 설명합니다.

  • CreateTopology — Creates a new topology schema and registers it in the topology.topology table.
  • CopyTopology — Makes a copy of a topology (nodes, edges, faces, layers and TopoGeometries) into a new schema
  • ST_InitTopoGeo — Creates a new topology schema and registers it in the topology.topology table.
  • ST_CreateTopoGeo — 텅 빈 입력 지형에 도형들의 집합을 추가한 다음 작업 성공 여부를 상세하게 설명하는 메시지를 반환합니다.
  • TopoGeo_AddPoint — 허용 오차를 이용해서 그리고 기존 경계선을 분할(split)하기도 해서 기존 지형에 포인트를 추가합니다.
  • TopoGeo_AddLineString — Adds a linestring to an existing topology using a tolerance and possibly splitting existing edges/faces. Returns edge identifiers.
  • TopoGeo_AddPolygon — Adds a polygon to an existing topology using a tolerance and possibly splitting existing edges/faces. Returns face identifiers.

9.6. 지형 편집자

Abstract

이 단원에서 경계선, 표면, 노드를 추가하고, 이동하고, 삭제하고, 분할하기 위한 지형 함수에 대해 설명합니다. ISO SQL/MM이 이 단원의 모든 함수를 정의합니다.

  • ST_AddIsoNode — 지형 안의 표면에 고립된(isolated) 노드를 추가하고 새 노드의 ID를 반환합니다. 표면이 NULL일 경우, 그래도 노드를 생성합니다.
  • ST_AddIsoEdge — 지형에 두 개의 고립된 기존 노드 anodeanothernode 를 연결하는 alinestring 도형이 정의하는 고립된 경계선을 추가하고 새 경계선의 ID를 반환합니다.
  • ST_AddEdgeNewFaces — 새 경계선을 추가하고, 그 과정에서 경계선이 표면을 분할할 경우, 원본 표면을 삭제하고 새 표면 2개로 교체합니다.
  • ST_AddEdgeModFace — 새 경계선을 추가하고, 그 과정에서 경계선이 표면을 분할할 경우, 원본 표면을 수정하고 새 표면을 추가합니다.
  • ST_RemEdgeNewFace — 경계선을 제거하고, 제거한 경계선이 두 표면을 분할하고 있을 경우, 원본 표면들을 삭제하고 새 표면 하나로 대체합니다.
  • ST_RemEdgeModFace — Removes an edge, and if the edge separates two faces deletes one face and modifies the other face to cover the space of both.
  • ST_ChangeEdgeGeom — 지형 구조를 건드리는 일 없이 경계선의 형상을 변경합니다.
  • ST_ModEdgeSplit — 기존 경계선을 따라 새 노드를 추가한 다음, 원본 경계선을 수정하고 새 경계선을 추가해서 경계선을 분할합니다.
  • ST_ModEdgeHeal — Heals two edges by deleting the node connecting them, modifying the first edge and deleting the second edge. Returns the id of the deleted node.
  • ST_NewEdgeHeal — Heals two edges by deleting the node connecting them, deleting both edges, and replacing them with an edge whose direction is the same as the first edge provided.
  • ST_MoveIsoNode — Moves an isolated node in a topology from one point to another. If new apoint geometry exists as a node an error is thrown. Returns description of move.
  • ST_NewEdgesSplit — 기존 경계선을 따라 새 노드를 추가한 다음, 원본 경계선을 삭제하고 새 경계선 2개로 교체해서 경계선을 분할합니다. 새 경계선들을 결합하는 새로 생성된 노드의 ID를 반환합니다.
  • ST_RemoveIsoNode — 고립된 노드를 제거하고 작업 내용을 설명하는 메시지를 반환합니다. 노드가 고립되지 않은 (경계선의 시작점이나 종단점인) 경우, 예외가 발생합니다.
  • ST_RemoveIsoEdge — Removes an isolated edge and returns description of action. If the edge is not isolated, then an exception is thrown.

9.7. 지형 접근자

  • GetEdgeByPoint — Finds the edge-id of an edge that intersects a given point.
  • GetFaceByPoint — Finds face intersecting a given point.
  • GetFaceContainingPoint — Finds the face containing a point.
  • GetNodeByPoint — Finds the node-id of a node at a point location.
  • GetTopologyID — 지형의 명칭을 입력받아 topology.topology 테이블에 있는 지형의 ID를 반환합니다.
  • GetTopologySRID — 지형의 명칭을 입력받아 topology.topology 테이블에 있는 지형의 SRID를 반환합니다.
  • GetTopologyName — 지형의 ID를 입력받아 지형(스키마)의 명칭을 반환합니다.
  • ST_GetFaceEdges aface 의 경계를 이루는 정렬된 경계선들의 집합을 반환합니다.
  • ST_GetFaceGeometry — 입력 지형으로부터 설정된 표면 ID를 가진 폴리곤을 반환합니다.
  • GetRingEdges — 입력 경계선 쪽을 따라 탐색한 부호가 있는 경계선 식별자들의 정렬된 집합을 반환합니다.
  • GetNodeEdges — 입력 노드를 따르는 경계선들의 정렬된 집합을 반환합니다.

9.8. 지형 공간 처리

Abstract

이 단원에서 비표준적인 방법으로 지형을 공간 처리하기 위한 함수에 대해 설명합니다.

  • Polygonize — Finds and registers all faces defined by topology edges.
  • AddNode — 설정한 지형 스키마의 노드 테이블에 포인트 노드를 추가하고 새 노드의 노드 ID(nodeid)를 반환합니다. 새 포인트 위치에 이미 노드가 존재할 경우, 기존 노드 ID를 반환합니다.
  • AddEdge — 설정한 지형 스키마의 경계선 테이블에 라인스트링 경계선을 추가하고, 설정한 라인스트링 도형을 이용해서 포인트 노드 테이블에 경계선의 시작점 및 종단점을 추가한 다음 새 (또는 기존) 경계선의 경계선 ID(edgeid)를 반환합니다.
  • AddFace — 지형에 표면 원시형(face primitive)을 등록하고 그 식별자를 반환합니다.
  • ST_Simplify — 더글러스-패커(Douglas-Peucker) 알고리즘을 통해 입력 TopoGeometry 의 "단순화된" 도형 버전을 반환합니다.
  • RemoveUnusedPrimitives — Removes topology primitives which not needed to define existing TopoGeometry objects.

9.9. TopoGeometry 작성자

Abstract

이 단원에서 새 TopoGeometry를 생성하기 위한 지형 함수에 대해 설명합니다.

  • CreateTopoGeom — 지형 요소 배열로부터 새 지형 도형 객체를 생성합니다. tg_type은 1: [멀티]포인트, 2: [멀티]라인, 3: [멀티]폴리곤, 4: 도형 집합입니다.
  • toTopoGeom — Converts a simple Geometry into a topo geometry.
  • TopoElementArray_Agg — Returns a topoelementarray for a set of element_id, type arrays (topoelements).
  • TopoElement — Converts a topogeometry to a topoelement.

9.10. TopoGeometry 편집자

Abstract

이 단원에서 기존 지형을 편집하기 위한 지형 함수에 대해 설명합니다.

9.11. TopoGeometry 접근자

  • GetTopoGeomElementArray — Returns a topoelementarray (an array of topoelements) containing the topological elements and type of the given TopoGeometry (primitive elements).
  • GetTopoGeomElements — Returns a set of topoelement objects containing the topological element_id,element_type of the given TopoGeometry (primitive elements).
  • ST_SRID — Returns the spatial reference identifier for a topogeometry.

9.12. TopoGeometry 출력물

  • AsGML — TopoGeometry의 GML 표현식을 반환합니다.
  • AsTopoJSON — TopoGeometry의 TopoJSON 표현식을 반환합니다.

9.13. 지형 공간 관계성

Abstract

이 단원에서 TopoGeometry와 지형 원시형 사이의 관계를 확인하는 데 쓰이는 지형 함수에 대해 설명합니다.

  • Equals — 두 TopoGeometry가 동일한 지형 원시형으로 이루어졌을 경우 참을 반환합니다.
  • Intersects — 두 TopoGeometry에서 나온 원시형의 쌍 가운데 하나라도 교차할 경우 참을 반환합니다.

9.14. Importing and exporting Topologies

Once you have created topologies, and maybe associated topological layers, you might want to export them into a file-based format for backup or transfer into another database.

Using the standard dump/restore tools of PostgreSQL is problematic because topologies are composed by a set of tables (4 for primitives, an arbitrary number for layers) and records in metadata tables (topology.topology and topology.layer). Additionally, topology identifiers are not univoque across databases so that parameter of your topology will need to be changes upon restoring it.

In order to simplify export/restore of topologies a pair of executables are provided: pgtopo_export and pgtopo_import. Example usage:

pgtopo_export dev_db topo1 | pgtopo_import topo1 | psql staging_db

9.14.1. Using the Topology exporter

The pgtopo_export script takes the name of a database and a topology and outputs a dump file which can be used to import the topology (and associated layers) into a new database.

By default pgtopo_export writes the dump file to the standard output so that it can be piped to pgtopo_import or redirected to a file (refusing to write to terminal). You can optionally specify an output filename with the -f commandline switch.

By default pgtopo_export includes a dump of all layers defined against the given topology. This may be more data than you need, or may be non-working (in case your layer tables have complex dependencies) in which case you can request skipping the layers with the --skip-layers switch and deal with those separately.

Invoking pgtopo_export with the --help (or -h for short) switch will always print short usage string.

The dump file format is a compressed tar archive of a pgtopo_export directory containing at least a pgtopo_dump_version file with format version info. As of version 1 the directory contains tab-delimited CSV files with data of the topology primitive tables (node, edge_data, face, relation), the topology and layer records associated with it and (unless --skip-layers is given) a custom-format PostgreSQL dump of tables reported as being layers of the given topology.

9.14.2. Using the Topology importer

The pgtopo_import script takes a pgtopo_export format topology dump and a name to give to the topology to be created and outputs an SQL script reconstructing the topology and associated layers.

The generated SQL file will contain statements that create a topology with the given name, load primitive data in it, restores and registers all topology layers by properly linking all TopoGeometry values to their correct topology.

By default pgtopo_import reads the dump from the standard input so that it can be used in conjuction with pgtopo_export in a pipeline. You can optionally specify an input filename with the -f commandline switch.

By default pgtopo_import includes in the output SQL file the code to restore all layers found in the dump.

This may be unwanted or non-working in case your target database already have tables with the same name as the ones in the dump. In that case you can request skipping the layers with the --skip-layers switch and deal with those separately (or later).

SQL to only load and link layers to a named topology can be generated using the --only-layers switch. This can be useful to load layers AFTER resolving the naming conflicts or to link layers to a different topology (say a spatially-simplified version of the starting topology).