दिलचस्प पोस्ट
दूरस्थ मॉडल के साथ बूटस्ट्रैप 3 विशिष्ट समय पर सेवा शुरू करने के लिए अलार्ममैनेजर का उपयोग करना क्वेरी स्ट्रिंग पैरामीटर के जावा यूआरएल एन्कोडिंग नमक उत्पन्न और खुले स्रोत सॉफ्टवेयर एकाधिक रिटर्न: कौन सा अंतिम रिटर्न मान सेट करता है? क्या मुझे लेबल टैग के अंदर इनपुट टैग डालनी चाहिए? । क्लासपैथ और। प्रोजेक्ट – संस्करण नियंत्रण में चेक करें या नहीं? एक TabHost गतिविधि से एक परिणाम (startActivityForResult) वापस कैसे करें? गोलाकार कोनों और पारदर्शिता के साथ सीमा जावास्क्रिप्ट स्ट्रिंग्स और नंबरों के बीच प्लस और माइनस ऑपरेटर्स को अलग तरह से क्यों संभालता है? कैसे JQuery के साथ प्राप्त करें और पोस्ट चर प्राप्त करने के लिए? यदि कोई संख्या प्रधान है तो यह जांचने के लिए सबसे अच्छा एल्गोरिथ्म क्या है? कंस्ट्रक्टरों का भर्ती करना लगातार डुप्लिकेट शब्द के लिए नियमित अभिव्यक्ति एसक्यूएल एक स्तंभ पर अधिकतम मूल्य के साथ केवल पंक्तियों का चयन करें

स्थानीय टाइलों का उपयोग करके टाइल प्रदाता

मैं GoogleMap पर कुछ कस्टम टाइल्स ओवरले करने के लिए नवीनतम एंड्रॉइड मैप्स एपीआई (v2) की नई TileProvider कार्यक्षमता का उपयोग करना चाहूंगा हालांकि, चूंकि मेरे उपयोगकर्ता इंटरनेट पर बहुत समय नहीं लेंगे, मैं डिवाइस पर एक ज़िपफ़ाइल / फोल्डर संरचना में संग्रहीत टाइल रखना चाहता हूं। मैं Maptiler का प्रयोग करके अपनी टाईल्स Maptiler साथ geotiffs । मेरे प्रश्न हैं:

  1. उपकरण पर टाइल्स को स्टोर करने का सबसे अच्छा तरीका क्या होगा?
  2. मैं एक टाइल प्रोवाइडर बनाने के बारे में कैसे जा सकता हूं जो स्थानीय टाइल्स देता है?

वेब के समाधान से एकत्रित समाधान "स्थानीय टाइलों का उपयोग करके टाइल प्रदाता"

  1. आप टाईल्स को संपत्ति फ़ोल्डर में डाल सकते हैं (यदि यह ऐप आकार के लिए स्वीकार्य है) या उन्हें पहली बार डाउनलोड करें और उन्हें डिवाइस मेमोरी (एसडी कार्ड) में डाल दें।

  2. आप इस तरह TileProvider को लागू कर सकते हैं:


 public class CustomMapTileProvider implements TileProvider { private static final int TILE_WIDTH = 256; private static final int TILE_HEIGHT = 256; private static final int BUFFER_SIZE = 16 * 1024; private AssetManager mAssets; public CustomMapTileProvider(AssetManager assets) { mAssets = assets; } @Override public Tile getTile(int x, int y, int zoom) { byte[] image = readTileImage(x, y, zoom); return image == null ? null : new Tile(TILE_WIDTH, TILE_HEIGHT, image); } private byte[] readTileImage(int x, int y, int zoom) { InputStream in = null; ByteArrayOutputStream buffer = null; try { in = mAssets.open(getTileFilename(x, y, zoom)); buffer = new ByteArrayOutputStream(); int nRead; byte[] data = new byte[BUFFER_SIZE]; while ((nRead = in.read(data, 0, BUFFER_SIZE)) != -1) { buffer.write(data, 0, nRead); } buffer.flush(); return buffer.toByteArray(); } catch (IOException e) { e.printStackTrace(); return null; } catch (OutOfMemoryError e) { e.printStackTrace(); return null; } finally { if (in != null) try { in.close(); } catch (Exception ignored) {} if (buffer != null) try { buffer.close(); } catch (Exception ignored) {} } } private String getTileFilename(int x, int y, int zoom) { return "map/" + zoom + '/' + x + '/' + y + ".png"; } } 

और अब आप इसे अपने GoogleMap उदाहरण के साथ उपयोग कर सकते हैं:

 private void setUpMap() { mMap.setMapType(GoogleMap.MAP_TYPE_NONE); mMap.addTileOverlay(new TileOverlayOptions().tileProvider(new CustomMapTileProvider(getResources().getAssets()))); CameraUpdate upd = CameraUpdateFactory.newLatLngZoom(new LatLng(LAT, LON), ZOOM); mMap.moveCamera(upd); } 

मेरे मामले में मैमैटेल द्वारा उत्पन्न टाइल के समन्वय के साथ y में भी समस्या थी, लेकिन मैं इस विधि को कस्टममैट टाइलप्रदाता में जोड़कर प्रबंधित कर रहा था:

 /** * Fixing tile's y index (reversing order) */ private int fixYCoordinate(int y, int zoom) { int size = 1 << zoom; // size = 2^zoom return size - 1 - y; } 

और इसे getTile () विधि से कॉलिग जैसे:

 @Override public Tile getTile(int x, int y, int zoom) { y = fixYCoordinate(y, zoom); ... } 

[Upd]

यदि आप अपने कस्टम मानचित्र के NO_TILE क्षेत्र जानते हैं, तो आपको NO_TILE टाइल्स के लिए getTile(...) विधि से getTile(...) वापस करना चाहिए।

मैंने इस तरह से इसे किया:

 private static final SparseArray<Rect> TILE_ZOOMS = new SparseArray<Rect>() {{ put(8, new Rect(135, 180, 135, 181 )); put(9, new Rect(270, 361, 271, 363 )); put(10, new Rect(541, 723, 543, 726 )); put(11, new Rect(1082, 1447, 1086, 1452)); put(12, new Rect(2165, 2894, 2172, 2905)); put(13, new Rect(4330, 5789, 4345, 5810)); put(14, new Rect(8661, 11578, 8691, 11621)); }}; @Override public Tile getTile(int x, int y, int zoom) { y = fixYCoordinate(y, zoom); if (hasTile(x, y, zoom)) { byte[] image = readTileImage(x, y, zoom); return image == null ? null : new Tile(TILE_WIDTH, TILE_HEIGHT, image); } else { return NO_TILE; } } private boolean hasTile(int x, int y, int zoom) { Rect b = TILE_ZOOMS.get(zoom); return b == null ? false : (b.left <= x && x <= b.right && b.top <= y && y <= b.bottom); } 

नए एपीआई (v2) में कस्टम टाइलप्रोवाइडर्स जोड़ने की संभावना बढ़िया है, हालांकि आप यह कहते हैं कि आपके उपयोगकर्ता ज्यादातर ऑफ़लाइन हैं अगर कोई उपयोगकर्ता ऑफ़लाइन लॉन्च करता है, तो पहली बार एप्लिकेशन लॉन्च करने पर आप नए एपीआई का उपयोग नहीं कर सकते क्योंकि इसके लिए उपयोगकर्ता को ऑनलाइन होना चाहिए (कम से कम एक बार ऐसा कैश बनाने के लिए) – अन्यथा यह केवल एक ब्लैक स्क्रीन दिखाएगा।

2 / 22-14 को संपादित करें: हाल ही में एक ही मुद्दे पर फिर से आया – एक ऐप के लिए कस्टम टाइलें जो ऑफ़लाइन काम करना पड़ता था। एक अदृश्य (w / h 0/0) मानचित्रदृश्य को प्रारंभिक दृश्य में जोड़कर इसे हल किया गया जहां क्लाइंट को कुछ सामग्री डाउनलोड करनी थी। यह काम करने लगता है, और मुझे बाद में ऑफ़लाइन मोड में मानचित्रदृश्य का उपयोग करने की अनुमति देता है।