Solusi untuk aplikasi peta android dengan penggunaan offline?


14

Saya mencari cara untuk mengembangkan aplikasi untuk android dengan peta tertanam yang dapat bekerja tanpa koneksi internet (yaitu, bisakah saya mendapatkan ubin dari peta jalan terbuka untuk penggunaan offline?).

Saya telah mengembangkan aplikasi web sebelumnya dengan menggunakan google maps api v3. Saya memerlukan jawaban umum sebagai jawaban yang spesifik. Saya mencoba menemukan konsep dan teknologi yang perlu saya pelajari :)

(Sementara itu saya menemukan osmdroid. Apakah itu bekerja offline?)


Ini tidak benar-benar menjawab pertanyaan itu. Jika Anda memiliki pertanyaan yang berbeda, Anda dapat menanyakannya dengan mengeklik Ajukan Pertanyaan . Anda juga dapat menambahkan hadiah untuk menarik lebih banyak perhatian ke pertanyaan ini setelah Anda memiliki reputasi yang cukup .
Jason Scheirer

Osmand tidak memungkinkan untuk mengimpor peta yang dikustomisasi sesuai keinginan pengguna tetapi hanya memungkinkan untuk mengunduh peta langsung dari aplikasi untuk penggunaan offline. Seperti dalam kasus saya, saya perlu overlay lembar atas (peta Raster) yang dikonversi menjadi * .kmz. Persyaratan saya adalah untuk penggunaan offline. Saya mencari panduan yang tepat untuk mengembangkan aplikasi peta android dukungan offline tersebut.
surap

Ini tidak benar-benar menjawab pertanyaan awal tentang di mana dan bagaimana mendapatkan peta untuk penggunaan offline.
MaryBeth

Ini tidak benar-benar menjawab pertanyaan itu. Jika Anda memiliki pertanyaan yang berbeda, Anda dapat menanyakannya dengan mengeklik Ajukan Pertanyaan . Anda juga dapat menambahkan hadiah untuk menarik lebih banyak perhatian ke pertanyaan ini setelah Anda memiliki reputasi yang cukup . - Dari Ulasan
John Powell

Jawaban:



13

Saya melakukan peta offline menggunakan ESRI Android SDK dan lapisan ubin khusus. Saya menggunakan server ArcGIS untuk menghasilkan cache peta berbasis ubin, kemudian memasukkan ubin tersebut ke dalam database SQLite dan meminta mereka berdasarkan pada baris dan kolom dari sana. Ini berfungsi dengan baik dan jika Anda membutuhkan peta khusus ujung ke ujung, ini adalah metode yang sangat berguna.

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

}


Bisakah Anda membagikan beberapa kode?
gregm

Saya menambahkan kelas lapisan kustom saya yang berfungsi.
eptiliom

7

Saya telah mengembangkan aplikasi dengan peta offline untuk Android. Satu-satunya alat gratis yang ingin Anda gunakan adalah OSMDroid, kalau tidak ESRI. API OSMDroid identik dengan Google, jadi jika Anda ingin beralih dari satu ke yang lain, itu mudah.

Lihat pos ini , dengan contoh cara mengintegrasikan Google Maps ke OSMDroid (ini juga memberi Anda ide cara menggunakannya secara umum).


2

Ada aplikasi hebat bernama xGPS untuk iPhone dan perangkat lain. Anda mungkin ingin melihatnya untuk mendapatkan ide karena memungkinkan pengguna untuk melakukan pra-cache peta yang mereka perlukan. Saya menggunakannya ketika saya jauh di semak-semak di Afrika, Florida Everglades, berperahu, atau di mana saja saya tidak memiliki jangkauan ponsel. Saya akan melakukan cache peta sebelum perjalanan dan kemudian dapat menggunakan GPS di iphone saya secara normal tanpa NO INTERNET.

Pada dasarnya apa yang mereka lakukan xGPS dan apa yang ingin Anda lakukan adalah men-cache ubin peta secara lokal di ponsel Anda. Ruang pada ponsel ini terbatas. Ya bahkan jika Anda memiliki 32GB di ponsel Anda, mungkin cukup untuk melakukan cache negara kecil di semua level zoom (skala). Tak satu pun dari ponsel ini (kecuali entah bagaimana terpasang ke penyimpanan eksternal) akan memiliki ruang yang cukup untuk melakukan cache dunia pada semua level zoom. Saya membayangkan ini akan membutuhkan penyimpanan petabyte.

Jadi, Anda harus dapat meminta pengguna untuk menyimpan "wilayah" atau peta saat dia online sehingga ia dapat menggunakannya secara offline. Dengan xGPS saya dapat menggambar poligon di atas wilayah yang saya minati dan menentukan level zoom apa yang ingin saya cache. Kemudian akan mulai mengunduh semuanya untuk saya aktifkan ke telepon saya, baik dari telepon itu sendiri atau dari program di komputer saya. Lalu ada tombol pada aplikasi yang memungkinkan saya untuk beralih ke mode "offline" ketika saya kehilangan konektivitas internet.


2

Coba gunakan NextGIS Mobile SDK. Mode online / offline termasuk pengeditan dan autosync dengan server (NextGIS Web). Lapisan raster dan vektor, formulir input khusus, semua jenis dukungan geometri.

Contoh aplikasi NextGIS Mobile dapat ditemukan di Google Play store - https://play.google.com/store/apps/details?id=com.nextgis.mobile

Sumber ada di sini: https://github.com/nextgis/android_gisapp

Dokumentasi: http://docs.nextgis.com/docs_ngmobile/source/toc.html

Aplikasi sederhana lainnya ada di sini: https://github.com/nextgis/android_muni_gisconf

Dokumentasi SDK: http://docs.nextgis.com/ngmobile_dev/toc.html


1

Ada dukungan penuh untuk peta offline dengan rilis ArcGIS Android SDK saat ini. Sampel ini akan menunjukkan kepada Anda bagaimana bekerja dengan Paket Ubin lokal sebagai basemap dan bertahan fitur online untuk fitur offline dari mana ada cara Anda dapat mengedit. Saya memiliki inti yang tersedia di github juga untuk referensi yang disederhanakan.


1

Saya sarankan untuk melihat peta SDK Nutiteq 3D yang memiliki kemampuan offline dan tambahan menarik seperti dukungan 3D. Itu dibuat oleh perusahaan pengembang khusus di belakangnya, sehingga telah mendedikasikan dukungan komersial dan lebih banyak fleksibilitas daripada yang diberikan vendor besar. Penafian: Saya pengembangnya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.