Chapter 12. PostGIS Extras

Table of Contents

This chapter documents features found in the extras folder of the PostGIS source tarballs and source repository. These are not always packaged with PostGIS binary releases, but are usually PL/pgSQL based or standard shell scripts that can be run as is.

12.1. 주소 표준화 도구

이 도구는 PAGC standardizer 의 한 갈래(fork)입니다(이 갈래의 원본 코드는 PAGC PostgreSQL 주소 표준화 도구 였습니다).

주소 표준화 도구는 단일 라인 주소 파싱 도구로, 주소를 입력받아 테이블에 저장된 일련의 규칙 및 도우미 어휘 목록(lexicon; lex) 테이블지명 색인(gazetteer; gaz) 테이블 에 기반해서 정규화합니다.

CREATE EXTENSION address_standardizer; 명령으로 설치할 수 있는 address_standardizer 라는 단일 PostgreSQL 확장 프로그램 라이브러리로 코드를 빌드합니다. address_standardizer 확장 프로그램에 더해, address_standardizer_data_us 라는 샘플 데이터 확장 프로그램도 빌드하는데, 미국 데이터에 대한 지명 색인, 어휘 목록, 규칙 테이블을 담고 있습니다. CREATE EXTENSION address_standardizer_data_us; 명령으로 이 확장 프로그램을 설치할 수 있습니다.

PostGIS extensions/address_standardizer 에서 이 확장 프로그램을 위한 코드를 찾을 수 있으며, 현재 독립적으로 돼 있습니다.

설치에 대한 지침을 보고 싶다면 Section 2.3, “주소 표준화 도구 설치 및 활용” 를 참조하십시오.

12.1.1. 파싱 도구의 작동 방식

파싱 도구는 오른쪽에서 왼쪽 방향으로 먼저 우편번호, 주/도, 시군구에 해당하는 거시적(macro) 요소를 탐색한 다음, 가구의 번지수 또는 교차점 또는 랜드마크 가운데 어떤 것을 처리하고 있는지 결정하기 위한 미시적(micro) 요소를 탐색합니다. 현재 국가 코드 또는 국가명을 탐색하지는 않지만, 향후 추가될 수도 있습니다.

국가 코드

미국 또는 캐나다의 주/도, 미국 또는 캐나다의 우편번호를 바탕으로 미국 또는 캐나다로 가정합니다.

우편번호/집코드(zip code)

펄(Perl) 호환 정규 표현식을 이용해서 우편번호를 인식합니다. 이 정규 표현식은 현재 parseaddress-api.c 파일에 담겨 있고, 필요한 경우 상대적으로 쉽게 변경할 수 있습니다.

주/도

펄(Perl) 호환 정규 표현식을 이용해서 우편번호를 인식합니다. 이 정규 표현식은 현재 parseaddress-api.c 파일에 담겨 있는데, 향후 유지보수를 더 쉽게 하기 위해 "includes"로 이동할 수도 있습니다.

12.1.2. 주소 표준화 도구 유형

Abstract

이 단원에서 주소 표준화 도구 확장 프로그램이 설치한 PostgreSQL 데이터 유형을 소개합니다. 사용자 자신의 함수를 설계할 때 특히 중요한 이 유형들의 형변환 습성(cast behavior)을 설명한다는 점에 주의하십시오.

  • stdaddr — 주소의 요소들로 이루어진 합성 유형입니다. standardize_address 함수가 이 유형을 반환합니다.

12.1.3. 주소 표준화 도구 테이블

Abstract

이 단원에서 address_standardizer가 주소를 정규화하기 위해 이용하는 PostgreSQL 테이블 서식 목록을 소개합니다. 이 테이블들의 명칭을 여기에 소개된 대로 명명할 필요는 없다는 점에 주의하십시오. 예를 들어 각 국가 또는 사용자 지정 지오코딩 도구에 대해 서로 다른 어휘 목록(lex), 지명 색인(gaz), 규칙 테이블을 쓸 수 있습니다. 주소 표준화 도구 함수에 이 테이블들의 명칭을 넘겨줍니다.

패키징된 address_standardizer_data_us 확장 프로그램이 미국 주소를 표준화하기 위한 데이터를 담고 있습니다.

  • rules table — 규칙 테이블은 주소 입력 배열 토큰을 표준화된 출력 배열 토큰에 매핑하는 일련의 규칙들을 담고 있습니다. 입력 토큰들의 집합, 그 뒤에 -1(종결자; terminator), 그 뒤에 출력 토큰들의 집합, 그 뒤에 -1, 그 뒤에 규칙의 종류를 표시하는 번호, 그 뒤에 규칙의 순위를 나열해서 하나의 규칙을 정의합니다.
  • lex table — 어휘 목록(lex) 테이블은 영숫자 입력을 분류하고, 해당 입력을 (1) 입력 토큰(the section called “입력 토큰” 참조) 및 (2) 표준화된 표현식과 연관짓는 데 쓰입니다.
  • gaz table — 지명 색인(gaz) 테이블은 지명을 표준화하고, 해당 입력을 (1) 입력 토큰(the section called “입력 토큰” 참조) 및 (2) 표준화된 표현식과 연관짓는 데 쓰입니다.

12.1.4. 주소 표준화 도구 함수

  • debug_standardize_address — Returns a json formatted text listing the parse tokens and standardizations
  • parse_address — 한 줄로 된 주소를 입력받아 부분들로 분해합니다.
  • standardize_address — 어휘 목록, 지명 색인, 규칙 테이블을 활용해서 입력 주소의 stdaddr 형식을 반환합니다.

12.2. TIGER 지오코딩 도구

Abstract

A plpgsql based geocoder written to work with the TIGER (Topologically Integrated Geographic Encoding and Referencing system ) / Line and Master Address database export released by the US Census Bureau.

지오코딩 도구는 네 가지 구성 요소로 이루어져 있습니다: 데이터 로더 함수, 주소 정규화 도구, 주소 지오코딩 도구, 그리고 역 지오코딩 도구입니다.

TIGER 지오코딩 도구가 특별히 미국을 위해 설계되긴 했지만, 대부분의 개념 및 함수를 다른 국가의 주소 및 도로망과 함께 동작하도록 조정할 수 있습니다.

The script builds a schema called tiger to house all the TIGER-related functions, reusable lookup data such as road type prefixes, suffixes, states, various control tables for managing data load, and skeleton base tables from which all the TIGER-loaded tables inherit.

Another schema called tiger_data is also created which houses all the census data for each state that the loader downloads from the Census site and loads into the database. In the current model, each set of state tables is prefixed with the state code e.g ma_addr, ma_edges etc with constraints to enforce only that state data. Each of these tables inherits from the tables addr, faces, edges, etc located in the tiger schema.

All the geocode functions only reference the base tables, so there is no requirement that the data schema be called tiger_data or that data can't be further partitioned into other schemas -- e.g. a different schema for each state, as long as all the tables inherit from the tables in the tiger schema.

사용자 데이터베이스에서 확장 프로그램을 활성화하는 방법 및 이를 통해 데이터를 로드하는 방법에 대한 지침을 알고 싶다면, Section 2.4.1, “Tiger Geocoder Enabling your PostGIS database” 을 참조하십시오.

[Note]

If you are using the TIGER Geocoder (tiger_2010), you can upgrade the scripts using the accompanying upgrade_geocoder.bat / .sh scripts in extras/tiger. One major change between tiger_2010 and tiger_2011+ is that the county and state tables are no longer broken out by state. If you have data from tiger_2010 and want to replace with tiger_2015, refer to Section 2.4.4, “Upgrading your Tiger Geocoder Install and Data”

[Note]

You can install the TIGER Geocoder with the PostgreSQL extension model. Refer to Section 2.4.1, “Tiger Geocoder Enabling your PostGIS database” for details.

Pagc_Normalize_Address 함수는 내장된 Normalize_Address 함수와 바로 바꿔 쓸 수 있는 대체 함수입니다. 컴파일 및 설치 지침을 알고 싶다면 Section 2.3, “주소 표준화 도구 설치 및 활용” 를 참조하십시오.

설계:

이 프로젝트의 목표는 임의의 미국 주소 스트링을 처리하고, 정규화된 TIGER 인구조사 데이터를 이용해서 주어진 주소의 위치 및 해당 위치의 가능성을 반영한 포인트 도형 및 순위(rating)를 생성할 수 있는, 모든 기능을 갖춘 지오코딩 도구를 빌드하는 것입니다. 순위 번호가 높을수록 결과가 나빠집니다.

The reverse_geocode function is useful for deriving the street address and cross streets of a GPS location.

지오코딩 도구는 PostGIS에 익숙한 사람이라면 누구나 설치하고 이용할 수 있을 만큼 단순해야 하며, PostGIS가 지원하는 플랫폼 상에서 쉽게 설치하고 이용할 수 있어야 합니다.

지오코딩 도구는 서식 및 철자 오류가 있더라도 제대로 기능할 수 있을 만큼 강력해야 합니다.

지오코딩 도구는 향후 데이터를 업데이트, 또는 데이터소스를 대체하더라도 최소한의 코딩 변경만으로 이용할 수 있을 만큼 확장성을 갖춰야 합니다.

[Note]

지오코딩 도구 함수들이 제대로 동작하려면 데이터베이스 탐색 경로에 tiger 스키마를 추가해야만 합니다.

  • Drop_Indexes_Generate_Script — TIGER 스키마 및 사용자 지정 스키마에 있는 기본 키가 아닌 그리고 유일하지 않은 인덱스들을 모두 삭제하는 스크립트를 생성합니다. 스키마를 따로 지정하지 않을 경우 기본값인 tiger_data 스키마를 대상으로 합니다.
  • Drop_Nation_Tables_Generate_Script — 지정한 스키마에서 county_all, state_all 로 시작하는 테이블, 또는 뒤에 county, state 가 붙는 주(州) 코드를 모두 삭제하는 스크립트를 생성합니다.
  • Drop_State_Tables_Generate_Script — 지정한 스키마에서 주(州) 명칭의 약어가 접두사로 붙는 테이블을 모두 삭제하는 스크립트를 생성합니다. 스키마를 따로 지정하지 않을 경우 기본값인 tiger_data 스키마를 대상으로 합니다.
  • Geocode — 주소를 스트링(또는 다른 정규화된 주소)으로 입력받아 NAD83 경위도로 투영된 포인트 도형, 각 주소에 대한 정규화된 주소 및 순위를 포함하는 가능성 있는 위치들의 집합을 출력합니다. 순위가 낮을수록 주소와 위치가 일치할 가능성이 커집니다. 결과를 순위가 낮은 순서로 정렬합니다. 결과의 최대 개수(기본값 10) 및 restrict_region(기본값 NULL) 옵션 파라미터를 넘겨줄 수 있습니다.
  • Geocode_Intersection — 교차하는 도로 2개와 주, 시, 집코드를 입력받아 NAD83 경위도로 투영된 포인트 위치인 geomout, 각 위치에 대한 normalized_address (addy) 및 순위도 포함하는, 교차점에서 처음 가로지르는 도로에 있는 가능성 있는 위치들의 집합을 출력합니다. 순위가 낮을수록 주소와 위치가 일치할 가능성이 커집니다. 결과를 순위가 낮은 순서로 정렬합니다. 결과의 최대 개수(기본값 10) 옵션 파라미터를 넘겨줄 수 있습니다. TIGER 데이터(edge, face, addr) 및 PostgreSQL 퍼지 문자열 매칭(soundex, levenshtein)을 이용합니다.
  • Get_Geocode_Setting — tiger.geocode_settings 테이블에 저장된 특정 설정값을 반환합니다.
  • Get_Tract — 도형이 위치해 있는 구역(tract) 테이블로부터 인구조사 구역 또는 현장(field)을 반환합니다. 기본적으로 구역의 축약된 명칭을 반환합니다.
  • Install_Missing_Indexes — 지오코딩 도구의 결합(join)에 이용되는 키(key) 열을 가진 테이블을 모두 찾아서 해당 열에 쓰인 인덱스 가운데 없어진 것들에 대한 조건으로 필터링해서 없어진 인덱스들을 추가합니다.
  • Loader_Generate_Census_Script — 설정한 플랫폼에 대해 설정한 주(州)를 위한, TIGER 인구조사 주(州) 구역(tract), 블록 그룹(bg), 블록(tabblock) 데이터 테이블을 다운로드해서 tiger_data 스키마에 단계별로 로드하는 셸 스크립트를 생성합니다. 각 주(州)의 스크립트를 개별 레코드로 반환합니다.
  • Loader_Generate_Script — 설정한 플랫폼에 대해 설정한 주(州)를 위한, TIGER 데이터를 다운로드해서 tiger_data 스키마에 단계별로 로드하는 셸 스크립트를 생성합니다. 각 주(州)의 스크립트를 개별 레코드로 반환합니다. 최신 버전은 TIGER 2010 구조 변경 사항을 지원하며, 인구조사 구역, 블록 그룹, 블록 테이블도 로드합니다.
  • Loader_Generate_Nation_Script — 설정한 플랫폼에 대해, 군 및 주 색인 테이블을 로드하는 셸 스크립트를 생성합니다.
  • Missing_Indexes_Generate_Script — 지오코딩 도구의 결합(join)에 이용되는 키(key) 열을 가진 테이블 가운데 해당 열에서 없어진 인덱스를 모두 찾아서 해당 테이블에 대한 인덱스를 정의하는 SQL DDL을 출력합니다.
  • Normalize_Address — 문자형 도로 주소를 입력받아, 도로 접미사, 접두사 및 유형을 표준화하고 도로, 도로명 등을 개별 필드로 분해한 norm_addy 합성 유형을 반환합니다. 이 함수는 tiger_geocoder와 함께 패키징된 색인 데이터만 이용해서 (TIGER 인구조사 데이터는 필요없이) 작동할 것입니다.
  • Pagc_Normalize_Address — 문자형 도로 주소를 입력받아, 도로 접미사, 접두사 및 유형을 표준화하고 도로, 도로명 등을 개별 필드로 분해한 norm_addy 합성 유형을 반환합니다. 이 함수는 tiger_geocoder와 함께 패키징된 색인 데이터만 이용해서 (TIGER 인구조사 데이터는 필요없이) 작동할 것입니다. address_standardizer 확장 프로그램이 필요합니다.
  • Pprint_Addy norm_addy 복합 유형 객체를 입력받아, 해당 객체의 보기 좋은 인쇄용 표현을 반환합니다. 일반적으로 normalize_address 함수와 결합해서 쓰입니다.
  • Reverse_Geocode — 알려진 공간 참조 시스템으로 투영된 도형 포인트를 입력받아 이론적으로 가능한 주소들의 배열과 교차로의 배열을 담고 있는 레코드를 반환합니다. include_strnum_range = true일 경우, 교차로에 있는 도로 범위를 포함합니다.
  • Topology_Load_Tiger — PostGIS 지형에 TIGER 데이터의 정의된 지역을 로드하면서 TIGER 데이터를 지형의 공간 참조 시스템으로 변환하고 지형의 정확도 허용 오차에 스냅시킵니다.
  • Set_Geocode_Setting — 지오코딩 도구 함수들의 습성에 영향을 미치는 설정값을 설정합니다.

There are a couple other open source geocoders for PostGIS, that unlike the TIGER Geocoder have the advantage of multi-country geocoding support

  • Nominatim uses OpenStreetMap gazeteer formatted data. It requires osm2pgsql for loading the data together with PostgreSQL and PostGIS. It is packaged as a webservice interface and seems designed to be called as a webservice. Just like the TIGER Geocoder, it has both a geocoder and a reverse geocoder component. From the documentation, it is unclear if it has a pure SQL interface like the TIGER Geocoder, or if a good deal of the logic is implemented in the web interface.

  • GIS Graphy can utilize PostGIS and like Nominatim uses OpenStreetMap (OSM) data along with some other sources. It comes with a loader to load OSM data and similar to Nominatim is capable of geocoding not just US. Much like Nominatim, it runs as a webservice and relies on Java 1.5, Servlet apps, Solr. GisGraphy is cross-platform and also has a reverse geocoder among some other neat features.