기본적으로 Feature와 FeatureCollection, 그리고 Geometry 타입으로 구성
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [102.0, 0.5]
},
"properties": {
"prop0": "value0"
}
},
]
}
가장 핵심적인 부분으로, 위치와 형태를 포함
6가지 데이터 타입 존재:
| 타입 | 설명 | 예시 |
|---|---|---|
| Point | 단일 점(좌표 [경도, 위도], WGS84만 허용) | [126.9779692, 37.566535] |
| LineString | 선 (좌표(점)들의 배열) | [[126.9, 37.5], [127.0, 37.6]] |
| Polygon | 다각형 (좌표 배열의 배열, 닫힌 경로 = 첫 점과 끝 점이 같음) | [[[x1,y1],[x2,y2],...[x1,y1]]] |
| MultiPoint | 여러 점 | [[x1,y1], [x2,y2]] |
| MultiLineString | 여러 선 | [[[x1,y1],[x2,y2]], [[x3,y3],[x4,y4]]] |
| MultiPolygon | 여러 다각형 | [[[[x,y],...]], [[[x,y],...]]] |
| GeometryCollection | 다양한 Geometry를 묶는 컨테이너 | { "geometries": [ ... ] } |
"geometry": {
"type": "Point",
"coordinates": [126.9784, 37.5666]
},
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [126.9784, 37.5666]
},
"properties": {
"name": "서울시청",
"category": "government"
}
}
{
"type": "FeatureCollection",
"features": [
{...}, {...}
]
}
왜 사용할까?
TopoJSON은 GeoJSON의 상위 개념으로, 공간 데이터를 더 압축하고 효율적으로 표현하기 위해 토폴로지(위상 정보)를 포함한 JSON 포맷
| GeoJSON | TopoJSON | |
|---|---|---|
| 기본 단위 | Feature = 좌표들의 모음 | Topology = 공유되는 경계(arc)를 참조 |
| 중복 제거 | 없음 (경계가 중복됨) | 있음 (경계는 1회 정의 후 참조) |
| 파일 크기 | 크다 (좌표 중복 많음) | 작다 (좌표 중복 제거) |
| 데이터 구조 | 직접 좌표 포함 | 경계를 별도 정의 (arcs), 그걸 참조함 |
| 호환성 | 대부분 라이브러리에서 직접 지원 | 일부 라이브러리는 변환 필요 (topojson-client) |
| 좌표계 | WGS84만 허용 (RFC 7946) | 좌표계 자유도 있음 |
GeoJSON은 경계가 중복되기 때문에 다음 문제가 생김:
TopoJSON 사용을 통해 공유되는 경계는 한 번만 정의할 수 있게 됨
{
"type": "Topology",
"arcs": [
[[0, 0], [10, 0], [0, 10]]
],
"objects": {
"example": {
"type": "GeometryCollection",
"geometries": [
{
"type": "Polygon",
"arcs": [[0]]
}
]
}
}
}