Ya, Anda dapat menggunakan ubin khusus dengan Android Maps API v2 - Anda dapat melihat contoh yang berfungsi penuh di aplikasi OpenTripPlanner untuk Android di Github . (Anda juga dapat mengunduh aplikasi langsung dari Google Play )
Kami mendukung penyedia ubin berikut:
- LyrkOpenStreetMap
- MapQuestOpenStreetMap
- Mapnik
- CycleMap
- Google (normal, satelit, hibrida, medan)
Kelas CustomUrlTileProvider kami dapat dilihat di sini di Github , dan saya juga menempelkannya di bawah:
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;
}
}
Dan inilah kode yang beralih di antara penyedia petak peta, berdasarkan preferensi pengguna:
/**
* 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));
}
}
}
Berikut adalah screenshot ubin OpenStreetMap MapQuest:
Untuk informasi lebih lanjut tentang membuat ubin Anda sendiri, lihat dokumentasi Google untuk TileOverlay serta wiki OpenStreetMap untuk "Membuat ubin Anda sendiri" .
Secara khusus, dokumentasi Google mengatakan:
Perhatikan bahwa dunia diproyeksikan menggunakan proyeksi Mercator (lihat Wikipedia) dengan sisi kiri (barat) peta yang sesuai dengan -180 derajat bujur dan sisi kanan (timur) peta yang sesuai dengan 180 derajat bujur. Untuk membuat bujur sangkar peta, sisi atas (utara) peta berkorespondensi dengan 85,0511 derajat lintang dan sisi bawah (selatan) peta bersesuaian dengan -85,0511 derajat lintang. Area di luar rentang garis lintang ini tidak dirender.
Di setiap tingkat zoom, peta dibagi menjadi ubin dan hanya ubin yang tumpang tindih layar yang diunduh dan dirender. Setiap ubin persegi dan peta dibagi menjadi ubin sebagai berikut:
Pada tingkat zoom 0, satu ubin mewakili seluruh dunia. Koordinat ubin itu adalah (x, y) = (0, 0).
Pada tingkat zoom 1, dunia dibagi menjadi 4 ubin yang disusun dalam kisi 2 x 2. ...
- Pada tingkat zoom N, dunia dibagi menjadi ubin 4N yang disusun dalam kisi 2N x 2N.
Perhatikan bahwa level zoom minimum yang didukung kamera (yang dapat bergantung pada berbagai faktor) adalah GoogleMap.getMinZoomLevel dan level zoom maksimum adalah GoogleMap.getMaxZoomLevel.
Koordinat ubin diukur dari sudut kiri atas (barat laut) peta. Pada tingkat pembesaran N, nilai x koordinat ubin berkisar dari 0 hingga 2N - 1 dan meningkat dari barat ke timur dan nilai y berkisar dari 0 hingga 2N - 1 dan meningkat dari utara ke selatan.
URL yang diformat yang digunakan dalam OTP Android untuk referensi setiap penyedia ubin terlihat seperti:
Jadi, untuk penyedia di atas gambar ubin adalah file PNG yang disusun dalam struktur direktori yang ditunjukkan oleh dokumentasi Google. Anda akan mengikuti format serupa untuk membuat petak peta Anda sendiri yang dihosting di server Anda sendiri. Perhatikan bahwa URL / gambar ini harus dapat diakses secara publik ke perangkat seluler (yaitu, tidak dapat dilindungi kata sandi).
Solusi paling luas yang saya temukan dalam Jawaban StackOverflow ini :
Pada dasarnya Anda perlu menerapkan TileProvider Anda sendiri dan menggunakannya sebagai TileOverlay
Dalam beberapa aplikasi kami telah menggunakan layer semacam ini untuk menampilkan ubin pada peta, tetapi kami menemukan ubin tersebut membutuhkan banyak ruang. Karenanya kami beralih menggunakan mbtiles dan pustaka ini untuk menampilkan data dari mbtiles pada peta.
sumber