1. 여러가지 일을 떨처내고... 정신을 부여잡고...
2. Update 내용 :
(a) Tag 개수가 256 개 이상의 경우도 완벽 처리 https://cafe.daum.net/OnlyWalker/Dqnl/84
(b) 사용자의 트랙의 시작점과 끝점을 Osm 자료의 highway 자료와 비교하여
예 : 위도 : 34.123456 - 0.0008 부터 34.123456 + 0.0008 사이 이고
경도 124.123456 - 0.0008 부터 124.123456 + 0.0008 사이 인경우 자동 연결
3. 추후 버전 : dbf 일기 속도 Up 예정
참고 : 유료 사용중임.
이하 Gemini 답변 시작 (3.1 pro & Extended 답변) ----------------------------------------
Mapsforge에서 두 개 이상의 `.map` 파일을 합치는 방법은 크게 **앱 실행 중(런타임)에 겹쳐서 보여주는 방법**과 **원천 데이터를 병합하여 하나의 `.map` 파일로 새로 만드는 방법** 두 가지가 있습니다.
가장 일반적이고 메모리 효율적인 런타임 병합 소스 코드부터 알려드릴게요.
### 1. 소스 코드에서 병합하기 (`MultiMapDataStore` 활용)
이미 만들어진 여러 개의 `.map` 파일을 앱 내에서 하나의 지도처럼 매끄럽게 띄우려면, 개별 레이어를 여러 개 얹는 대신 Mapsforge에서 제공하는 `MultiMapDataStore` 클래스를 사용하는 것이 정석입니다.
```java
import org.mapsforge.map.datastore.MapDataStore;
import org.mapsforge.map.datastore.MultiMapDataStore;
import org.mapsforge.map.reader.MapFile;
import org.mapsforge.map.layer.renderer.TileRendererLayer;
import java.io.File;
// ... 기존 설정 코드 (tileCache, mapView, 안드로이드 팩토리 등) ...
// 1. MultiMapDataStore 인스턴스 생성
// RETURN_ALL: 여러 맵의 데이터를 모두 합쳐서 렌더링 (가장 보편적)
// DEDUPLICATE: 겹치는 데이터의 중복을 제거하고 합침 (연산 비용이 들 수 있으므로 필요시 사용)
MultiMapDataStore multiMapDataStore = new MultiMapDataStore(MultiMapDataStore.DataPolicy.RETURN_ALL);
// 2. 각각의 MapFile 불러오기
MapFile mapFile1 = new MapFile(new File("/경로/를/입력하세요/korea_north.map"));
MapFile mapFile2 = new MapFile(new File("/경로/를/입력하세요/korea_south.map"));
// 3. MultiMapDataStore에 각각의 맵 추가
// 파라미터: (추가할 MapDataStore, 시작 위치 사용 여부, 시작 줌 레벨 사용 여부)
// 보통 메인이 되는 지도의 위치와 줌 레벨을 기준(true)으로 삼습니다.
multiMapDataStore.addMapDataStore(mapFile1, true, true);
multiMapDataStore.addMapDataStore(mapFile2, false, false);
// 4. TileRendererLayer에 단일 MapFile 대신 MultiMapDataStore를 전달
TileRendererLayer tileRendererLayer = new TileRendererLayer(
tileCache,
multiMapDataStore,
mapView.getModel().mapViewPosition,
AndroidGraphicFactory.INSTANCE // 안드로이드 환경일 경우
);
tileRendererLayer.setXmlRenderTheme(InternalRenderTheme.OSMARENDER); // 테마 지정
// 5. MapView 레이어에 추가
mapView.getLayerManager().getLayers().add(tileRendererLayer);
```
---
### 2. 물리적인 단일 `.map` 파일로 만들고 싶은 경우 (오해 방지)
가끔 "이미 완성된 두 개의 `.map` 파일 자체를 하나로 합치는 툴은 없나요?"라고 묻는 분들이 계십니다.
단도직입적으로 말씀드리면, **Mapsforge는 이미 생성된 `.map` 파일 간의 물리적인 병합을 지원하지 않습니다.** 거대한 하나의 맵 파일을 폰에 넣고 싶다면, `.map` 변환 이전인 원천 데이터(`.osm` 또는 `.pbf`) 단계에서 합쳐야 합니다.
1. **Osmosis** 또는 **Osmium** 같은 커맨드라인 툴을 사용하여 두 개의 `.pbf` 파일을 하나로 병합합니다.
> 예: `osmium merge map1.osm.pbf map2.osm.pbf -o merged.osm.pbf`
2. 병합된 `merged.osm.pbf` 파일을 Mapsforge의 **Map-Writer 플러그인**을 사용해 통짜 `.map` 파일로 새로 추출하셔야 합니다.
Gemini 답변 종료 --------------------------------------------------------------------------------
// 답변중 **Mapsforge는 이미 생성된 `.map` 파일 간의 물리적인 병합을 지원하지 않습니다.**
있음니다만.. (단 이하 내용 3가지(?)는 지원 불가 합니다.) 을 제외하면 현재 구현하여 사용중입니다.
1. v3 + v5 일때
v3 tag 가 예시 : aaa=1 이고 v5 tag 가 aaa=%f 인경우 map 을 합칠때 aaa=1, aaa=%f 로 결정하는데 문제가 있음.
2. v3(v5) 에서
a.map 은 tag-mapping.xml 에서 <osm-tag key="aerialway" value="cable_car" zoom-appear="12" /> 이고
b.map 은 tag-mapping.xml 에서 <osm-tag key="aerialway" value="cable_car" zoom-appear="14" /> 라고 하면
a.map + b.map 음 합치기는 가능 하지만 a.map 의 cable_car 자료는 12 에서
b.map 의 cable_car 자료는 14 부터 나타남.
3. 이미작성된 <osm-tag key="aerialway" value="cable_car" zoom-appear="12" /> 을 14 부터 나타나게 옴길방법은 이론적으로는 가능하지만 실효성 이 없음.
기타 의견이나 아이디어 또는 에러가 있으면 알려 주시기 바람니다.
작업 환경이 병원에서 간병하면서 작업 하다보니. 또한 여러가지 일이 있어서 원활하게 Update 가 조금 어렵음니다.
첫댓글 수고하셨습니다.
고맙습니다 ^^/
수고 많으셨습니다. 감사합니다.