ऑफ़लाइन उपयोग के साथ एंड्रॉइड मैप ऐप के लिए समाधान?


14

मैं एम्बेडेड मैप्स के साथ एंड्रॉइड के लिए एक ऐप विकसित करने के तरीके की तलाश में हूं जो बिना इंटरनेट कनेक्शन के काम कर सकता है (यानी मैं ऑफ़लाइन उपयोग के लिए खुले स्ट्रीटमैप की टाइलें प्राप्त कर सकता हूं?)।

मैंने Google नक्शे api v3 का उपयोग करके वेब ऐप विकसित किया है। मुझे एक विशिष्ट उत्तर के रूप में एक सामान्य उत्तर की आवश्यकता है। मैं उन अवधारणाओं और तकनीकों को खोजने की कोशिश कर रहा हूं जिन्हें मुझे सीखने की आवश्यकता है :)

(इस बीच मुझे ऑस्मड्रोइड मिला क्या यह ऑफ़लाइन काम करता है?)


यह वास्तव में सवाल का जवाब नहीं देता है। यदि आपका कोई अलग प्रश्न है, तो आप प्रश्न पूछकर क्लिक करके पूछ सकते हैं । पर्याप्त प्रतिष्ठा होने पर आप इस प्रश्न पर अधिक ध्यान आकर्षित करने के लिए एक इनाम भी जोड़ सकते हैं ।
जेसन स्कीयर

ओसमंड उपयोगकर्ता की इच्छा पर किसी भी अनुकूलित नक्शे को आयात करने की अनुमति नहीं देता है, लेकिन यह केवल ऑफ़लाइन उपयोग के लिए ऐप से सीधे मानचित्र डाउनलोड करने की अनुमति देता है। जैसा कि मेरे मामले में, मुझे टॉपोशीट्स (रैस्टर मैप्स) को ओवरले करने की आवश्यकता है, जो * .kmz में परिवर्तित हो गए थे। मेरी आवश्यकता ऑफ़लाइन उपयोग के लिए है। मैं ऐसे ऑफ़लाइन मानचित्र समर्थन Android एप्लिकेशन को विकसित करने के लिए एक उचित मार्गदर्शन की तलाश कर रहा हूं।
surap

यह वास्तव में मूल प्रश्न का उत्तर नहीं देता है कि ऑफ़लाइन उपयोग के लिए मानचित्र कहां और कैसे प्राप्त करें।
मैरीबेथ

यह वास्तव में सवाल का जवाब नहीं देता है। यदि आपका कोई अलग प्रश्न है, तो आप प्रश्न पूछकर क्लिक करके पूछ सकते हैं । पर्याप्त प्रतिष्ठा होने पर आप इस प्रश्न पर अधिक ध्यान आकर्षित करने के लिए एक इनाम भी जोड़ सकते हैं । - समीक्षा से
जॉन पॉवेल

जवाबों:


8

क्या आप मोबाइल / सेल ऐप के लिए विकास देख रहे हैं? नई Google गोली के रूप में रास्टर टाइल्स के बजाय वेक्टर प्रारूप में ऑफ़लाइन Google मैप्स के साथ आता है।

Google Honeycomb (टैबलेट) को Google मैप्स ऑफ़लाइन (वेक्टर) का पूर्ण समर्थन प्राप्त है

http://androidandme.com/2010/12/news/andy-rubin-demos-honeycomb-running-on-a-dual-core-motorola-tablet/

नीचे दिए गए वीडियो में एप्लिकेशन को समझाया गया है और दिखाया गया है।


13

मैंने ईएसआरआई एंड्रॉइड एसडीके और एक कस्टम टाइल परत का उपयोग करके एक ऑफ़लाइन मानचित्र किया। मैंने एक टाइल आधारित मानचित्र कैश उत्पन्न करने के लिए एक आर्कगिस सर्वर का उपयोग किया, फिर उन टाइलों को एक SQLite डेटाबेस में डाला और उन्हें वहां से पंक्ति और स्तंभ के आधार पर क्वेरी की। यह बहुत अच्छा काम करता है और अगर आपको कस्टम मैप्स के एंड टू एंड की जरूरत है, तो यह एक बहुत ही उपयोगी तरीका है।

package com.main.utilinspect;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.List;

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonParser;

import android.content.Context;
import android.util.Log;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.esri.core.internal.c.d;
import com.esri.core.internal.c.h;
import com.esri.core.internal.c.l;

import com.esri.android.map.TiledServiceLayer;

public class OfflineDbTiledLayer extends TiledServiceLayer {

File workingDirectory;
String mapDefinition;
String databaseName;
private SQLiteDatabase database;
File blankImage;

byte[] blankImageBytes;

private final Object lock = new Object();


private static final String TAG = "OfflineTiledLayer";  


public OfflineDbTiledLayer(Context paramContext, File workingDirectory, String mapDefinition, String databaseName)  {
    super("required");
    this.workingDirectory = workingDirectory;
    this.mapDefinition = mapDefinition;
    this.databaseName = databaseName;

    String databasePath = workingDirectory.getAbsolutePath() + File.separator + databaseName;

    this.database = SQLiteDatabase.openDatabase(databasePath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 

    this.blankImage = new File(workingDirectory.getAbsolutePath() + File.separator + "blank.png");

    RandomAccessFile raFile = null;

    try {
        raFile = new RandomAccessFile(this.blankImage, "r");

        blankImageBytes = new byte[(int) raFile.length()];
        raFile.readFully(blankImageBytes);

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
    finally {
        if(raFile != null) {
            try {
                raFile.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }   

    h h1 = null;

    try
    {

    JsonParser paramJsonParser = new JsonFactory()
    .createJsonParser(new File(workingDirectory.getAbsolutePath() + File.separator + mapDefinition));
    paramJsonParser.nextToken();    

    h1 = h.a(paramJsonParser, "test");
    }
    catch(Exception ex){

    }       


    setFullExtent(h1.f());      
    setDefaultSpatialReference(h1.c());
    setInitialExtent(h1.e());

    l l1;
    List list;
    int i;
    double ad[] = new double[i = (list = (l1 = h1.d()).h).size()];
    double ad1[] = new double[i];
    for(int j = 0; j < list.size(); j++)
    {
        ad[j] = ((d)list.get(j)).b();
        ad1[j] = ((d)list.get(j)).a();
    }

    setTileInfo(new com.esri.android.map.TiledServiceLayer.TileInfo(l1.f, ad, ad1, i, l1.c, l1.b, l1.a));

    super.initLayer();
    return;     
}   

private void openDatabase(){
    if(!database.isOpen()){
        String databasePath = workingDirectory.getAbsolutePath() + File.separator + databaseName;
        this.database = SQLiteDatabase.openDatabase(databasePath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); 
    }
}

private void closeDatabase(){
    if(database.isOpen()){
        this.database.close();
    }
}

@Override
protected byte[] getTile(int level, int column, int row) throws Exception {
    byte[] tileImage;       

    Log.i(TAG, "getTile");

    Log.i(TAG, "getTile - retrieving tile");            

    synchronized(lock) {

        Log.i(TAG, "getTile - entered synchronized block");

        openDatabase();     

        // First check to see if the tile exists in the database
        Cursor tileCursor = database.rawQuery("SELECT image FROM tiles WHERE level = " + Integer.toString(level) + " AND row = " + Integer.toString(row) + " AND column = " + Integer.toString(column), null);

        if(tileCursor != null && tileCursor.getCount() > 0) {
            tileCursor.moveToFirst();
            tileImage = tileCursor.getBlob(0);
            Log.i(TAG, "getTile - tile found, returning image");                        
        }
        else {
            // The tile does not exist in the database, read the blank placeholder tile and serve it
            tileImage = blankImageBytes;
            Log.i(TAG, "getTile - tile not found returning blank");
        }   

        tileCursor.close();     
        this.database.close();
    }

    Log.i(TAG, "getTile - exited synchronized block");

    return tileImage;   
}

}


क्या आप कृपया कुछ कोड साझा कर सकते हैं?
19

मैंने अपना कस्टम लेयर क्लास जोड़ा जो काम करता है।
22 सितंबर को eptiliom

7

मैंने Android के लिए ऑफ़लाइन मानचित्रों के साथ एक एप्लिकेशन विकसित किया है। एकमात्र मुफ्त उपकरण जिसे आप उपयोग करना चाहते हैं, वह है OSMDroid, अन्यथा ESRI। OSMDroid API Google के समान है, इसलिए यदि आप एक से दूसरे में स्विच करना चाहते हैं, तो यह एक हवा है।

इस पोस्ट की जाँच करें कि Google मैप्स को OSMDroid में कैसे एकीकृत किया जाए, इसका एक नमूना है (यह आपको यह भी बताता है कि इसे सामान्य रूप से कैसे उपयोग किया जाए)।


2

IPhone और अन्य उपकरणों के लिए एक महान ऐप है जिसे xGPS कहा जाता है। आप विचारों को प्राप्त करने के लिए इसे देखना चाहते हैं क्योंकि यह उपयोगकर्ताओं को उन मानचित्रों को पूर्व-कैश करने की अनुमति देता है जिनकी उन्हें आवश्यकता होगी। मैं इसका उपयोग तब करता हूं जब मैं अफ्रीका, फ्लोरिडा एवरग्लेड्स, बोटिंग, या कहीं भी सेल फोन कवरेज में झाड़ी में गहरी हूं। मैं अपनी यात्रा से पहले नक्शे को कैश कर दूंगा और फिर अपने iPhone पर जीपीएस का उपयोग सामान्य रूप से नहीं कर सकता।

मूल रूप से वे xGPS क्या करते हैं और आप जो करना चाहते हैं, वह आपके फोन पर मैप टाइल्स को कैश करना है। इन मोबाइल फोन पर जगह सीमित है। हां, भले ही आपके फोन में 32 जीबी हो, यह सभी ज़ूम लेवल (स्केल्स) पर एक छोटे से देश को कैश करने के लिए पर्याप्त हो सकता है। इनमें से कोई भी फोन (जब तक कि किसी तरह बाहरी भंडारण से जुड़ा नहीं है) सभी ज़ूम स्तरों पर दुनिया को कैश करने के लिए पर्याप्त स्थान नहीं है। मुझे लगता है कि यह भंडारण की आवश्यकता होती है।

इसलिए आपको अपने उपयोगकर्ता से "क्षेत्रों" या मानचित्रों को कैश करने के लिए पूछने में सक्षम होना चाहिए जब वह ऑनलाइन हो तो वह उन्हें ऑफ़लाइन उपयोग कर सकता है। XGPS के साथ, मैं अपनी रुचि के क्षेत्र में एक बहुभुज आकर्षित करने में सक्षम हूं और निर्दिष्ट करता हूं कि मैं ज़ूम स्तर क्या कैश करना चाहता हूं। फिर यह मेरे फोन पर मेरे लिए यह सब डाउनलोड करना शुरू कर देगा, या तो फोन से ही या मेरे कंप्यूटर पर एक प्रोग्राम। फिर ऐप पर एक बटन है जो मुझे इंटरनेट कनेक्टिविटी के ढीले होने पर "ऑफ़लाइन" मोड पर स्विच करने की अनुमति देता है।


2

NextGIS मोबाइल SDK का उपयोग करने का प्रयास करें। ऑनलाइन / ऑफ़लाइन मोड में सर्वर (NextGIS वेब) के साथ संपादन और ऑटोसिंक शामिल हैं। रेखापुंज और वेक्टर परतें, कस्टम इनपुट फ़ॉर्म, सभी प्रकार की ज्यामिति समर्थन करते हैं।

एक उदाहरण एप्लिकेशन NextGIS मोबाइल Google Play स्टोर में पाया जा सकता है - https://play.google.com/store/apps/details?id=com.nextgis.mobile

सूत्र यहां हैं: https://github.com/nextgis/android_gisapp

दस्तावेज़: http://docs.nextgis.com/docs_ngmobile/source/toc.html

एक और सरल अनुप्रयोग यहाँ हैं: https://github.com/nextgis/android_muni_gisconf

SDK प्रलेखन: http://docs.nextgis.com/ngmobile_dev/toc.html


1

ArcGIS Android SDK की वर्तमान रिलीज़ के साथ ऑफ़लाइन मानचित्रों के लिए पूर्ण समर्थन है। यह नमूना आपको दिखाएगा कि कैसे एक स्थानीय टाइल पैकेज के साथ एक बेसमप के रूप में काम करना है और ऑनलाइन सुविधाओं को ऑफ़लाइन सुविधाओं के लिए जारी रखना है जिनसे आप संपादित कर सकते हैं। मैं एक है सार GitHub पर उपलब्ध रूप में अच्छी तरह के लिए एक सरल संदर्भ।


1

मैं Nutiteq 3D मानचित्र SDK पर एक नज़र डालने का सुझाव देता हूं जिसमें ऑफ़लाइन क्षमताएं और 3 डी समर्थन जैसे दिलचस्प अतिरिक्त हैं। यह इसके पीछे विशेष डेवलपर कंपनी द्वारा बनाया गया है, इसलिए इसने बड़े विक्रेताओं की तुलना में वाणिज्यिक समर्थन और अधिक लचीलापन समर्पित किया है। डिस्क्लेमर: मैं इसका डेवलपर हूं।

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