공간정보를 표현하는 파일에는 ESRI shape, Geodatabase, DWG 등이 있다. DWG는 캐드에서 사용하는 파일이며, 벡터 중심이다. 파일 그대로를 GIS로 활용하기 어렵다. 어노테이션과 같은 데이터가 있지만 GIS용으로 변환이 어렵기 때문이다. (엄밀히 말해 변환은 되지만 시간 소모적) 따라서 GIS 파일에는 .shp와 .gdb가 일반적이며, 이 파일들은 QGIS(www.qgis.org), ArcGIS(www.arcgis.com)로 불러올 수 있다.
공간데이터는 주로 공간정보포털에서 다운로드 할 수 있다. 하지만 소스마다 좌표계가 다를 수 있어 주의해야 한다. 좌표계가 다르면 도면을 열어도 아래 그림처럼 엉뚱한 곳에 나타난다. 이 문제를 해결하려면 다운로드 받은 파일들의 좌표계를 확인하고, 모든 파일들을 동일한 좌표계로 통일(Define Projection)해야 한다.
공간정보포털에 등록된 연속지적도(data.nsdi.go.kr/dataset/12771)의 좌표계를 변경해 보고, 데이터베이스에 업로드하고, 카카오맵과 연동하기까지의 과정을 순차적으로 정리해 본다.
TM(Transverse Mercator)은 일제시대부터 사용하는 좌표계다. 일본이 수탈 목적으로 전 국토를 측량하면서 사용했다. 어렸을 때 보던 평면지도에 임의의 위치를 기준점(원점)으로 하고, 원점을 지나는 자오선을 X/Y축으로 측정하는 방식이다. 특정 지역 또는 국가에서는 사용 가능해도 전 세계를 하나로 만들긴 어렵다. 지금도 도시지역 아닌 곳에서 발급하는 지적도는 TM 좌표를 사용한다.
WGS84(World Geodetic System)는 미국 국방부가 군사적 목적으로 개발한 세계 측지 시스템이다. 지구의 질량중심을 기준점(원점)으로 하고, 3차원 상 위치를 측정한다. 지구 전체를 동일한 방식으로 측량할 수 있다. 러시아를 제외한 모든 국가에서 GPS로 사용하며, 국제민간항공기구(ICAO) 등 많은 기관에서 표준으로 사용하고 있다.
EPSG(European Petroleum Survey Group, 1986-2005)는 섬유 탐사과 관련된 측량과 지도를 연구하는 과학단체다. EPSG는 현재 널리 사용되는 'Geodetic Parameter Set'를 보급했다. 용어는 어려운데, 사실 세계에서 여러 좌표시스템에 숫자를 넣어 표준으로 코드화한 것이다.
지구는 둥글고 찌그러졌다. 표면도 일정하지 않다. 울퉁불퉁하다. 이런 타원체로는 위치를 특정할 수 없다. 과학자들은 이 문제를 해결하기 위해 지구를 표준적인 형태로 정의하려고 노력했다. 타원체에 대한 더 많은 이야기는 이 블로그(ryuhyun.tistory.com/m/58)를 참조하기 바란다.
베셀 타원체는 Bessel 1841로도 불리며, 1841년 프리드리히 빌헬름 베셀(Friedrich Wilhelm Bessel)이 제안하였다. 인공위성으로 측정한 지구 타원체보다 축이 약 700미터 짧다. 하지만 유럽과 아시아의 지오이드 곡률에 특히 잘 맞는다. (지역마다 지오이드 면에 잘 맞는 타원체가 다르다.) 한국과 일본에 사용하는 TM 좌표계의 기본이 된다.
GRS80는 "Geodetic Reference System 1980"의 약자다. 국제측지학 및 지구물리학 연합(IUGG)와 국제측지학협회(IGA)는 1909년 포츠담 중력값 관측, 1924년 국제지구타원체의 결정 및 1930년 국제중력식의 결정에 따라 지구의 형과 크기를 중력장으로 정의하고 이것을 측지 측량기준계(GRS)로 확립하였다. 이 기준은 여러번 개정을 거쳐 1979년 12월 IUGG/IGA 제17차 총회가 GRS80으로 결정하었다.
결론적으로 타원체는 3차원에서 위치를 정하기 위해 만들어진 지구본이다. 장반경(타원체 가로방향 반지름)과 편평률(타원체가 납작한 정도)을 어떻게 계산하느냐에 따라 베셀타원체, GRS80 타원체, WGS84 타원체로 나뉜다. 예컨데, Bessel 1841은 장반경을 6,377,397m로 측정한 반면, GRS80은 6,378,137m로 측정하였다. 이 둘의 편평률도 1/299 및 1/298로 다르다. 중력까지 감안한 타원체를 그릴 수 있다는 사실 자체가 대단하다.
한국에서 사용하는 주요 좌표계는 OSGeo 한국어지부 "한국 주요 좌표계 EPSG코드 및 proj4인자"(www.osgeo.kr/17)에 정리되어 있다. 좌표계 뿐만 아니라 변환에 필요한 계수들도 모두 게시되어 자세한 사항을 알 수 있다.
그렇다면 공간정보 파일의 좌표계는 어떻게 알 수 있을까? GIS 파일의 좌표계는 그 파일을 공개하는 웹사이트에서 제공한다. 예컨대 국가공간정보포털은 연속지적도를 shp 파일로 제공하면서, "GRS80 타원체, TM 중부원점"을 좌표계로 사용하였다고 기재했다(아래 그림 참조). 또한 행정구역 shp 파일은 "Bessel 보정된 중부원점(TM)"으로 등록되어 있다.
또한, *.prj 파일을 열면 WKT(Well-Known Text) 마크업 언어에 따른 좌표계를 확인할 수 있다. 위 연속지적도는 prj 파일을 살펴보면 "GRS 1980" 타원체를 사용하고, "중부원점 2010"임을 알 수 있다.
PROJCS["Korea 2000 / Central Belt 2010",
GEOGCS["Korea 2000",
DATUM["Geocentric datum of Korea",
SPHEROID["GRS 1980",
6378137.0,
298.257222101,
AUTHORITY["EPSG","7019"]
],
TOWGS84[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
AUTHORITY["EPSG","6737"]
],
PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]],
UNIT["degree", 0.017453292519943295],
AXIS["Geodetic longitude", EAST],
AXIS["Geodetic latitude", NORTH],
AUTHORITY["EPSG","4737"]
], <이하 생략>
카카오맵은 EPSG:5181 좌표계를 사용한다. EPSG:5181은 "GRS80 및 TM 중부원점" 좌표계를 말한다. 따라서 연속지적도와 카카오맵은 좌표계가 동일하고, QGIS와 ArcGIS에서 중첩도 가능하다. 그 밖에 주요 지도의 좌표계는 다음과 같다.
카카오 지도 자체는 EPSG:5181를 사용하지만 API는 WGS84를 사용하므로, 카카오 지도에 무언가를 표시하고 싶다면 좌표계를 WGS84로 통일해야 한다.공간정보포털에 있는 자료는 좌표계를 WGS84로 변환하여, 카카오맵에 연동할 수 있다. 아래의 코드는 카카오맵에 WGS84 좌표로 선(polyline)을 그리는 API다. kakao.maps.LatLng의 파라미터로서, WGS84에 따른 경도와 위도를 사용하는 것을 알 수 있다.
var polyline = new kakao.maps.Polyline({ map: map, // 선을 표시할 지도 객체 path: [ // 선을 구성하는 좌표 배열 new kakao.maps.LatLng(37.56691, 126.97649), new kakao.maps.LatLng(37.56791, 126.97749), new kakao.maps.LatLng(37.56791, 126.97649), new kakao.maps.LatLng(37.56891, 126.97749) ], strokeWeight: 7, // 선의 두께 strokeColor: '#FF0000', // 선 색 strokeOpacity: 0.9, // 선 투명도 strokeStyle: 'solid' // 선 스타일 }); ㅤ https://apis.map.kakao.com/web/wizard/
좌표 변환은 ArcGIS보다 QGIS가 편하다. QGIS 3.10.3 이상에서는 우리나라 타원체 변환을 위해 추가로 계수를 입력하지 않아도 된다. QGIS가 국토지리정보원이 고시한 Molodensky-Badekas 10계수를 자동으로 불러와 처리하기 때문이다. 그래서 변환이 단순하다. 먼저 QGIS에서 shp 도면을 불러오고, 추가된 도면 레이어를 export 하면서 좌표계를 지정하면 그 좌표계로 저장된다. 좌표계는 필요에 따라 선택한다. WGS84 좌표가 필요하다면, EPSG:4326을 검색하여 지정한다. 또한, 인코딩을 UTF-8로 변경해야 한다. 정부에서 사용 중인 파일들이 대부분 EUC-KR(cp949) 코드를 사용하기 때문이다.
파이썬에는 GIS 관련 라이브러리가 있다. Geopandas가 대표적이다. Geopandas는 shp 파일의 좌표변환부터 데이터 분석까지 처리할 수 있다. 좌표계 변환은 Geopandas로 파일을 로드하고, to_crs 메소드로 좌표계를 설정하여 내보내면 된다.
import geopandas as gpandas
from datetime import datetime
print(f"Started at: {datetime.now()}")
data = gpandas.read_file("LSMD_CONT_LDREG_41_202311.shp")
data = data.to_crs(epsg=4326)
data.to_file("연속지적도_epsg4326.shp")
print(f"Finished at: {datetime.now()}")
하지만 Geopandas는 QGIS보다 처리 속도는 느린 것으로 확인되었다. i7 12700 CPU로 경기도 전체 연속지적도(5백만 건 공간데이터, 1.32GB)를 변환하는데 Geopandas로 12분 소요되었다. QGIS는 처리시간이 3분 남짓이었다. (파이썬에서 멀티쓰레드로 처리할 수 없다면 속도 개선은 어려워 보인다.)
PS F:\GIS\geopandas>
PS F:\GIS\geopandas> python geo.py
Started at: 2023-12-03 21:18:08.518849
Finished at: 2023-12-03 21:31:53.861855
PS F:\GIS\geopandas>
공간정보를 저장하려면 데이터베이스가 공간정보 데이터 타입을 지원해야 한다. 다행히 MySQL, MariaDB, PostgreSQL, Redis 모두 공간정보 데이터 타입(Spatial Data type, Geometry)을 지원한다. 그렇다면 어떤 데이터베이스가 효율적일까?
MySQL과 PostgreSQL의 성능을 비교한 결과, MySQL 보다 PostgreSQL이 더 빠른 것으로 나타났다. PostgreSQL은 뛰어난 안정성, 유연성, 개방형 기술 표준 지원으로 잘 알려져 있는 오픈 소스 데이터베이스다. 또한, 무료고, 빠르고, QGIS와 연동되는 만큼 PostgreSQL에 shp 파일을 넣어보도록 하겠다.
PostgreSQL 자체는 공간정보 데이터 타입을 지원하지 않는다. PostGIS 확장 모듈을 설치해야 비로소 공간데이터 타입을 사용할 수 있다. PostGIS는 PostgreSQL에 공간데이터를 저장, 인덱싱, 쿼리 기능을 제공함으로써 PostgreSQL 기능을 확장한다. 먼저 로케일을 ko_KR.UTF-8로 변경하고, PostgreSQL를 설치한 후, 마지막으로 PostGIS를 설치한다.
로케일 변경은 데이터베이스를 생성할 때 한국어(ko_KR.UTF-8)를 사용하기 위해 필요하다. PostgreSQL의 로케일은 시스템 설정을 따르는 만큼, 우분투 로케일이 en_US.UTF-8로 설정되었다면, PostgreSQL도 같은 인코딩 코드로 설정된다. 시스템 자체의 로케일 변경하고 설치하는 것이 좋다. 로케일 변경은 이 블로그(beomi.github.io)를 참조하였다.
$ locale -a
C
C.utf8
en_US.utf8
POSIX
$ sudo apt install language-pack-ko
$ sudo locale-gen ko_KR.UTF-8
Generating locales (this might take a while)...
ko_KR.UTF-8... done
Generation complete.
$ sudo dpkg-reconfigure locales
Generating locales (this might take a while)...
en_US.UTF-8... done
ko_KR.UTF-8... done
Generation complete.
$ sudo update-locale LANG=ko_KR.UTF-8 LC_MESSAGES=POSIX
$ sudo vi /etc/default/locale
LANG=ko_KR.UTF-8
LC_MESSAGES=POSIX
우분투에서 PostgreSQL은 apt 명령어를 통해 손쉽게 설치할 수 있다. 현재, 버전 14가 설치된다. PostgreSQL에 로그인하기 위해 별도로 우분투 계정(계정명: postgres)을 사용한다는 점에서 MariaDB와 차이가 있다. 따라서 계정 비밀번호와 접속 비밀번호 2개를 설정해야 한다.
<PostgreSQL 설치>
$ sudo apt install postgresql postgresql-contrib
.
.
The database cluster will be initialized with locales
COLLATE: ko_KR.UTF-8
CTYPE: ko_KR.UTF-8
MESSAGES: C
MONETARY: ko_KR.UTF-8
NUMERIC: ko_KR.UTF-8
TIME: ko_KR.UTF-8
<접속 계정 설정>
$ sudo passwd postgres ## 우분투 postgres 계정 비밀번호 설정
$ sudo -i -u postgres ## 계정변경
$ psql
postgres=# alter user postgres password '신규 패스워드';
postgres=# commit;
postgres=# \q
또한, 외부 접속을 허용하려면 ufw 방화벽와 H/W 방화벽의 포트를 개방하고, PostgreSQL 설정파일도 접근을 허용하도록 변경해야 한다. listen_addresses에는 아이피만 쓰면 오류발생하므로 /0, /16, /32 등과 같이 Subnet Mask와 함께 사용해야 한다.
<외부접근 허용 ??>
$ sudo vi /etc/postgresql/14/main/postgresql.conf
listen_addresses = '127.0.0.1, 100.100.100.2' # 'localhost' 콤마로 리스트에 넣으면 에러
port = 5432
$ sudo vi /etc/postgresql/14/main/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
host all all 100.100.100.2 scram-sha-256
<외부접근 허용>
$ sudo vi /etc/postgresql/14/main/postgresql.conf
listen_addresses = '*'
port = 5432
$ sudo vi /etc/postgresql/14/main/pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 md5
$ systemctl restart postgresql
PostGIS 설치도 단순하다. PostgreSQL 버전에 맞춰 설치하면 된다.
$ psql --version
psql (PostgreSQL) 14.9 (Ubuntu 14.9-0ubuntu0.22.04.1)
<Version ~14>
$ sudo apt install postgis postgresql-postgis postgresql-postgis-scripts
<Version 15~>
$ sudo apt install postgis postgresql-15-postgis-3 postgresql-15-postgis-3-scripts
* 문제발생
PostGIS가 정상적으로 설치되었는데도 QGIS에서 shp 파일을 PostgreSQL에 업로드하려고 할 때, 도형 열(Geometry) 체크박스가 비활성화되어 있는 경우가 있다.* PostgreSQL로 import하면 할 때 에러 발생 : function addgeometrycolumn(unknown, unknown, unknown, integer, unknown, integer) does not exist * QGIS PostGIS import 메뉴에서 체크 박스 비활성화 : 도형 열(Geomery Column)와 원본 SRID(Source SRID), 대상 SRID(Target SRID)가 비활성
* 해결방법
콘솔 psql your_db -c "CREATE EXTENSION postgis";
디비 \c yourdb -> CREATE EXTENSION postgis;
공간데이터 업로드는 QGIS, shp2pgsql, pgAdmin(www.pgadmin.org) 등을 이용한다. QGIS는 PostgreSQL(PostGIS)을 지원하는 만큼 QGIS에서 PostgreSQL을 연결하여 공간 데이터를 넣는다. QGIS로 업로드할 때, Geometry 관련 체크박스가 비활성화된 경우 6.3절의 방법으로 해결한다.
Important Note: The "Integrate" tool will modify the coordinates directly in the existing dataset. If you want to keep the original data unchanged, it's recommended to make a backup or create a copy of your dataset before using the "Integrate" tool.
QGIS를 통해 대량의 공간데이터를 원격 데이터베이스로 업로드하면 시간이 과도하게 소요된다. 연속지적도 5,153,260건을 업로드하는 데 5시간 이상이 소요되었다. 업로드 자체의 속도를 개선하는 방법을 검토했으나 큰 수확은 없었다. post-indexing도 해결방법이 아니었다. (하지만 공간인덱스 생성은 업로드 후 생성할 것)
그나마 가장 빠른 방법은 로컬에서 작업하는 것이다. 로컬 PC에 PostgreSQL을 설치하고, 로컬PC → 로컬DB로 로컬 업로드(10분 이내)한다. 업로드가 완료되면 테이블을 csv로 백업(17초)해서 원격DB에 복원(86초)한다. 이제 참을 수 있는 시간대로 진입하였다.
백업 및 복원방법
1. (로컬) 테이블 export data 2. (로컬) scp -P port file.csv id@server.kr:/home/id/file.csv 3. (PSQL) CREATE TABLE <아래 그림처럼 테이블 정보 가져옴> 4. (PSQL)\copy jijukdo_gg2 from /var/lib/postgresql/file.csv delimiter ','
업로드된 공간 데이터를 PostgreSQL에서 조회해 본다. 기존 dbf 파일에 없는 "geom"이라는 필드가 추가되었다. "geom" 필드는 폴리곤 등의 좌표값이 숫자로 나열된 것으로, WKB(Well-Known Binary) 표준을 따른다.
@ WKT vs WKB
WKT(Well-Known Text)는 벡터도형(Vector Geometry Object)을 문자로 표현한 마크업 언어다. 예를 들어 WKT의 한 점(x=30, y=10)은 "POINT(30 10)"으로 표현된다. 이 WKT를 바이너리로 변환한 것이 WKB다.
* WKT = POINT(30 10) * WKB = 01010000000000000000003e400000000000002440 * GeoJSON = {"type":"Point","coordinates":[30,10]} # 출처 : rodic.fr/wp-content/uploads/2015/11/geom_converter.html
@ ERROR: permission denied for table (SQL state: 42501)
PostgreSQL은 DB 사용권한과 별개로 테이블에 대한 사용권한을 부여해야 한다. 테이블 권한이 없으면 HeidiSQL, pgAdmin에서 위와 같은 에러가 발생한다.
GRANT INSERT, SELECT, UPDATE, DELETE ON <tb이름> TO id;
ㅤ
테이블을 조회해보자! "geom"은 16진수(WKB)로 표현되어 있다.
<조회쿼리>
select id, pnu, coo_x, coo_y, geom from jijukdo limit 1;
<검색결과>
id | pnu | coo_x | coo_y | geom
----+---------------------+---------------+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 | 4119011800100100006 | 126.801664739 | 37.5167699251 | 0106000020E6100000010000000103000000010000000B000000E0B38CDD4AB35F407398720722C24240004744DE4AB35F40C0EA44A629C24240F4DC6B824BB35F401AC611A629C2424073CB5F824BB35F406DF0E52C2BC24240BF77AF184EB35F40A228CC2C2BC242405491BD
ㅤ
"geom" 필드를 WKT로 바꾸자! PostGIS의 "ST_AsText" 쿼리함수로 WKB를 WKT로 변환할 수 있다.
<조회쿼리>
select id, pnu, coo_x, coo_y, ST_AsText(geom) from jijukdo limit 1;
<검색결과>
id | pnu | coo_x | coo_y | st_astext
----+---------------------+---------------+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 | 4119011800100100006 | 126.801664739 | 37.5167699251 | MULTIPOLYGON(((126.80144442310802 37.51666348548397,126.80144459407529 37.516896041537166,126.80148373158937 37.51689601772178,126.80148372034982 37.51694260814188,126.80164162765048 37.51694259613693,126.80185597908468 37.516942508153,126.80185583264047 37.5167851852075,126.80185567885424 37.516545700527814,126.80168395454801 37.516594883762956,126.8014783830034 37.51665382126589,126.80144442310802 37.51666348548397)))
# 단순 재정리
MULTIPOLYGON(((
126.80144442310802 37.51666348548397,
126.80144459407529 37.516896041537166,
126.80148373158937 37.51689601772178,
126.80148372034982 37.51694260814188,
126.80164162765048 37.51694259613693,
126.80185597908468 37.516942508153,
126.80185583264047 37.5167851852075,
126.80185567885424 37.516545700527814,
126.80168395454801 37.516594883762956,
126.8014783830034 37.51665382126589,
126.80144442310802 37.51666348548397
)))
ㅤ
사각형 내부에 포함되거나, 사각형 경계선에 걸리는 폴리곤을 모두 찾아내는 공간쿼리를 만들어보자!
<조회쿼리>
SELECT pnu FROM jijukdo
WHERE geom && ST_MakeEnvelope(126.75441, 37.51221, 126.75701, 37.50907, 4326);
// 왼쪽 TOP 경도, 왼쪽 TOP 위도, 오른쪽 BOTTOM 경도, 오른쪽 BOTTOM 위도
<검색결과>
4119010900105270001
4119010900105270003
4119010900106290000
4119010900105260001
4119010900105260008
4119010900105260007
4119010900105260004
4119010900105000002
4119010900105000003
4119010900105260003
4119010900105260002
4119010900105000005
――――――――――――――――――
* 공간 인덱싱을 잊지 말자
Indexing 전, 소요시간: 606.904ms
Indexing 후, 소요시간: 1.917ms
――――――――――――――――――
<인덱스 생성>
CREATE INDEX <테이블명>_geom_index on <테이블명> USING gist (geom);
※ 위 쿼리를 통해 찾아낸 폴리곤을 화면에 보여준 예시
from django.contrib.gis.geos import Polygon
from myapp.models import PolygonModel
reference_polygon = Polygon([(0, 0), (0, 10), (10, 10), (10, 0), (0, 0)])
polygons_contained = PolygonModel.objects.filter(geometry__contained=reference_polygon)
polygons_within = PolygonModel.objects.filter(geometry__within=reference_polygon)
1. 한국 주요 좌표계 EPSG코드 및 proj4 인자
https://www.osgeo.kr/17
2. European Petroleum Survey Group
https://wiki.gis.com/wiki/index.php/European_Petroleum_Survey_Group
3. Spatial Reference List
https://spatialreference.org/ref/epsg/
4. 동경측지계와 WGS-84 - 국토지리정보원 제공
https://m.cafe.daum.net/newguidepoint/DERy/5368?listURI=%2Fnewguidepoint%2FDERy
5. 네이버 지도, 카카오맵 좌표계
https://bogyum-uncle.tistory.com/175
6. pyproj와 Geopandas 중 무엇이 더 빠를까? (2023.06)
https://thlee33.medium.com/%EC%A2%8C%ED%91%9C%EB%B3%80%ED%99%98%EC%97%90-%EB%AC%B4%EC%8A%A8-%ED%8C%A8%ED%82%A4%EC%A7%80%EB%A5%BC-%EC%93%B0%EB%A9%B4-%EC%A2%8B%EC%9D%84%EA%B9%8C-2023-06-556be8fb82d8
7. Geopandas 분석 (2) 좌표변환
https://yeahyejiee.github.io/geopandas/geopandas-%EB%B6%84%EC%84%9D-(2)-%EC%A2%8C%ED%91%9C%EB%B3%80%ED%99%98/
8. PostgreSQL에 shp 파일 import 하는 법
https://velog.io/@dailylifecoding/import-shp-data-with-postgresql-and-qgis
9. MySQL vs PostGIS (Postgresql) 범위 질의 성능 비교
https://steemit.com/kr-dev/@tmkor/db-2-mysql-vs-postgis-postgresql
00. Postgis installation: type "geometry" does not exist
https://stackoverflow.com/questions/6850500/postgis-installation-type-geometry-does-not-exist
00. Redis 현재 위치에서 가까운 정류장 찾기
https://wonyong-jang.github.io/bigdata/2021/05/12/BigData-Redis-Geospatial.html
00. 카카오맵 API 원, 선, 사각형, 다각형 표시하기
https://apis.map.kakao.com/web/sample/drawShape/
1. GeoPandas에서 사용자 좌표계 다루기
https://thlee33.medium.com/python-geopandas%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A2%8C%ED%91%9C%EA%B3%84-%EB%8B%A4%EB%A3%A8%EA%B8%B0-d20d83278b86
2. [GIS] WKT(Well-Known Text) Geometry
http://www.gisdeveloper.co.kr/?p=994