인터넷 연결없이 작동 할 수있는 내장 된지 도로 안드로이드 용 앱을 개발하는 방법을 찾고 있습니다 (즉, 오프라인 사용을 위해 열린 거리지도 타일을 얻을 수 있습니까?).
Google지도 API v3을 사용하여 웹 앱을 개발했습니다. 특정 답변으로 일반적인 답변이 필요합니다. 배워야 할 개념과 기술을 찾으려고합니다. :)
(내가 osmdroid를 찾았습니다. 오프라인으로 작동합니까?)
인터넷 연결없이 작동 할 수있는 내장 된지 도로 안드로이드 용 앱을 개발하는 방법을 찾고 있습니다 (즉, 오프라인 사용을 위해 열린 거리지도 타일을 얻을 수 있습니까?).
Google지도 API v3을 사용하여 웹 앱을 개발했습니다. 특정 답변으로 일반적인 답변이 필요합니다. 배워야 할 개념과 기술을 찾으려고합니다. :)
(내가 osmdroid를 찾았습니다. 오프라인으로 작동합니까?)
답변:
Mobile / Cell App 용 개발을 찾고 있습니까? 새로운 Google 태블릿은 래스터 타일이 아닌 벡터 형식의 오프라인 Google지도와 함께 제공됩니다.
Google Honeycomb (태블릿)은 Google Maps Offline (벡터)을 완벽하게 지원합니다.
하단의 비디오는 응용 프로그램을 설명하고 보여줍니다.
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;
}
}
iPhone 및 기타 장치 용 xGPS라는 훌륭한 앱이 있습니다. 사용자가 필요한 맵을 사전 캐시 할 수 있기 때문에 아이디어를 얻기 위해이를보고 싶을 것입니다. 아프리카, 플로리다 에버글레이즈, 보트, 또는 휴대 전화가없는 곳의 덤불에있을 때 사용합니다. 여행하기 전에지도를 캐시 한 다음 인터넷없이 인터넷에서 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
오프라인 기능과 3D 지원과 같은 흥미로운 추가 기능이있는 Nutiteq 3D 맵 SDK 를 살펴 보는 것이 좋습니다 . 그것은 전문 개발자 회사가 그 뒤에 만들었으므로 큰 상용 공급 업체가 제공하는 것보다 전용 상업용 지원과 더 많은 유연성을 가지고 있습니다. 면책 조항 : 나는 그것을 개발자입니다.