Решение для приложения Android Map с автономным использованием?


14

Я нахожусь в поиске способа разработки приложения для Android со встроенными картами, которое может работать без подключения к интернету (т.е. могу ли я получить плитки открытого плана улиц для автономного использования?).

Я разработал веб-приложения раньше, используя Google Maps API v3. Мне нужен общий ответ как конкретный. Я пытаюсь найти концепции и технологии, которые мне нужно изучить :)

(Тем временем я нашел osmdroid. Работает ли он в автономном режиме?)


Это на самом деле не отвечает на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав Задать вопрос . Вы также можете добавить вознаграждение, чтобы привлечь больше внимания к этому вопросу, когда у вас будет достаточно репутации .
Джейсон Шейрер,

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

Это на самом деле не отвечает на первоначальный вопрос о том, где и как получить карты для автономного использования.
MaryBeth

Это на самом деле не отвечает на вопрос. Если у вас есть другой вопрос, вы можете задать его, нажав Задать вопрос . Вы также можете добавить вознаграждение, чтобы привлечь больше внимания к этому вопросу, когда у вас будет достаточно репутации . - Из обзора
Джон Пауэлл

Ответы:


8

Вы ищете разработку для мобильного / мобильного приложения? новый планшет Google поставляется с автономными картами Google в векторном формате, а не с растровыми плитками.

Google Honeycomb (планшет) имеет полную поддержку Google Maps Offline (Vector)

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

}


Не могли бы вы поделиться кодом?
Грегм

Я добавил свой пользовательский класс слоев, который выполняет эту работу.
Эптилиом

7

Я разработал приложение с автономными картами для Android. Единственный бесплатный инструмент, который вы хотели бы использовать, это OSMDroid, иначе ESRI. API OSMDroid идентичен Google, поэтому, если вы хотите переключиться с одного на другое, это просто.

Проверьте этот пост , с образцом того , как интегрировать Google Maps в 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

Я предлагаю взглянуть на SDK Nutiteq 3D maps, который имеет офлайновые возможности и интересные дополнения, такие как поддержка 3D. Он сделан специализированной компанией-разработчиком, поэтому он имеет специальную коммерческую поддержку и большую гибкость, чем предоставляют крупные поставщики. Отказ от ответственности: я разработчик этого.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.