Android के लिए Google मानचित्र API V2 के साथ कस्टम मैप टाइल्स का उपयोग करना?


10

मैं Android के लिए Google मानचित्र API V2 के साथ कस्टम मैप टाइल का उपयोग करने का एक तरीका ढूंढ रहा हूं।

मैं एक ऐसा एप्लिकेशन लिख रहा हूं जो एक रोबोट से आने वाले डेटा के साथ वास्तविक समय में खुद के नक्शे बनाएगा।

आवेदन को ऑपरेटर को यह नक्शा दिखाना होगा। ऑपरेटर को इस नक्शे के साथ बातचीत करने की ज़रूरत है, जिससे रास्ते के बिंदु, आदि।

मैं इस पृष्ठ को करने के लिए GoogleMap इंजन का उपयोग करना चाहता हूं:

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

समस्या यह है कि जब मैं Android एपीआई का उपयोग करना चाहता हूं तो उसने जावास्क्रिप्ट एपीआई का उपयोग किया

क्या Google मैप्स इंजन के साथ एंड्रॉइड पर कस्टम टाइल मैप का उपयोग करने का कोई तरीका है?

मैं पहले से ही आर्कगिस का उपयोग करने का तरीका देख रहा हूं लेकिन, मैं लाइसेंस के लिए भुगतान किए बिना एपीआई का उपयोग करना पसंद करता हूं।

जवाबों:


8

हां, आप एंड्रॉइड मैप्स एपीआई v2 के साथ कस्टम टाइल्स का उपयोग कर सकते हैं - आप जीथब पर एंड्रॉइड ऐप के लिए हमारे ओपनट्रिपलनर में पूरी तरह से काम करने वाले उदाहरण देख सकते हैं । (आप 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 टाइल्स का एक स्क्रीनशॉट है: यहां छवि विवरण दर्ज करें

अपनी खुद की टाइलें बनाने के बारे में अधिक जानकारी के लिए, टाइलवॉर्ले के साथ-साथ "अपनी खुद की टाइलें बनाना" के लिए OpenStreetMap विकी के लिए Google दस्तावेज़ देखें ।

विशेष रूप से, Google दस्तावेज़ कहता है:

ध्यान दें कि मानचित्र के -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 प्रलेखन द्वारा इंगित निर्देशिका संरचना में व्यवस्थित हैं। आप अपने स्वयं के सर्वर पर होस्ट किए गए अपने मैप टाइल बनाने के लिए एक समान प्रारूप का पालन करेंगे। ध्यान दें कि ये URL / चित्र सार्वजनिक रूप से मोबाइल डिवाइस (यानी, पासवर्ड से सुरक्षित नहीं हो सकते हैं) तक पहुंच होना चाहिए।


आपके समय के लिए धन्यवाद। व्यक्तिगत रिपॉजिटरी में मेरे द्वारा बनाई गई छवियों का पूरी तरह से उपयोग करना संभव है? उस टाइल का प्रारूप क्या है? और arborescence?
मंकीजफ्फी

@MonkeyJLuffy मैंने इसके लिए अपने उत्तर के निचले भाग में कुछ जानकारी जोड़ी है। कृपया मुझे बताएं कि क्या आपके पास इसे पढ़ने के बाद भी प्रश्न हैं।
शॉन बारब्यू

1

इस StackOverflow उत्तर में मैंने पाया सबसे व्यापक समाधान है :

मूल रूप से आप अपने खुद के लागू करने की आवश्यकता TileProvider है कि एक के रूप में और उपयोग TileOverlay

कुछ अनुप्रयोगों में हमने मानचित्र पर टाइल दिखाने के लिए इस तरह की परत का उपयोग किया है, लेकिन हमने पाया कि टाइलों ने बहुत अधिक जगह ले ली है। इसलिए हम मैप पर mbtiles से डेटा प्रदर्शित करने के लिए mbtiles और इस लाइब्रेरी का उपयोग करने के लिए स्थानांतरित हो गए ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.