¿Solución para la aplicación de mapas de Android con uso sin conexión?

14

Estoy en busca de una forma de desarrollar una aplicación para Android con mapas integrados que pueda funcionar sin conexión a Internet (es decir, ¿puedo obtener los mosaicos de Streetmap abierto para uso sin conexión?).

He desarrollado aplicaciones web anteriormente utilizando la aplicación google maps api v3. Necesito una respuesta general como específica. Estoy tratando de encontrar los conceptos y tecnologías que necesito aprender :)

(Mientras tanto, he encontrado osmdroid . ¿Funciona sin conexión?)

    
pregunta Argiropoulos Stavros 22.03.2011 - 15:32

7 respuestas

8

¿Está buscando desarrollo para aplicaciones móviles / celulares? como la nueva tableta de Google viene con Google Maps sin conexión en formato vectorial en lugar de mosaicos rasterizados.

Google Honeycomb (Tablet) tiene soporte completo para Google Maps Offline (Vector)

enlace

El video en la parte inferior explica y muestra la aplicación.

    
respondido por el Mapperz 22.03.2011 - 16:13
13

Hice un mapa sin conexión utilizando el SDK de Android de ESRI y una capa de mosaico personalizada. Utilicé un servidor ArcGIS para generar un caché de mapa basado en mosaicos, luego inserté esos mosaicos en una base de datos SQLite y los consulté en función de la fila y la columna desde allí. Funciona muy bien y si necesita mapas personalizados de extremo a extremo, es un método muy útil.

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

}

    
respondido por el eptiliom 07.11.2011 - 05:03
7

He desarrollado una aplicación con mapas fuera de línea para Android. La única herramienta gratuita que desearía usar es OSMDroid, de lo contrario ESRI. La API de OSMDroid es idéntica a la de Google, por lo que en caso de que desee cambiar de una a otra, es muy fácil.

Consulte esta publicación , con una muestra de cómo integre Google Maps en OSMDroid (también le da una idea de cómo usarlo en general).

    
respondido por el Ilya Saunkin 09.05.2011 - 13:04
2

Hay una gran aplicación llamada xGPS para iPhone y otros dispositivos. Es posible que desee ver eso para obtener ideas, ya que les permite a los usuarios guardar en antememoria los mapas que necesitarán. Lo uso cuando estoy metido en el monte de África, Florida Everglades, canotaje o en cualquier lugar donde no tenga cobertura de teléfono celular. Guardaré en caché los mapas antes de mi viaje y luego podré usar el GPS en mi iPhone normalmente SIN INTERNET.

Básicamente, lo que ellos hacen con xGPS y lo que querrías hacer es almacenar en caché los mosaicos de mapas localmente en tu teléfono. El espacio en estos teléfonos móviles es limitado. Sí, incluso si tiene 32 GB en su teléfono, podría ser suficiente para almacenar en caché un país pequeño en todos los niveles de zoom (escalas). Ninguno de estos teléfonos (a menos que esté conectado a un almacenamiento externo) tendrá suficiente espacio para almacenar el mundo en todos los niveles de zoom. Me imagino que esto requeriría petabytes de almacenamiento.

Por lo tanto, debe poder pedirle a su usuario que almacene en caché las "regiones" o los mapas cuando esté en línea para que pueda usarlos sin conexión. Con xGPS puedo dibujar un polígono sobre mi región de interés y especificar qué niveles de zoom quiero almacenar en la memoria caché. Luego comenzará a descargarlo todo para mí en mi teléfono, ya sea desde el teléfono mismo o desde un programa en mi computadora. Luego hay un botón en la aplicación que me permite cambiar al modo "fuera de línea" cuando pierdo la conectividad a Internet.

    
respondido por el CaptDragon 09.05.2011 - 15:09
2

Intente usar el SDK de NextGIS Mobile. El modo en línea / fuera de línea incluye la edición y la sincronización automática con el servidor (NextGIS Web). Capas vectoriales y ráster, formularios de entrada personalizados, todos los tipos de soporte de geometría.

Se puede encontrar una aplicación de ejemplo NextGIS Mobile en Google Play store - enlace

Las fuentes están aquí: enlace

Documentación: enlace

Otra aplicación sencilla está aquí: enlace

Documentación del SDK: enlace

    
respondido por el Dmitry Baryshnikov 06.10.2016 - 20:09
1

Hay soporte completo para mapas sin conexión con la versión actual de ArcGIS Android SDK. Esta muestra le mostrará cómo trabajar con un paquete de Tile local como un mapa de base y características persistentes en línea a características sin conexión desde las cuales hay formas de editar. Tengo una gist disponible en github también para una referencia simplificada.

    
respondido por el jdONeill 14.03.2013 - 01:00
1

Le sugiero que eche un vistazo a Nutiteq 3D maps SDK que Tiene capacidades fuera de línea y extras interesantes como soporte 3D. Está hecho por una compañía desarrolladora especializada que lo respalda, por lo que cuenta con soporte comercial dedicado y más flexibilidad que la que ofrecen los grandes proveedores. Descargo de responsabilidad: soy desarrollador de él.

    
respondido por el JaakL 03.06.2014 - 07:53

Lea otras preguntas en las etiquetas