วิธีแก้ปัญหาสำหรับแอพ Android แผนที่ที่ใช้งานออฟไลน์หรือไม่


14

ฉันกำลังค้นหาวิธีในการพัฒนาแอพสำหรับ Android ด้วยแผนที่แบบฝังซึ่งสามารถทำงานได้โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต

ฉันได้พัฒนาเว็บแอปพลิเคชันมาก่อนโดยใช้ google maps api v3 ฉันต้องการคำตอบทั่วไปโดยเฉพาะเจาะจงฉันกำลังพยายามค้นหาแนวคิดและเทคโนโลยีที่ฉันต้องการเรียนรู้ :)

(ในขณะที่ฉันพบosmdroid .Does มันทำงานแบบออฟไลน์?)


นี่ไม่ได้ตอบคำถามจริงๆ หากคุณมีคำถามที่แตกต่างที่คุณสามารถถามได้โดยคลิกที่ถามคำถาม นอกจากนี้คุณยังสามารถเพิ่มเงินรางวัลเพื่อดึงดูดความสนใจมากขึ้นกับคำถามนี้เมื่อคุณมีเพียงพอชื่อเสียง
Jason Scheirer

Osmand ไม่อนุญาตให้นำเข้าแผนที่ที่กำหนดเองตามที่ผู้ใช้ต้องการ แต่อนุญาตให้ดาวน์โหลดแผนที่ได้โดยตรงจากแอพสำหรับใช้งานออฟไลน์ ในกรณีของฉันฉันต้องวางทับ toposheets (แผนที่ Raster) ซึ่งถูกแปลงเป็น * .kmz ความต้องการของฉันสำหรับการใช้งานออฟไลน์ ฉันกำลังมองหาคำแนะนำที่เหมาะสมในการพัฒนาแอพพลิเคชั่นแผนที่สนับสนุน Android แบบออฟไลน์
surap

สิ่งนี้ไม่ได้ตอบคำถามดั้งเดิมของสถานที่และวิธีรับแผนที่สำหรับใช้งานแบบออฟไลน์
MaryBeth

นี่ไม่ได้ตอบคำถามจริงๆ หากคุณมีคำถามที่แตกต่างที่คุณสามารถถามได้โดยคลิกที่ถามคำถาม นอกจากนี้คุณยังสามารถเพิ่มเงินรางวัลเพื่อดึงดูดความสนใจมากขึ้นกับคำถามนี้เมื่อคุณมีเพียงพอชื่อเสียง - จากรีวิว
John Powell

คำตอบ:


8

คุณกำลังมองหาการพัฒนาแอพมือถือ / มือถือหรือไม่? เนื่องจากแท็บเล็ต Google ใหม่มาพร้อมกับ Google แผนที่ออฟไลน์ในรูปแบบเวกเตอร์แทนที่จะเป็นภาพแรสเตอร์

Google Honeycomb (Tablet) ได้รับการสนับสนุนอย่างเต็มที่จาก Google Maps ออฟไลน์ (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;   
}

}


คุณกรุณาแบ่งปันรหัสได้ไหม
gregm

ฉันเพิ่มคลาสเลเยอร์ที่กำหนดเองที่ใช้งานได้
eptiliom

7

ฉันได้พัฒนาแอปพลิเคชันพร้อมแผนที่ออฟไลน์สำหรับ Android เครื่องมือฟรีเดียวที่คุณต้องการใช้คือ OSMDroid หรือ ESRI OSMDroid API นั้นเหมือนกับของ Google ดังนั้นในกรณีที่คุณต้องการสลับจากที่หนึ่งไปอีกที่หนึ่งก็เป็นเรื่องง่าย

ลองดูโพสต์นี้พร้อมตัวอย่างวิธีรวม Google Maps เข้ากับ OSMDroid (มันช่วยให้คุณมีความคิดในการใช้งานทั่วไป)


2

มีแอพที่ยอดเยี่ยมที่เรียกว่า xGPS สำหรับ iPhone และอุปกรณ์อื่น ๆ คุณอาจต้องการดูสิ่งนั้นเพื่อรับแนวคิดเพราะจะช่วยให้ผู้ใช้แคชแผนที่ล่วงหน้าที่พวกเขาต้องการ ฉันใช้มันเมื่อฉันอยู่ในป่าลึกในแอฟริกาฟลอริดาเอเวอร์เกลดส์แล่นเรือหรือที่ไหนก็ตามที่ฉันไม่มีสัญญาณโทรศัพท์มือถือ ฉันจะแคชแผนที่ก่อนการเดินทางและสามารถใช้ GPS บน iphone ของฉันตามปกติโดยไม่มีอินเทอร์เน็ต

โดยพื้นฐานแล้วสิ่งที่ xGPS ทำและสิ่งที่คุณต้องการทำคือแคชไทล์แผนที่ในโทรศัพท์ของคุณ พื้นที่บนโทรศัพท์มือถือเหล่านี้มี จำกัด ใช่แม้ว่าคุณจะมี 32gb ในโทรศัพท์ของคุณมันอาจจะเพียงพอที่จะแคชประเทศเล็ก ๆ ในทุกระดับการซูม (สเกล) ไม่มีโทรศัพท์เหล่านี้ (เว้นแต่จะเชื่อมต่อกับที่เก็บข้อมูลภายนอก) จะมีพื้นที่เพียงพอที่จะแคชโลกในทุกระดับการซูม ฉันคิดว่านี่จะต้องใช้พื้นที่เก็บข้อมูลเป็นเพตาไบต์

ดังนั้นคุณต้องขอให้ผู้ใช้ของคุณแคช "แผนที่" หรือแผนที่เมื่อเขาออนไลน์เพื่อให้เขาสามารถใช้พวกเขาออฟไลน์ ด้วย xGPS ฉันสามารถวาดรูปหลายเหลี่ยมบนพื้นที่ที่ฉันสนใจและระบุระดับการซูมที่ฉันต้องการแคช จากนั้นมันจะเริ่มดาวน์โหลดทั้งหมดสำหรับฉันไปยังโทรศัพท์ของฉันไม่ว่าจะจากโทรศัพท์หรือโปรแกรมบนคอมพิวเตอร์ของฉัน จากนั้นมีปุ่มบนแอพที่อนุญาตให้ฉันเปลี่ยนเป็นโหมด "ออฟไลน์" เมื่อฉันขาดการเชื่อมต่ออินเทอร์เน็ต


2

ลองใช้ NextGIS Mobile SDK โหมดออนไลน์ / ออฟไลน์รวมถึงการแก้ไขและ autosync กับเซิร์ฟเวอร์ (เว็บ NextGIS) เลเยอร์แรสเตอร์และเวกเตอร์รูปแบบการป้อนข้อมูลที่กำหนดเองสนับสนุนรูปทรงเรขาคณิตทุกประเภท

แอปพลิเคชันตัวอย่าง 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

ฉันขอแนะนำให้ดูที่Nutiteq 3D maps SDKซึ่งมีความสามารถออฟไลน์และสิ่งที่น่าสนใจเพิ่มเติมเช่นการรองรับ 3D มันทำโดย บริษัท ผู้พัฒนาเฉพาะด้านหลังดังนั้นจึงมีการสนับสนุนเชิงพาณิชย์โดยเฉพาะและมีความยืดหยุ่นมากกว่าผู้ขายรายใหญ่ คำเตือน: ฉันเป็นผู้พัฒนามัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.