Рішення для Android-додатків із використанням в режимі офлайн?


14

Я шукаю спосіб розробити додаток для андроїд із вбудованими картами, які можуть працювати без підключення до Інтернету (тобто чи можу я отримати плитки відкритої вуличної карти для використання в автономному режимі?).

Я раніше розробляв веб-додатки, використовуючи google maps api v3. Мені потрібна загальна відповідь як конкретна. Я намагаюся знайти поняття та технології, які мені потрібно вивчити :)

(Тим часом я знайшов osmdroid. Чи працює він в режимі офлайн?)


Це насправді не відповідає на питання. Якщо у вас інше питання, ви можете задати його, натиснувши Задати питання . Ви також можете додати щедрості, щоб привернути більше уваги до цього питання, як тільки у вас буде достатня репутація .
Jason Scheirer

Osmand не дозволяє імпортувати будь-які спеціалізовані карти за бажанням користувача, але він дозволяє завантажувати карти прямо з програми для офлайн-використання. Як і в моєму випадку, мені потрібно накладати топошисти (растрові карти), які були перетворені в * .kmz. Моя вимога полягає у використанні офлайн. Я шукаю належне керівництво для розробки таких програм офлайн для підтримки карти для Android.
surap

Це насправді не відповідає початковому питанню про те, де та як отримати карти для офлайн-використання.
MaryBeth

Це насправді не відповідає на питання. Якщо у вас інше питання, ви можете задати його, натиснувши Задати питання . Ви також можете додати щедрості, щоб привернути більше уваги до цього питання, як тільки у вас буде достатня репутація . - З огляду
Джон Пауелл

Відповіді:


8

Шукаєте розробку для мобільних / мобільних додатків? оскільки новий планшет Google постачається з офлайн-картами Google у векторному форматі, а не растровими плитками.

Сота Google (планшетний ПК) має повну підтримку офлайн-карт Google (вектор)

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

Відео внизу пояснює та показує додаток.


13

Я робив офлайн-карту, використовуючи ESRI Android SDK та користувацький шар плитки. Я використовував сервер ArcGIS для генерації кешу на основі плитки, потім вставив ці плитки в базу даних 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;   
}

}


Чи можете ви поділитися кодом?
gregm

Я додав власний клас шару, який виконує роботу.
епітіома

7

Я розробив додаток з офлайн-картами для Android. Єдиний безкоштовний інструмент, який ви хочете використовувати, це OSMDroid, інакше ESRI. API OSMDroid ідентичний Google, тому у випадку, якщо ви хочете перейти з одного на інший, це вітер.

Ознайомтеся з цією публікацією з прикладом того, як інтегрувати Карти Google в OSMDroid (вона також дає вам уявлення про те, як її взагалі використовувати).


2

Існує чудове додаток під назвою xGPS для iPhone та інших пристроїв. Ви можете поглянути на це, щоб отримати ідеї, оскільки це дозволяє користувачам попередньо кешувати потрібні карти. Я використовую його, коли я заглиблююся в кущ в Африці, Флориді Еверглейдс, катаюсь на човнах чи де завгодно, у мене немає покриття стільникового телефону. Я буду кешувати карти перед поїздкою, а потім можу використовувати GPS на своєму iphone як правило, без ІНТЕРНЕТУ.

В основному те, що вони роблять xGPS, і те, що ви хочете зробити, - це кешування плиток карти локально на вашому телефоні. Місце на цих мобільних телефонах обмежене. Так, навіть якщо у вас на телефоні є 32 Гб, це може бути достатньо для кешування невеликої країни на всіх рівнях масштабування (масштабах). Жоден із цих телефонів (якщо якимось чином не підключений до зовнішнього сховища) не матиме достатньо місця для кешування світу на всіх рівнях збільшення. Я думаю, що для цього знадобиться петабайт сховища.

Тому вам потрібно мати можливість попросити свого користувача кешувати "регіони" або карти, коли він в Інтернеті, щоб він міг ними користуватися в режимі офлайн. За допомогою xGPS я можу намалювати полігон над моєю цікавою областю та вказати, які рівні масштабування я хочу кешувати. Тоді воно почне завантажувати все це на мій телефон, або з самого телефону, або з програми на мій комп'ютер. Потім у програмі є кнопка, яка дозволяє мені перейти в режим "офлайн", коли я втрачаю підключення до Інтернету.


2

Спробуйте використовувати NextGIS Mobile SDK. Режим онлайн / офлайн включає редагування та автоматичну синхронізацію з сервером (NextGIS Web). Растрові та векторні шари, спеціальні форми введення, підтримка всіх типів геометрії.

Приклад програми NextGIS Mobile можна знайти в магазині 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, яка має офлайн-можливості та цікаві додатки, такі як підтримка 3D. Його виготовляє спеціалізована компанія-розробник, яка має за собою комерційну підтримку та більшу гнучкість, ніж надають великі виробники. Відмова: Я розробник цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.