Так, ви можете використовувати спеціальні плитки з Android Maps API v2 - ви можете побачити повноцінний приклад у нашому OpenTripPlanner для Android додатку на Github . (Ви також можете завантажити додаток безпосередньо з Google Play )
Ми підтримуємо наступних постачальників плиток:
- LyrkOpenStreetMap
- MapQuestOpenStreetMap
- Mapnik
- CycleMap
- 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:
Для отримання додаткової інформації про створення власних плиток див. Документацію Google для TileOverlay , а також вікі OpenStreetMap для "Створення власних плиток" .
Зокрема, в документації Google написано:
Зауважте, що світ проектується за допомогою проекції Меркатора (див. Вікіпедія) лівою (західною) стороною карти, що відповідає -180 градусів довготи, і правою (східною) стороною карти, що відповідає 180 градусам довготи. Щоб зробити карту площею, верхній (північній) стороні карти відповідає 85.0511 градусів широти, а нижній (південній) стороні карти відповідає -85.0511 градусів широти. Області поза цим діапазоном широти не відображаються.
На кожному рівні збільшення карта поділяється на плитки і завантажуються та надаються лише плитки, які перекриваються екраном. Кожна плитка є квадратною, а карта поділена на плитки наступним чином:
При рівні масштабу 0 одна плитка представляє весь світ. Координати цієї плитки є (x, y) = (0, 0).
На рівні масштабу 1 світ поділяється на 4 плитки, розташовані в сітці 2 х 2. ...
- На рівні масштабу N світ поділяється на 4N плитки, розташовані в сітці 2N x 2N.
Зауважте, що мінімальний рівень збільшення, який підтримує камера (який може залежати від різних факторів), є GoogleMap.getMinZoomLevel, а максимальний рівень збільшення - GoogleMap.getMaxZoomLevel.
Координати плиток вимірюються у верхньому лівому (північно-західному) куті карти. На рівні масштабу N значення x координат плитки коливаються від 0 до 2N - 1 і збільшуються із заходу на схід, а значення y змінюються від 0 до 2N - 1 і збільшуються з півночі на південь.
Відформатовані URL-адреси, які використовуються в OTP Android для посилання на кожного постачальника плиток, виглядають так:
Отже, для вищезазначених постачальників зображення плитки - це файли PNG, розташовані в структурі каталогів, зазначеній в документації Google. Ви б дотримувались подібного формату, щоб створити власну плитку карти, розміщену на власному сервері. Зауважте, що ці URL-адреси / зображення повинні бути загальнодоступними для мобільного пристрою (тобто не можуть бути захищені паролем).