Çevrimdışı kullanım ile android harita uygulaması için çözüm?


14

Bir internet bağlantısı olmadan çalışabilir gömülü haritalar ile android için bir uygulama geliştirmek için bir yol arıyor (yani çevrimdışı kullanım için açık streetmap fayans alabilir miyim?).

Daha önce google maps api v3 kullanarak web uygulamaları geliştirdim. Belirli bir cevap olarak genel bir cevaba ihtiyacım var. Öğrenmem gereken kavramları ve teknolojileri bulmaya çalışıyorum :)

(Bu arada osmdroid buldum. Çevrimdışı çalışıyor mu?)


Bu soruya gerçekten cevap vermiyor. Farklı bir sorunuz varsa Soru Sor'u tıklayarak bunu sorabilirsiniz . Ayrıca , yeterli itibara sahip olduğunuzda bu soruya daha fazla dikkat çekmek için bir ödül ekleyebilirsiniz .
Jason Scheirer

Osmand, kullanıcının isteğine göre özelleştirilmiş haritaların içe aktarılmasına izin vermez, ancak yalnızca çevrimdışı kullanım için haritaları doğrudan uygulamadan indirmeye izin verir. Benim durumumda olduğu gibi, * .kmz'ye dönüştürülen toposheets (Raster haritaları) üzerine yerleşmem gerekiyor. Benim gereksinimim çevrimdışı kullanım içindir. Böyle çevrimdışı harita desteği android uygulaması geliştirmek için uygun bir rehberlik arıyorum.
surap

Bu, çevrimdışı kullanım için haritaların nereden ve nasıl alınacağına dair orijinal soruya gerçekten cevap vermiyor.
MaryBeth

Bu soruya gerçekten cevap vermiyor. Farklı bir sorunuz varsa Soru Sor'u tıklayarak bunu sorabilirsiniz . Ayrıca , yeterli itibara sahip olduğunuzda bu soruya daha fazla dikkat çekmek için bir ödül ekleyebilirsiniz . - Yorumdan
John Powell

Yanıtlar:



13

ESRI Android SDK'sını ve özel bir döşeme katmanını kullanarak çevrimdışı bir harita yaptım. Kiremit tabanlı bir harita önbelleği oluşturmak için bir ArcGIS sunucusu kullandım, sonra bu döşemeleri bir SQLite veritabanına ekledim ve oradan satır ve sütuna göre sorguladım. Harika çalışıyor ve özel haritalara uçtan uca ihtiyacınız varsa, çok kullanışlı bir yöntemdir.

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

}


Lütfen biraz kod paylaşabilir misiniz?
gregm

İşi yapan özel katman sınıfımı ekledim.
eptiliom

7

Android için çevrimdışı haritalar içeren bir uygulama geliştirdim. Kullanmak istediğiniz tek ücretsiz araç OSMDroid, aksi takdirde ESRI. OSMDroid API'si Google'ınkiyle aynıdır, bu nedenle birinden diğerine geçmek istiyorsanız, bu bir esinti.

Check out Bu yayını OSMDroid içine Google Maps nasıl entegre bir örnek ile, (aynı zamanda genel olarak nasıl kullanılacağını bir fikir verir).


2

İPhone ve diğer cihazlar için xGPS adında harika bir uygulama var. Fikir edinmek için buna bakmak isteyebilirsiniz, çünkü kullanıcıların ihtiyaç duydukları haritaları önceden önbelleğe almasına izin verir. Afrika, Florida Everglades, çalı veya cep telefonu kapsama alanı olmayan herhangi bir yerde çalı derin olduğunda kullanıyorum. Haritaları gezimden önce önbellekleyeceğim ve sonra iPhone'umdaki GPS'i normalde NO İNTERNET ile kullanacağım.

Temelde xGPS'nin yaptıkları ve yapmak istediğiniz şey, harita döşemelerini telefonunuzda yerel olarak önbelleğe almaktır. Bu cep telefonlarındaki alan sınırlıdır. Evet, telefonunuzda 32GB olsa bile, küçük bir ülkeyi tüm yakınlaştırma düzeylerinde (ölçekler) önbelleğe almak yeterli olabilir. Bu telefonların hiçbiri (bir şekilde harici depolama birimine bağlı değilse) dünyayı tüm yakınlaştırma düzeylerinde önbelleğe almak için yeterli alana sahip olmayacak. Bunun petabayt depolama gerektirdiğini düşünüyorum.

Bu nedenle, kullanıcıdan çevrimdışıyken "bölgeleri" veya haritaları önbelleğe almasını isteyebilmeniz için onları çevrimdışı kullanabilmesi gerekir. XGPS ile ilgilendiğim bölgeye bir çokgen çizebilir ve hangi yakınlaştırma düzeylerini önbelleğe almak istediğimi belirtebilirim. Ardından, telefonun kendisinden veya bilgisayarımdaki bir programdan, benim için hepsini indirmeye başlayacak. Sonra app internet bağlantısı gevşek zaman "çevrimdışı" moduna geçmek için izin veren bir düğme var.


2

NextGIS Mobile SDK'yı kullanmayı deneyin. Çevrimiçi / çevrimdışı mod, sunucuyla düzenleme ve otomatik senkronizasyonu içerir (NextGIS Web). Raster ve vektör katmanları, özel giriş formları, her türlü geometri desteği.

NextGIS Mobile için örnek bir uygulama Google Play mağazasında bulunabilir - https://play.google.com/store/apps/details?id=com.nextgis.mobile

Kaynaklar burada: https://github.com/nextgis/android_gisapp

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

Başka bir basit uygulama burada: https://github.com/nextgis/android_muni_gisconf

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


1

ArcGIS Android SDK'nın mevcut sürümü ile çevrimdışı haritalar için tam destek var. Bu örnek , temel bir harita olarak yerel bir Döşeme Paketi ile nasıl çalışacağınızı gösterecek ve çevrimiçi özellikleri, düzenleyebileceğiniz yollar bulunan çevrimdışı özelliklere devam edecektir. Bir var özünü github üzerinde mevcut yanı için basitleştirilmiş bir referans.


1

Çevrimdışı yeteneklere ve 3D desteği gibi ilginç ekstralara sahip Nutiteq 3D haritalar SDK'ya göz atmanızı öneririm . Arkasındaki uzman geliştirici şirket tarafından yapılmıştır, bu nedenle büyük satıcıların sunduğundan daha fazla ticari desteğe ve daha fazla esnekliğe sahiptir. Yasal Uyarı: Ben geliştiriciyim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.