길그림 데이터 출처와 ODbL 안내
Data sources and ODbL notice — 길그림 (Gilgrim)
1. 출처 표시
© OpenStreetMap contributors
길그림의 보행 길 정보와 코스는 OpenStreetMap 데이터를 가공한 것입니다. OpenStreetMap 데이터는 Open Database License(ODbL) 1.0 으로 제공됩니다. 출처와 라이선스 정보는 https://www.openstreetmap.org/copyright 에서 볼 수 있습니다.
Contains information from OpenStreetMap, which is made available here under the Open Database License (ODbL).
2. 코스 데이터는 ODbL 파생 데이터베이스입니다
길그림이 앱에 제공하는 코스 카탈로그(구역별 코스 JSON 과 색인)는 OpenStreetMap 데이터에서 만든 파생 데이터베이스입니다. 이 카탈로그는 ODbL 1.0 에 따라 같은 조건(ODbL)으로 제공합니다. 앱에서 코스를 계산하는 과정에서 만든 개별 경로 안내 하나하나가 아니라, 미리 만들어 둔 카탈로그 전체가 대상입니다.
길그림 앱·서비스 자체의 지식재산권은 나란에 있으며, 이 안내는 OpenStreetMap 에서 만든 데이터베이스에 대한 것입니다.
3. 파생 데이터베이스 제공 방법
ODbL 제4.6항에 따라 아래 두 가지를 모두 무료로 제공합니다.
| 방법 | 내용 |
|---|---|
| (a) 생성 방법 문서 | 카탈로그를 OpenStreetMap 에서 어떻게 만드는지(보행 태그 규칙, 그래프 조립, 코스 생성 방법과 파일 필드 정의)를 이 페이지 아래 7. 생성 방법 문서 전문에 모두 적었습니다. 요청 없이 누구나 읽을 수 있습니다. |
| (b) 파생 데이터베이스 전체(코스 카탈로그·보행 그래프) | 이메일 contact@naranstudio.com 로 요청하시면 무료로 내려받을 수 있는 링크를 보내 드립니다. 처리 기한: 요청을 받은 날부터 14일 이내. |
요청하는 방법
- 제목에 "길그림 ODbL 파생 데이터베이스 요청" 이라고 적어 contact@naranstudio.com 으로 보내 주세요.
- 본문에는 보내 주실 이메일 주소 말고는 적지 않아도 됩니다. 위치, 이름, 전화번호 같은 개인정보는 적지 마세요.
- 받으시는 파일은 하나의 압축 파일(zip 또는 tar.gz)이며 안에 다음이 들어 있습니다: 구역별 코스 JSON 과 색인(
catalog/…), ODbL 고지와 전문(LICENSE-ODbL.txt), 설명(README.txt), 파일 목록·해시·입력 데이터 시점(MANIFEST.json), 생성 방법 문서.
| 항목 | 내용 |
|---|---|
| 제공 범위 | 서비스 중인 국내 지역의 코스 카탈로그(수도권 47개 구역과 그 밖의 국내 지역). 서비스 지역이 늘면 제공 범위도 같이 늘립니다. |
| 데이터 기준일 | 2026-09-22 (OpenStreetMap 스냅샷 기준, 정확한 시각은 MANIFEST.json 의 graphVersions) |
| 라이선스 | Open Database License(ODbL) 1.0 |
| 요청 연락처 | contact@naranstudio.com |
4. 개인정보는 들어 있지 않습니다
카탈로그의 좌표는 모두 OpenStreetMap 에 있는 공개 도로 위의 점입니다. 이용자의 위치, 설치 ID, 요청 정보는 카탈로그에 들어 있지 않으며, 제공 파일을 만들 때 그런 이름의 항목이 없는지 검사합니다. 위치는 코스를 계산하는 동안에만 쓰고 저장하지 않습니다. 개인정보 처리에 관한 내용은 개인정보 처리방침을 보세요.
5. 라이선스 전문
- Open Database License(ODbL) 1.0 전문: https://opendatacommons.org/licenses/odbl/1-0/
- OpenStreetMap 저작권·라이선스 안내: https://www.openstreetmap.org/copyright
- 위치기반서비스 이용약관 제16조 (지도 데이터 및 지식재산)
6. English summary
Attribution. Walking-path information and running courses in Gilgrim are derived from OpenStreetMap data. © OpenStreetMap contributors. The data is available under the Open Database License (ODbL) 1.0; see https://www.openstreetmap.org/copyright.
Derivative database. The course catalog (one JSON file per district plus an index) is a Derivative Database of OpenStreetMap data and is offered under the ODbL. It contains only points on public roads; it contains no user location, install ID, or request data.
How to get it. (a) The method of making the catalog (walkability tag rules, graph assembly, course generation, field definitions) is published in full below in section 7 (Korean, with an English summary at its end). (b) The entire derivative database is available free of charge: email contact@naranstudio.com with the subject "Gilgrim ODbL derivative database request" and we will send a download link within within 14 days of your request. Please do not include any personal information or location in your request. The package contains the catalog files, LICENSE-ODbL.txt, README.txt, MANIFEST.json and the method document.
7. 생성 방법 문서 전문
아래는 ODbL 제4.6항 (b) 의 "변경 방법"으로 제공하는 문서 전문입니다. 같은 내용을 담은 파일(derivative-db-method.md)이 제공 패키지에도 들어 있습니다.
문서 버전: 2026-10-28 초판 · 운영자: 나란(naranstudio.com) · 문의: contact@naranstudio.com
공개 안내 페이지: https://naranstudio.com/gilgrim/odbl
이 문서는 "길그림 코스 카탈로그"(파생 데이터베이스)가 OpenStreetMap 데이터에서 어떻게 만들어지는지를, 같은 입력에서 같은 종류의 결과를 다시 만들 수 있을 정도로 적은 것이다. ODbL 1.0 제4.6항은 파생 데이터베이스를 공개적으로 사용하는 자가 수령자에게 (a) 파생 데이터베이스 전체 또는 (b) "원본과 파생 데이터베이스의 모든 차이를 이루는 변경 사항을 담은 파일 또는 변경 방법(예: 알고리즘)"을 기계가 읽을 수 있는 형태로 제공하도록 한다. 이 문서는 (b) 의 "변경 방법"에 해당하는 설명이고, (a) 는 같은 안내 페이지에서 요청 시 제공한다. 이 문서에는 좌표(위도·경도)나 이용자 정보가 없다. 코드 안의 비밀값·서버 주소·키도 적지 않았다. 법적 효력에 대한 판단이 아니라 기술 설명이다. 이 문서가 4.6(b) 를 충족하는지에 대한 법률 전문가의 확인은 아직 받지 않았다([확인 필요]).
0. 한눈에 보기
OSM 원본(Geofabrik 국가별 추출 .osm.pbf)
└─① 보행 태그 규칙으로 걸을 수 있는 way 만 고른다
└─② 노드 좌표를 붙여 보행 그래프(CSR)를 만든다 — 간선 길이·계단 비트·구역 배정
└─③ 구역마다 시드 격자점을 잡고, 6가지 모양 x 3가지 거리로 모양선을 놓아 길에 맞춘 뒤(맵매칭) 합격한 코스만 JSON 카탈로그로 저장한다- ①②의 산출물(보행 그래프)은 OpenStreetMap 데이터의 파생 데이터베이스이며 서비스 서버 안에서만 쓴다(조직 내부 사용은 공개 사용이 아니라는 ODbL 4.5(c) 에 따른 해석이며, 법률 전문가 확인 전이다 [확인 필요]). 다만 공유 조건을 넓게 지키기 위해, 이 그래프도 코스 카탈로그와 같은 방식으로 요청하면 무료로 제공한다(2026-10-28 운영자 위임 결정).
- ③의 산출물(코스 카탈로그)은 앱에 제공하는 코스의 원천이다. 이 문서와 함께 제공하는 패키지가 바로 이것이다.
1. 입력 — OSM 스냅샷
| 구분 | 내용 |
|---|---|
| 출처 | Geofabrik 국가·지역별 추출본(*-latest.osm.pbf), OpenStreetMap 데이터, © OpenStreetMap contributors, ODbL 1.0 |
| 대한민국(서울·경기·인천·전국 샤드) | south-korea-latest.osm.pbf (287,765,288 바이트, md5 b5214eac6cc39075d254ec4d8531c6d0), OSM replication timestamp 2026-09-22T20:22:59Z (그래프·카탈로그의 graphVersion 값과 같다) |
| 해외(시범 도시, 이 패키지에는 아직 없음) | 도쿄·오사카 등 일본 권역, 미국 주 단위, 호주 추출본 — 모두 replication timestamp 2026-10-25T21:21:21Z |
| 보관 | Geofabrik 의 "latest" 파일은 계속 갱신되므로 같은 바이트를 다시 받을 수는 없다. 이 timestamp 시점의 OSM 데이터가 입력이었다는 기록만 있다. 같은 종류의 결과를 얻으려면 다른 시점의 추출본으로 같은 절차를 돌리면 된다(결과는 OSM 편집에 따라 달라진다). |
2. 단계 ① — 보행 가능 way 선택 (보행 태그 규칙)
OSM 의 way(길 선) 하나하나를 태그로 판정한다. 아래는 실제 판정 코드(국내용·해외용)의 판정 순서를 그대로 옮긴 것이다. 위에서부터 먼저 걸리는 규칙이 이긴다.
2.1 국내(대한민국) 규칙
사용하는 집합:
- 목록 HW =
footway, path, pedestrian, steps, living_street, track, corridor, residential, unclassified, tertiary, tertiary_link, secondary, secondary_link, primary, primary_link, service, road, cycleway - foot 거부값 =
no, private, use_sidepath/ foot 허용값 =yes, designated, permissive, destination - access 거부값 =
no, private, permit, agricultural, forestry, customers, delivery
| 순서 | 조건 | 결과 |
|---|---|---|
| 1 | way 에 highway 도 foot 도 없음, 또는 highway ∉ HW 이면서 foot ∉ 허용값 | 제외(대상 아님) |
| 2 | foot ∈ 거부값 | 제외 |
| 3 | foot ∉ 허용값 이면서 access ∈ access 거부값 | 제외 |
| 4 | area=yes | 제외 |
| 5 | indoor=yes | 제외 |
| 6 | 노드가 2개 미만 | 제외 |
| 7 | 그 밖 | 포함 |
- 효과: 목록 HW 안의 도로는 기본 포함이고, motorway·trunk·construction·busway·proposed 등 목록 밖 highway 는
foot가 허용값(yes 등)으로 명시된 경우에만 포함된다(코드에 별도의 "금지 highway" 집합이 있으나, 목록 밖이면 이미 1번에서 걸러지므로 결과는 위 표와 같다).foot허용값은access거부를 이긴다. - 간선 속성 비트(way 의 태그에서 정해 그 way 의 모든 간선에 붙인다):
1=highway=steps(계단),2=track,4=service,8=cycleway,16=surface∈ {unpaved, gravel, dirt, ground, sand}. - 근거 문서(운영자 내부): 보행 프로필 v2. 자전거도로(
cycleway)는 한국에서 하천변 보행 겸용이 많아 포함한다.
2.2 해외 규칙(국가별 v2) — 이 패키지에는 해외 카탈로그가 없지만 그래프 생성 방법으로 적는다
국내 규칙의 1~7번 순서를 기본으로 하되, 태그 값을 먼저 정규화한다(OPL 이스케이프 복호, 앞뒤 공백 제거, 소문자화, ; 다중값은 부분값으로 쪼개 거부값이 하나라도 있으면 거부 / 허용값은 가장 강한 것 사용 / area·indoor·motorroad·expressway·tunnel 은 yes 가 하나라도 있으면 yes). 그 뒤 판정 순서:
| 순서 | 조건 | 결과 |
|---|---|---|
| 1 | foot ∈ 거부값 | 제외 |
| 2 | highway ∈ {motorway, motorway_link} | 제외(foot=yes 여도) |
| 3 | motorroad=yes | 제외 |
| 4 | highway ∈ {construction, proposed} | 제외(foot=yes 여도) |
| 5 | highway ∈ {trunk, trunk_link} 이면 별도 가드 — 아래 | |
| 6 | 그 밖은 국내와 같은 공통 규칙(목록 HW·foot 허용·access 거부·area·indoor·노드 2개 이상) |
trunk 계열 가드: "보행 증거(EV)" = sidewalk* 계열에 both/left/right/yes/separate 가 있거나, foot=designated, 또는 (foot=yes 이고 보도 없음 명시가 아님). "보도 없음 명시(SIDE_NO)" = sidewalk 계열이 모두 no/none.
- 일본: SIDE_NO 이고
foot≠designated→ 제외 / trunk_link 는 EV 없으면 제외 / trunk 에서expressway=yes·tunnel=yes·maxspeed>60(숫자 km/h 로 읽히는 경우에만) 이면서 EV 없으면 제외 / 그 밖 포함. - 미국·호주: trunk·trunk_link 는 EV 가 있을 때만 포함.
- 간선 비트는 국내와 같다(정규화한
highway로 판정).
3. 단계 ② — 보행 그래프(CSR) 조립
- 선택된 way 의 노드 참조(node id)를 모으고, 그 노드의 좌표(경도·위도 x 10^7 의 32비트 정수)만 원본에서 읽는다.
- way 안에서 연속한 두 노드마다 양방향 간선 2개를 만든다. 좌표가 없는 노드가 하나라도 있는 way 는 통째로 제외한다. 병렬 간선은 합치지 않고, 길이 0 m 간선도 유지한다.
- 간선 길이 = 두 노드 사이의 haversine 거리(지구 반지름 6,371,000 m)를 정수 미터로 반올림(16비트, 65,535 초과는 65,535로 고정). 간선 속성 비트는 2.1 의 값을 그대로 복사한다.
- 간선에 참여하는 노드만 남겨 OSM node id 오름차순으로 0..N-1 번호를 다시 매긴다. 간선은 (출발 노드 번호, 도착 노드 번호) 순으로 정렬해 CSR 배열(
indptr·indices·lengths·flags)과 노드 좌표 배열(coords)로 저장한다. - 구역 배정: 행정구역 relation(
boundary=administrative,admin_level6 = 시·군·구, 세종은 4)의 경계 way 를 끝점이 같은 것끼리 이어 폐곡선(outer/inner)으로 만든다. 노드가 구역 다각형 안(even-odd 판정, 겹치면 먼저 일치한 구역)이면 그 구역 번호를, 구역 밖이라도 경계에서 2,000 m 이내면 "버퍼"(255)로 표시하고, 나머지 노드는 버린다. 서비스 지역 샤드(수도권 47구역, 그 밖 국내 6개 샤드)는 전국 그래프에서 해당 구역 노드끼리의 간선만 남긴 부분 그래프다(노드 번호는 원래 순서를 유지해 다시 매긴다). - 연결요소: 무방향 연결요소를 계산해 노드마다 요소 번호(16비트)를 저장하고, 최대 요소 표시를 따로 둔다. 이후 코스 시드는 일정 크기 이상의 요소 안에서만 잡는다(4.2).
- 해외 도시 그래프는 도시 중심에서 반경 R(도시별 설정)의 원 안의 노드만 구역에 배정하고, 반경 + 2,000 m 까지는 버퍼, 그 밖은 버린다. 나머지는 위와 같다.
4. 단계 ③ — 코스 카탈로그 생성
구역(시·군·구) 하나씩 처리한다. 카탈로그 파이프라인 이름 v30-p1.
4.1 모양 템플릿 (6종, 단위 둘레 1의 닫힌 곡선)
heart(하트), star(5각 별), letter_L(글자 L), triangle(정삼각형), square(정사각형), circle(원).
- heart: x = 16 sin³t, y = 13 cos t − 5 cos 2t − 2 cos 3t − cos 4t (t 는 0..2π).
- circle: (cos t, sin t).
- star: 외경 1·내경 0.5 의 꼭짓점 10개 / triangle: 외접원 반지름 1 / square: (±1, ±1) / letter_L: 꼭짓점 (0,0)(0.6,0)(0.6,0.3)(0.3,0.3)(0.3,1)(0,1).
- 각 곡선은 둘레로 정규화한 뒤 평균점을 원점으로 옮겨 쓴다. 회전·거울 정책: heart·circle·star·square·triangle 은 15도 간격 24가지 회전 x 거울 있음/없음, letter_L 은 회전 {345, 0, 15}도·거울 없음.
4.2 시드(씨앗) 격자 — 계층 A/B/C
- 구역 다각형(outer 에서 inner 를 뺀 영역) 안에 1 km 간격 격자점을 놓는다(위도 1도 = 111,320 m, 경도는 구역 평균 위도의 cos 로 보정한 평면 근사).
- 격자점마다, 그 점을 중심으로 한 1 km x 1 km 칸 안의 이 구역에 속한 그래프 노드 수 n 을 센다.
- 계층 A: n ≥ 300 → 모든 격자점을 시드로 쓴다.
- 계층 B: 150 ≤ n < 300 → 격자의 행 번호와 열 번호가 모두 짝수인 점만(사실상 2 km 간격) 쓴다.
- 계층 C: n < 150 → 시드를 두지 않는다.
- 시드 격자점을 300 m 이내의 가장 가까운 그래프 노드로 스냅한다. 후보 노드 조건: 차수 ≥ 2, 속한 연결요소가 5,000 노드 이상(수도권 47구역 초기 빌드는 "최대 연결요소"), 구역 버퍼(255) 노드 아님. 300 m 안에 후보가 없으면 그 격자점은 버린다. 같은 노드로 스냅된 시드는 하나만 남긴다. 시드 번호는
<구역번호>-<일련번호>이고 격자의 y 오름차순·x 오름차순으로 정한다.
4.3 모양 템플릿 매칭 (시드 x 모양 6종 x 거리 {3000, 5000, 8000} m)
- 지역 그래프: 시드 노드 중심의 정사각 창(반지름 = 모양 최대 지름 + 700 + 400 + 100 m) 안에서 시드와 같은 연결요소의 노드·간선을 뽑고 계단 간선(비트 1)은 제거한다.
- 배치 후보: 모양선의 둘레 = 목표거리 x 배율, 배율 {0.85, 0.92, 1.0, 1.08, 1.15}. 중심은 시드 기준 반경 700 m 안의 100 m 격자, 회전·거울은 4.1 정책. 모양선 위의 16점 중앙값이 그래프 노드까지 150 m 이하인 배치만 남기고, 다시 64점의 90백분위 거리가 120 m 이하인 배치만 남긴다. 90백분위(작은 것 우선), 평균 순으로 정렬해 상위 100개 배치를 본다.
- 맵매칭(관 매칭): 모양선에 폭 ε 의 관을 씌워, 관 밖으로 나가지 않으면서 모양선을 처음부터 끝까지 순서대로(되돌아가지 않고) 따라가는 그래프 경로를 찾는다(이산 Fréchet 맵매칭). 같은 노드에서 시작해 끝나는 폐곡선이어야 한다. ε 는 10~400 m 에서 5 m 해상도의 이진탐색으로 가능한 최소값 ε* 를 구하고, ε* 에서 간선 비용 = 길이 x (간선에 service 비트 4 또는 unpaved 비트 16 이 있으면 1.5, 아니면 1; 계단은 이미 제거됨) 인 최단 경로를 코스로 삼는다. 실제 길만 따라가며 없는 길을 직선으로 잇지 않는다.
- 합격 조건: (가) 경로 실제 길이가 목표거리의 ±20 % 이내, (나) ε*/모양폭 ≤ 0.10 (모양폭 = 모양선 x·y 범위 중 큰 값), (다) 유턴(같은 노드로 되돌아오는
A-B-A) 1회 이하, (라) 전역 그래프 기준 계단 간선 0개, (마) 같은 시드·모양·거리 안에서 간선 집합이 같은 경로는 ε 작은 것만. 한 조합에서 ε/폭이 작은 순으로 최대 5개, 서로 간선 집합 Jaccard 유사도가 0.7 을 넘는 것은 제외한다. - 구역 조립: 구역의 모든 시드 결과를 모아 (ε/폭, 길이, 시드) 순으로 정렬하고, 이미 채택된 코스와 간선 집합 Jaccard 유사도가 0.7 을 넘으면 버린다. 남은 코스에 (모양, 목표거리, ε/폭) 순으로
courseId = <구역>-<4자리 번호>를 매긴다. - 색인: 전 구역 코스에서 중심(bbox 중심)과 진입점 3개를 0.01도 격자 칸(
floor(lat/0.01)_floor(lon/0.01))으로 묶은index.json을 만든다. - 서비스에 올리기 전에 카탈로그를 서버용 배열 형식으로 컴파일하는 단계가 있으나(내용은 같고 형식만 다름), 정보를 더하거나 바꾸지 않는다. 컴파일(서버 적재) 단계의 형식 검사에 걸리는 파일·코스는 서비스에서 제외될 수 있으므로, 서비스 중인 코스는 이 카탈로그의 부분집합일 수 있다.
5. 산출물 형식 (패키지 안의 파일)
5.1 <구역>.json (구역 파일)
최상위: schemaVersion, catalogVersion·pipeline(v30-p1), regionId, districtIndex, districtName, graph(그래프 폴더 이름), graphVersion(입력 OSM replication timestamp), params(아래), seedStats(시드 개수·계층별 개수 등 집계), seedsProcessed, coursesRaw(중복 제거 전), coursesAfterDedupe, attribution, courses(배열).
params: seed_grid_m 1000, snap_m 300, center_r_m 700, center_grid_m 100, top_placements 100, scales, rot_step_deg 15, eps_ratio_max 0.1, len_tol 0.2, uturn_max 1, jaccard_max 0.7, keep_per_combo 5, templates, dists, stairs_excluded_from_graph true.
코스 한 개(courses[i]):
| 필드 | 뜻 |
|---|---|
courseId | 코스 번호(<구역>-<4자리>) |
shapeId | 모양(heart, star, letter_L, triangle, square, circle) |
dist_target | 목표 거리(m): 3000 / 5000 / 8000 |
geometry | 코스 경로 꼭짓점 [위도, 경도] 배열(소수 6자리). 폐곡선이라 처음과 끝이 같은 노드 |
guideGeometry | 코스에 맞춰 놓은 모양선(64점) [위도, 경도] — 지도 위 안내선 |
lengthMeters | 경로의 실제 길이(m) |
epsMeters | 맵매칭에서 구한 최소 관 폭 ε*(m) — 모양과 길이 얼마나 어긋나는지 |
epsRatio | ε* / 모양폭(작을수록 모양에 가깝다. 0.10 이하만 채택) |
widthMeters | 모양폭(m) |
uturn | 유턴 횟수(0 또는 1) |
entryNodes | 코스 위 진입점 3개(nodeIndex 그래프 노드 번호, lat, lon, atMeters 경로 위 누적 거리) — 출발·1/3·2/3 지점 |
seedId | 코스를 만든 시드 번호 |
placement | 모양선 배치 값: s 배율, rot 회전(도), mir 거울 여부, cx·cy 시드 기준 중심 이동(m, 동·북) |
builtAt | 생성 시각(UTC) |
bbox | [최소위도, 최소경도, 최대위도, 최대경도] |
좌표는 모두 공개 도로 위의 점이다. 이용자의 위치·식별자는 들어 있지 않다(패키지 생성 시 requestId·install 등 키가 없음을 검사한다).
5.2 index.json
schemaVersion, cellSizeDeg 0.01, cellKey, attribution·attributionUrl·license·licenseUrl, courseCount, courses(코스별 요약: courseId, regionId, shapeId, dist_target, lengthMeters, epsRatio, bbox, center, entry, cells), cells(칸 → courseId 목록).
6. 재현할 때 알아둘 점
- 같은 입력·같은 절차라도 부동소수 연산과 시간 제한(조합당 실행 상한 240초) 때문에 결과가 비트 단위로 같지는 않을 수 있다.
- 시드 번호·코스 번호는 입력 OSM 데이터가 바뀌면 달라진다.
- 코드는 ODbL 이 다루는 대상이 아니다(제2.3조 (a): 데이터베이스를 만들거나 운영하는 데 쓴 컴퓨터 프로그램에는 이 라이선스가 적용되지 않는다). 코드는 공개하지 않으며(2026-10-28 운영자 위임 결정), 이 문서는 코드 없이도 방법을 이해할 수 있도록 쓴 것이다.
7. 출처와 라이선스
- 데이터: © OpenStreetMap contributors. Open Database License(ODbL) 1.0 — https://opendatacommons.org/licenses/odbl/1-0/ · https://www.openstreetmap.org/copyright
- 길그림 코스 카탈로그는 위 데이터의 파생 데이터베이스이며 ODbL 1.0 으로 제공한다.
English summary
What this is. A description of how the Gilgrim (길그림) course catalog is derived from OpenStreetMap, written to serve as the "method of making the alterations (such as an algorithm)" under ODbL 1.0 section 4.6(b). The full derivative databases — the course catalog and the walking graph — (4.6(a)) are available free of charge on request at https://naranstudio.com/gilgrim/odbl . This document contains no coordinates and no user data. Whether it satisfies 4.6(b) has not yet been confirmed by a lawyer.
Input. Geofabrik country extracts (south-korea-latest.osm.pbf), OSM replication timestamp 2026-09-22T20:22:59Z. The same bytes cannot be re-downloaded because "latest" files are updated.
Step 1 – walkable ways. Keep ways with highway in {footway, path, pedestrian, steps, living_street, track, corridor, residential, unclassified, tertiary(_link), secondary(_link), primary(_link), service, road, cycleway} or an explicit foot ∈ {yes, designated, permissive, destination}. Drop ways with foot ∈ {no, private, use_sidepath}; drop ways without explicit foot allowance whose access ∈ {no, private, permit, agricultural, forestry, customers, delivery}; drop area=yes, indoor=yes, and ways with fewer than 2 nodes. Edge flag bits: 1 steps, 2 track, 4 service, 8 cycleway, 16 unpaved surface. Overseas profiles add per-country guards for motorways, motorroad=yes, and trunk roads without pedestrian evidence.
Step 2 – graph. Consecutive node pairs in each way become two directed edges; length = haversine (R = 6,371,000 m) rounded to whole metres (uint16); nodes renumbered by OSM id; stored as CSR arrays. Nodes are assigned to administrative districts (OSM admin_level 6; even-odd point-in-polygon) with a 2 km buffer; connected components are labelled.
Step 3 – catalog. Per district: seed points on a 1 km grid (tier A: ≥300 district nodes in the 1 km cell → every grid point; tier B: 150–299 → every other row/column, i.e. 2 km; tier C: <150 → none), snapped to the nearest graph node within 300 m (degree ≥ 2, component ≥ 5,000 nodes). For each seed, six shapes (heart, star, letter L, triangle, square, circle) x three distances (3, 5, 8 km): place the shape curve (scales 0.85–1.15, 15° rotations, optional mirror, centre within 700 m of the seed), pre-screen by distance to the graph (median ≤150 m over 16 points, 90th percentile ≤120 m over 64 points), keep the best 100 placements, and map-match each with a discrete-Fréchet "tube" search (minimal ε* in 5 m steps, then the shortest path inside the tube, stairs removed). A course is accepted if its real length is within ±20 % of the target, ε*/shape width ≤ 0.10, it has ≤ 1 U-turn and no stairs; near-duplicates (edge-set Jaccard > 0.7) are removed. The result is one JSON file per district plus an index.json; field definitions are in section 5 above (Korean).
Licence. © OpenStreetMap contributors, ODbL 1.0. The catalog is offered under the ODbL. Contact: contact@naranstudio.com.