14 votos

Solución para android app de mapas con su uso sin conexión

Como el título revela estoy en busca de una manera de desarrollar una app para android con la inserción de mapas que pueden trabajar sin una conexión a internet(es decir, puedo obtener los azulejos de la open streetmap para su uso sin conexión?).

He desarrollado aplicaciones web antes por el uso de la api de google maps v3. Necesito una respuesta general como específica.Estoy tratando de encontrar los conceptos y tecnologías que se necesitan para aprender :)

(Mientras tanto he encontrado osmdroid.Funciona sin conexión a internet?)

Saludos

13voto

Joseph Quinsey Puntos 205

Hice un mapa sin conexión mediante el ESRI SDK de Android, y es una costumbre de la capa de mosaico. He utilizado una de ArcGIS server para generar un mosaico basado en memoria caché de mapa, a continuación, inserta los azulejos en una base de datos SQLite y consulta de ellos basado en la fila y la columna a partir de ahí. Funciona muy bien y si necesitas mapas personalizados de extremo a extremo, es un método ú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;   
}

}

8voto

Erik Öjebo Puntos 6937

Estás buscando el Desarrollo para Móviles/Celulares App? como la nueva Tablet de Google viene con la línea de los Mapas de Google en formato vectorial en lugar de ráster azulejos.

Google nido de abeja (Tablet) tiene soporte completo de Google Maps sin conexión (Vector)

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

Video en la parte inferior se explica y se muestra la aplicación.

7voto

Macha Puntos 207

He desarrollado una aplicación con mapas fuera de línea para Android. La única gratuita de la herramienta que desea utilizar es OSMDroid, de lo contrario ESRI. OSMDroid API es idéntica a la de Google, por lo que en caso de que quieras cambiar de uno a otro, es una brisa.

Echa un vistazo a este post, con una muestra de cómo integrar Google Maps en OSMDroid (también le da una idea de cómo utilizarlo en general).

2voto

Vasu Puntos 11

Hay una gran app llamada xGPS para el iPhone y otros dispositivos. Es posible que desee buscar en que para obtener ideas porque permite a los usuarios pre-caché de los mapas que se van a necesitar. Yo lo uso cuando estoy profundamente en la selva en África, los Everglades de Florida, paseos en bote, o en cualquier lugar donde no tienen cobertura de telefonía celular. Voy a la caché de los mapas antes de mi viaje y, a continuación, puede utilizar el GPS en mi iphone normalmente SIN INTERNET.

Básicamente lo que xGPS hace y lo que quiere hacer es la caché de los mapas localmente en el teléfono. El espacio en que estos teléfonos móviles son limitados. Sí, incluso si usted tiene 32gb en su teléfono, puede ser suficiente para la caché de un pequeño país en todos los niveles de zoom (escalas). Ninguno de estos teléfonos (a menos que de alguna manera relacionada con el almacenamiento externo) van a tener suficiente espacio para almacenar en caché el mundo en todos los niveles de zoom. Me imagino que esto requeriría petabytes de almacenamiento.

Por lo que necesita para ser capaz de pedir a su usuario a la caché de las "regiones" o mapas cuando está en línea, así que él puede utilizar sin conexión. Con xGPS soy capaz de dibujar un polígono sobre mi región de interés y especificar en qué niveles de zoom quiero caché. A continuación, se iniciará la descarga de todo para mí en mi teléfono, ya sea desde el propio teléfono o un programa en mi ordenador. Entonces, hay un botón en la aplicación que me permite cambiar a modo "sin conexión" cuando pierdo la conexión a internet.

1voto

No hay soporte completo para mapas fuera de línea con la versión actual de ArcGIS SDK de Android. Este ejemplo le mostrará cómo trabajar con un icono local Paquete como un mapa base y persistir en funciones en línea a fuera de línea cuenta de que hay maneras que usted puede editar. Tengo un gist está disponible en github, así como para una simplificado de referencia.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X