Android için Google Map API V2 ile özel harita döşemeleri kullanma.


10

Android için Google Map API V2 ile özel harita döşemeleri kullanmanın bir yolunu arıyorum.

Bir robottan gelen verilerle gerçek zamanlı olarak kendi haritalarını oluşturacak bir uygulama yazıyorum.

Uygulamanın bu haritayı operatöre göstermesi gerekir. Operatörün bu harita ile etkileşime girmesi, yol noktaları vb.

Bu sayfanın aynısını yapmak için GoogleMap motorunu kullanmak istiyorum:

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

Sorun, Android API'yı kullanmak istediğinde Javascript API'sini kullanması

Google Maps Engine ile Android'de Özel fayans haritasını kullanmanın herhangi bir yolu var mı?

Zaten ArcGIS'in nasıl kullanılacağına bakıyorum, ancak lisans ödemeden bir API kullanmayı tercih ediyorum.

Yanıtlar:


8

Evet, Android Maps API v2 ile özel karolar kullanabilirsiniz - Github'daki Android için OpenTripPlanner uygulamamızda tam olarak çalışan bir örnek görebilirsiniz . ( Uygulamayı doğrudan Google Play'den de indirebilirsiniz )

Aşağıdaki döşeme sağlayıcılarını destekliyoruz:

  • LyrkOpenStreetMap
  • MapQuestOpenStreetMap
  • Mapnik
  • CycleMap
  • Google (normal, uydu, karma, arazi)

CustomUrlTileProvider sınıfımız burada Github'da görülebilir ve ben de aşağıda yapıştırdım:

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;
    }
}

İşte kullanıcı tercihine göre harita döşemesi sağlayıcıları arasında geçiş yapan kod :

/**
 * 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 döşemelerinin ekran görüntüsü: resim açıklamasını buraya girin

Kendi döşemelerinizi yapma hakkında daha fazla bilgi için, TileOverlay için Google belgelerine ve "Kendi döşemelerinizi oluşturma" için OpenStreetMap wiki'sine bakın .

Özellikle, Google dokümantasyonu şunları söylüyor:

Dünyanın, haritanın sol (batı) tarafı -180 derece boylam ve haritanın sağ (doğu) tarafı 180 derece boylama karşılık gelen Mercator projeksiyonu (Wikipedia'ya bakın) kullanılarak yansıtıldığını unutmayın. Haritayı kare yapmak için haritanın üst (kuzey) tarafı 85.0511 enlem derecesine ve haritanın alt (güney) tarafı -85.0511 enlem derecesine karşılık gelir. Bu enlem aralığının dışındaki alanlar oluşturulmaz.

Her yakınlaştırma düzeyinde, harita döşemelere bölünür ve yalnızca ekranın üst üste gelen döşemeleri indirilir ve oluşturulur. Her karo kare şeklindedir ve harita aşağıdaki gibi karolara bölünür:

  • 0 zum seviyesinde, bir karo tüm dünyayı temsil eder. Bu döşemenin koordinatları (x, y) = (0, 0).

  • Yakınlaştırma seviyesi 1'de dünya, 2 x 2 ızgarada düzenlenmiş 4 karoya bölünür. ...

  • N yakınlaştırma seviyesinde, dünya 2N x 2N ızgarada düzenlenmiş 4N karolara bölünür.

Kameranın desteklediği minimum zoom seviyesinin (çeşitli faktörlere bağlı olabilir) GoogleMap.getMinZoomLevel ve maksimum zoom seviyesinin GoogleMap.getMaxZoomLevel olduğunu unutmayın.

Döşemelerin koordinatları haritanın sol üst (kuzeybatı) köşesinden ölçülür. Yakınlaştırma seviyesi N'de, karo koordinatlarının x değerleri 0 ila 2N - 1 arasında değişir ve batıdan doğuya, y değerleri 0 ila 2N - 1 arasında değişir ve kuzeyden güneye doğru artar.

Her döşeme sağlayıcısına başvurmak için OTP Android'de kullanılan biçimlendirilmiş URL'ler aşağıdaki gibi görünür:

Dolayısıyla, yukarıdaki sağlayıcılar için döşeme görüntüleri, Google dokümantasyonunda belirtilen dizin yapısında düzenlenmiş PNG dosyalarıdır. Kendi sunucunuzda barındırılan kendi harita kutucuklarınızı oluşturmak için benzer bir biçimi izlersiniz. Bu URL'lerin / resimlerin mobil cihaz tarafından herkes tarafından erişilebilir olması gerektiğini unutmayın (ör. Şifre korumalı olamaz).


Zaman ayırdığınız için teşekkürler. Tamamen oluşturduğum resimleri kişisel bir depoda kullanmak mümkün mü? Bu kutucuğun formatı nedir? Peki ya arborescence?
MonkeyJLuffy

@MonkeyJLuffy Bunun için cevabımın altına biraz bilgi ekledim. Bunu okuduktan sonra hala sorularınız varsa lütfen bize bildirin.
Sean Barbeau

1

Bulduğum en kapsamlı çözüm bu StackOverflow içindedir Yanıt :

Temel olarak kendi TileProvider'ınızı uygulamanız ve bunu bir TileOverlay olarak kullanmanız gerekir

Birkaç uygulamada, harita üzerinde karoları göstermek için bu tür bir katman kullandık, ancak karoların çok yer kapladığını gördük. Bu nedenle, mbtiles ve bu kütüphaneyi harita üzerinde mbtiles'dan gelen verileri görüntülemek için kullandık.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.