私は、インターネットに接続せずに動作する埋め込みマップを備えたAndroid用アプリを開発する方法を探しています(つまり、オフラインで使用するためにオープンストリートマップのタイルを取得できますか?)。
Google Maps API v3を使用して、以前にWebアプリを開発しました。特定の回答として一般的な回答が必要です。学ぶ必要がある概念と技術を見つけようとしています:)
(一方、osmdroidを見つけました。オフラインで動作しますか?)
私は、インターネットに接続せずに動作する埋め込みマップを備えたAndroid用アプリを開発する方法を探しています(つまり、オフラインで使用するためにオープンストリートマップのタイルを取得できますか?)。
Google Maps API v3を使用して、以前にWebアプリを開発しました。特定の回答として一般的な回答が必要です。学ぶ必要がある概念と技術を見つけようとしています:)
(一方、osmdroidを見つけました。オフラインで動作しますか?)
回答:
モバイル/セルアプリの開発をお探しですか?新しいGoogleタブレットには、ラスタータイルではなくベクター形式のオフラインGoogleマップが付属しています。
Google Honeycomb(Tablet)は、Google Maps Offline(Vector)を完全にサポートしています。
下部のビデオでアプリケーションの説明と表示が行われます。
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;
}
}
Android用のオフラインマップを使用したアプリケーションを開発しました。使用したい唯一の無料ツールはOSMDroidです。それ以外の場合はESRIです。OSMDroid APIはGoogleのものと同一であるため、あるものから別のものに切り替えたい場合は簡単です。
Google MapsをOSMDroidに統合する方法のサンプルとともに、この投稿をチェックしてください(一般的な使用方法のアイデアも提供します)。
iPhoneやその他のデバイス用のxGPSという素晴らしいアプリがあります。ユーザーが必要なマップを事前にキャッシュできるので、アイデアを得るためにそれを見ることをお勧めします。アフリカ、フロリダ州のエバーグレーズ、ボート、または携帯電話が届かない場所の奥深くにいるときに使用します。旅行前に地図をキャッシュし、通常はインターネットなしでiPhoneでGPSを使用できます。
基本的に彼らがxGPSで何をしたいのか、あなたがしたいのはあなたの携帯電話にマップタイルをローカルにキャッシュすることです。これらの携帯電話のスペースは限られています。はい、携帯電話に32GBを搭載していても、すべてのズームレベル(スケール)で小さな国をキャッシュするだけで十分かもしれません。これらの携帯電話はどれも(何らかの方法で外部ストレージに接続されていない限り)、すべてのズームレベルで世界をキャッシュするのに十分なスペースを持ちません。これにはペタバイトのストレージが必要になると思います。
そのため、ユーザーがオンラインのときに「リージョン」またはマップをキャッシュして、オフラインで使用できるようにユーザーに依頼できるようにする必要があります。xGPSを使用すると、関心領域にポリゴンを描画し、キャッシュするズームレベルを指定できます。その後、携帯電話自体またはコンピュータ上のプログラムから、携帯電話にすべてのダウンロードが開始されます。次に、アプリにボタンがあり、インターネット接続を失ったときに「オフライン」モードに切り替えることができます。
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
オフライン機能と3Dサポートなどの興味深い追加機能を備えたNutiteq 3DマップSDKをご覧になることをお勧めします。その背後にある専門の開発会社によって作成されているため、専用の商用サポートと大手ベンダーが提供するよりも高い柔軟性を備えています。免責事項:私はそれの開発者です。