예, Android Maps API v2 와 함께 맞춤 타일을 사용할 수 있습니다 . Github의 Android 용 OpenTripPlanner 앱 에서 전체 예제를 볼 수 있습니다 . ( Google Play에서 직접 앱을 다운로드 할 수도 있습니다 )
다음과 같은 타일 공급자를 지원합니다.
- LyrkOpenStreetMap
- MapQuestOpenStreetMap
- 마프 닉
- 사이클 맵
- Google (일반, 위성, 하이브리드, 지형)
CustomUrlTileProvider 클래스는 여기 Github 에서 볼 수 있으며 아래에 붙여 넣었습니다.
public class CustomUrlTileProvider extends UrlTileProvider {
private String baseUrl;
public CustomUrlTileProvider(int width, int height, String url) {
super(width, height);
this.baseUrl = url;
}
@Override
public URL getTileUrl(int x, int y, int zoom) {
try {
return new URL(baseUrl.replace("{z}", "" + zoom).replace("{x}", "" + x)
.replace("{y}", "" + y));
} catch (MalformedURLException e) {
e.printStackTrace();
}
return null;
}
}
그리고 여기에 코드의 사용자 선호도에 따라,지도 타일 공급자 사이를 전환 :
/**
* Changes the tiles used to display the map and sets max zoom level.
*
* @param overlayString tiles URL for custom tiles or description for
* Google ones
*/
public void updateOverlay(String overlayString) {
int tile_width = OTPApp.CUSTOM_MAP_TILE_SMALL_WIDTH;
int tile_height = OTPApp.CUSTOM_MAP_TILE_SMALL_HEIGHT;
if (overlayString == null) {
overlayString = mPrefs.getString(OTPApp.PREFERENCE_KEY_MAP_TILE_SOURCE,
mApplicationContext.getResources()
.getString(R.string.map_tiles_default_server));
}
if (mSelectedTileOverlay != null) {
mSelectedTileOverlay.remove();
}
if (overlayString.startsWith(OTPApp.MAP_TILE_GOOGLE)) {
int mapType = GoogleMap.MAP_TYPE_NORMAL;
if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_HYBRID)) {
mapType = GoogleMap.MAP_TYPE_HYBRID;
} else if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_NORMAL)) {
mapType = GoogleMap.MAP_TYPE_NORMAL;
} else if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_TERRAIN)) {
mapType = GoogleMap.MAP_TYPE_TERRAIN;
} else if (overlayString.equals(OTPApp.MAP_TILE_GOOGLE_SATELLITE)) {
mapType = GoogleMap.MAP_TYPE_SATELLITE;
}
mMap.setMapType(mapType);
mMaxZoomLevel = mMap.getMaxZoomLevel();
} else {
if (overlayString.equals(getResources().getString(R.string.tiles_mapnik))) {
mMaxZoomLevel = getResources().getInteger(R.integer.tiles_mapnik_max_zoom);
} else if (overlayString.equals(getResources().getString(R.string.tiles_lyrk))) {
mMaxZoomLevel = getResources().getInteger(R.integer.tiles_lyrk_max_zoom);
tile_width = OTPApp.CUSTOM_MAP_TILE_BIG_WIDTH;
tile_height = OTPApp.CUSTOM_MAP_TILE_BIG_HEIGHT;
} else {
mMaxZoomLevel = getResources().getInteger(R.integer.tiles_maquest_max_zoom);
}
mMap.setMapType(GoogleMap.MAP_TYPE_NONE);
CustomUrlTileProvider mTileProvider = new CustomUrlTileProvider(
tile_width,
tile_height, overlayString);
mSelectedTileOverlay = mMap.addTileOverlay(
new TileOverlayOptions().tileProvider(mTileProvider)
.zIndex(OTPApp.CUSTOM_MAP_TILE_Z_INDEX));
if (mMap.getCameraPosition().zoom > mMaxZoomLevel) {
mMap.moveCamera(CameraUpdateFactory.zoomTo(mMaxZoomLevel));
}
}
}
다음은 MapQuest OpenStreetMap 타일의 스크린 샷입니다.
나만의 타일 만들기에 대한 자세한 내용 은 TileOverlay에 대한 Google 설명서 와 "나만의 타일 만들기"에 대한 OpenStreetMap 위키를 참조하십시오 .
구체적으로, 구글 문서는 다음과 같이 말합니다 :
세계는 -180 도의 경도에 해당하는지도의 왼쪽 (서쪽)과 경도의 180도에 해당하는지도의 오른쪽 (동쪽)에 메르카토르 투영법 (위키 백과 참조)을 사용하여 투영됩니다. 지도를 정사각형으로 만들려면지도의 상단 (북쪽)은 위도 85.0511도에 해당하고지도의 하단 (남쪽)은 -85.0511도에 해당합니다. 이 위도 범위를 벗어난 영역은 렌더링되지 않습니다.
각 확대 / 축소 수준에서지도는 타일로 분할되며 화면과 겹치는 타일 만 다운로드하여 렌더링합니다. 각 타일은 정사각형이며 맵은 다음과 같이 타일로 나뉩니다.
확대 / 축소 수준 0에서 하나의 타일은 전 세계를 나타냅니다. 해당 타일의 좌표는 (x, y) = (0, 0)입니다.
확대 / 축소 수준 1에서 세계는 2 x 2 격자로 배열 된 4 개의 타일로 나뉩니다. ...
- 확대 / 축소 수준 N에서 월드는 2N x 2N 그리드로 배열 된 4N 타일로 나뉩니다.
카메라가 지원하는 최소 줌 레벨 (다양한 요인에 따라 다름)은 GoogleMap.getMinZoomLevel이고 최대 줌 레벨은 GoogleMap.getMaxZoomLevel입니다.
타일의 좌표는지도의 왼쪽 상단 (북서쪽)에서 측정됩니다. 확대 / 축소 수준 N에서 타일 좌표의 x 값 범위는 0에서 2N-1 사이이고 서쪽에서 동쪽으로 증가하고 y 값의 범위는 0에서 2N-1 사이이며 북쪽에서 남쪽으로 증가합니다.
각 타일 제공자를 참조하기 위해 OTP Android에서 사용되는 형식화 된 URL은 다음과 같습니다.
따라서 위의 공급자의 경우 타일 이미지는 Google 문서에 표시된 디렉토리 구조로 배열 된 PNG 파일입니다. 자체 서버에서 호스팅되는 자체지도 타일을 만들려면 비슷한 형식을 따릅니다. 이 URL / 이미지는 모바일 장치에서 공개적으로 액세스 할 수 있어야합니다 (즉, 암호로 보호 할 수 없음).