Runimal은 현재 상용 지도 SDK 없이도 오프라인 지도 팩을 받을 수 있다.
앱이 기대하는 입력은 다음이다.
.mbtiles파일metadata테이블에 최소한 아래 값이 있으면 좋다nameboundsminzoommaxzoomsourcelicenseattribution
현재 앱 구조:
- iPhone에서 지도 팩 생성
.mbtiles연결- watch로 전송
- watch가
3x3타일 모자이크로 렌더
- 데이터 원천:
OpenStreetMap - 데이터 다운로드:
Geofabrik같은 OSM extract 배포처 - 타일 생성: 사용자가 보유한 합법적 오픈소스 렌더러
- MBTiles 패키징: 이 문서와 함께 추가된
build_mbtiles_from_xyz.py
중요:
tile.openstreetmap.org를 대량 다운로드해서 오프라인 팩으로 만드는 것은 금지다.- OSM 데이터는 써도 되지만, 타일 서버 정책과 ODbL 고지는 반드시 지켜야 한다.
예시 구조:
tiles/
12/3492/1586.png
12/3492/1587.png
13/6984/3173.png
이 경우 아래 스크립트로 바로 MBTiles를 만든다.
cd /Users/heobella/jaw-bot-2/apps/runimal-apple
python3 scripts/offline_maps/build_mbtiles_from_xyz.py \
--tiles-root /path/to/tiles \
--output /path/to/gapyeong.mbtiles \
--title "가평 러닝" \
--format png \
--source "OpenStreetMap (self-built)" \
--license "ODbL" \
--attribution "© OpenStreetMap contributors"가평 주변 러닝 팩이라면 다음 정도가 현실적이다.
- 대략 영역:
37.70,127.35 ~ 37.92,127.62 - 권장 줌:
12~16
타일을 준비한 뒤 같은 스크립트로 패키징한다.
python3 scripts/offline_maps/build_mbtiles_from_xyz.py \
--tiles-root /path/to/gapyeong_xyz \
--output /path/to/gapyeong.mbtiles \
--title "가평 러닝" \
--minzoom 12 \
--maxzoom 16 \
--bounds "127.35,37.70,127.62,37.92"- iPhone 앱에서
러닝 > 오프라인 지도 현재 위치 팩또는지도 팩 만들기가평 러닝팩 생성- 해당 팩의
파일버튼으로gapyeong.mbtiles선택 - watch로 전송
- watch
지도페이지에서 팩과 프리뷰 확인
현재 위치 팩은 iPhone 현재 위치를 읽어 주변 bbox를 자동으로 계산한다.
지금 구현은 위치 기반 팩 생성 자동화까지이며, 타일 데이터 다운로드/생성까지 자동은 아니다.
이미 구현된 것:
- 팩 메타데이터 저장
.mbtiles연결- 내부 metadata 자동 읽기
- watch 카탈로그 전송
- watch
3x3타일 미리보기 - 현재 위치 중심 이동
- route polyline 오버레이
아직 남은 것:
- 앱 안에서 직접 OSM 데이터를 다운로드해 타일 생성
- 대용량 팩 전송 재개/분할 최적화
- 전체 지도 뷰어 수준의 팬/줌 UX
- UI에
source / license / attribution을 남긴다 - 상용 공급자 없이 가려면
OSM + self-built를 기본값으로 쓴다 - watch 팩은 너무 크게 만들지 않는다
- 보통
한 지역 + 12~16줌부터 시작
- 보통