Menggunakan petak peta khusus dengan Google Map API V2 untuk Android.?

10

Saya mencari cara untuk menggunakan petak peta khusus dengan Google Map API V2 untuk Android.

Saya sedang menulis aplikasi yang akan membuat peta sendiri secara real time dengan data yang berasal dari robot.

Aplikasi perlu menunjukkan kepada operator peta ini. Operator perlu berinteraksi dengan peta ini, membiarkan titik arah, dll.

Saya ingin menggunakan mesin GoogleMap untuk melakukan hal yang sama dengan halaman ini:

http://cdn.mikecouturier.com/blog.mikecouturier.com/tilesgenerator/index.html

Masalahnya adalah dia menggunakan Javascript API ketika saya ingin menggunakan Android API

Apakah ada cara untuk menggunakan peta ubin khusus di Android dengan Google Maps Engine?

Saya sudah mencari cara menggunakan ArcGIS tetapi, saya lebih suka menggunakan API tanpa membayar lisensi.

MonkeyJLuffy
sumber

Jawaban:

8

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: masukkan deskripsi gambar di sini

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).

Sean Barbeau
sumber
Terima kasih untuk waktu anda Dimungkinkan untuk menggunakan gambar yang saya buat sepenuhnya dalam repositori pribadi? Apa format ubin itu? Dan pohon arborescence?
MonkeyJLuffy
@MonkeyJLuffy Saya baru saja menambahkan beberapa informasi ke bagian bawah jawaban saya untuk ini. Tolong beri tahu saya jika Anda masih memiliki pertanyaan setelah membaca ini.
Sean Barbeau
1

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.

Devdatta Tengshe
sumber