オフラインで使用するAndroidマップアプリのソリューション


14

私は、インターネットに接続せずに動作する埋め込みマップを備えたAndroid用アプリを開発する方法を探しています(つまり、オフラインで使用するためにオープンストリートマップのタイルを取得できますか?)。

Google Maps API v3を使用して、以前にWebアプリを開発しました。特定の回答として一般的な回答が必要です。学ぶ必要がある概念と技術を見つけようとしています:)

(一方、osmdroidを見つけました。オフラインで動作しますか?)


これは本当に質問に答えません。別の質問がある場合は、質問するをクリックして質問することができます。十分な評判を得たら、この質問にもっと注意を引くために賞金追加することもできます。
ジェイソンシャイラー

Osmandは、ユーザーの希望に応じてカスタマイズされたマップをインポートすることはできませんが、オフラインで使用するためにアプリから直接マップをダウンロードすることのみを許可します。私の場合のように、*。kmzに変換されたトポシート(ラスターマップ)をオーバーレイする必要があります。私の要件はオフラインでの使用です。このようなオフラインマップサポートAndroidアプリケーションを開発するための適切なガイダンスを探しています。
-Surap

これは、オフラインで使用するためのマップをどこでどのように取得するかという元の質問に実際には答えていません。
MaryBeth

これは本当に質問に答えません。別の質問がある場合は、質問するをクリックして質問することができます。十分な評判を得たら、この質問にもっと注意を引くために賞金追加することもできます。- レビューから
ジョンパウエル

回答:


8

モバイル/セルアプリの開発をお探しですか?新しいGoogleタブレットには、ラスタータイルではなくベクター形式のオフラインGoogleマップが付属しています。

Google Honeycomb(Tablet)は、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;   
}

}


コードを教えてください。
グレム

作業を行うカスタムレイヤークラスを追加しました。
-eptiliom

7

Android用のオフラインマップを使用したアプリケーションを開発しました。使用したい唯一の無料ツールはOSMDroidです。それ以外の場合はESRIです。OSMDroid APIはGoogleのものと同一であるため、あるものから別のものに切り替えたい場合は簡単です。

Google MapsをOSMDroidに統合する方法のサンプルとともに、この投稿をチェックしてください(一般的な使用方法のアイデアも提供します)。


2

iPhoneやその他のデバイス用のxGPSという素晴らしいアプリがあります。ユーザーが必要なマップを事前にキャッシュできるので、アイデアを得るためにそれを見ることをお勧めします。アフリカ、フロリダ州のエバーグレーズ、ボート、または携帯電話が届かない場所の奥深くにいるときに使用します。旅行前に地図をキャッシュし、通常はインターネットなしでiPhoneでGPSを使用できます。

基本的に彼らがxGPSで何をしたいのか、あなたがしたいのはあなたの携帯電話にマップタイルをローカルにキャッシュすることです。これらの携帯電話のスペースは限られています。はい、携帯電話に32GBを搭載していても、すべてのズームレベル(スケール)で小さな国をキャッシュするだけで十分かもしれません。これらの携帯電話はどれも(何らかの方法で外部ストレージに接続されていない限り)、すべてのズームレベルで世界をキャッシュするのに十分なスペースを持ちません。これにはペタバイトのストレージが必要になると思います。

そのため、ユーザーがオンラインのときに「リージョン」またはマップをキャッシュして、オフラインで使用できるようにユーザーに依頼できるようにする必要があります。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

オフライン機能と3Dサポートなどの興味深い追加機能を備えたNutiteq 3DマップSDKご覧になることをお勧めします。その背後にある専門の開発会社によって作成されているため、専用の商用サポートと大手ベンダーが提供するよりも高い柔軟性を備えています。免責事項:私はそれの開発者です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.