首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OSMdroid通过ListView加载多个脱机MBTIles

OSMdroid通过ListView加载多个脱机MBTIles
EN

Stack Overflow用户
提问于 2015-07-10 17:40:12
回答 1查看 1.9K关注 0票数 2

我使用的是OSMdroid和脱机MBTiles。我需要能够添加用户从一个MBtiles中选择多个ListViewListView窗口很简单。但是,我需要帮助根据从MBtiles中选择的MBtiles加载不同的ListView。我的MBTiles是从SDCard加载的。

代码语言:javascript
复制
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapController;
import org.osmdroid.views.MapView;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RelativeLayout;

public class OfflineMapDemoActivity extends Activity {

    private String MapName;

    public String getMapName(){
        return MapName;
    }
    public void setMapName(String s){
        MapName = s;
    }

    // layout
    private RelativeLayout mapLayout;

    // MapView
    private MapView mapView;
    private MapController mapController;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


        // init Layout
        setContentView(R.layout.main);
        this.mapLayout = (RelativeLayout) findViewById(R.id.mapLayout);

        // init Offline Map
        MapName="World.sqlitedb";
        this.mapView = new OfflineMapView(this, MapName);
        this.mapController = mapView.getController();

        // set Zoom Countrol
        this.mapView.setBuiltInZoomControls(true);
        // set Touch Control
        this.mapView.setMultiTouchControls(true);
        // zoom to 15
        this.mapController.setZoom(15);
        //add mapview
        this.mapLayout.addView(this.mapView, new RelativeLayout.LayoutParams(
                    android.view.ViewGroup.LayoutParams.FILL_PARENT,
                    android.view.ViewGroup.LayoutParams.FILL_PARENT));

        // scroll to 24082456, 120558472
        GeoPoint geoPoint = new GeoPoint(24082456, 120558472);
        this.mapController.setCenter(geoPoint);

    }
}

我创建一个全局字符串变量来保存MapName,其中Listview类可以通过公共方法setMapName()进行设置。

顺便问一下,有没有一种方法可以自动读取MBTiles中心,而不是像这样硬编码呢?

代码语言:javascript
复制
    // scroll to 24082456, 120558472
    GeoPoint geoPoint = new GeoPoint(24082456, 120558472);
    this.mapController.setCenter(geoPoint);

当用户每次从OSMdroidListView切换到MBtiles映射以从列表视图加载所选的脱机MBtiles映射时,应该使用哪种方法?上面的Create方法只在第一次加载MBTiles映射时加载一次吗?这是列表视图代码。

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.SimpleAdapter;

public class MyTwoListItemsActivity extends ListActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ArrayList<Map<String, String>> list = buildData();
        String[] from = { "mapname", "selected" };
        int[] to = { android.R.id.text1, android.R.id.text2 };

        SimpleAdapter adapter = new SimpleAdapter(this, list,
            android.R.layout.simple_list_item_2, from, to);
        setListAdapter(adapter);
    }

    private ArrayList<Map<String, String>> buildData() {
        ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
        list.add(putData("Map1", "Map1"));
        list.add(putData("Map2", "Map2"));
        list.add(putData("Map3", "Map3"));
        return list;
    } 

    private HashMap<String, String> putData(String name, String purpose) {
        HashMap<String, String> item = new HashMap<String, String>();
        item.put("mapname", mapname);
        item.put("selected", selected);
        return item;
    }

} 

如何集成MyTwoListItemsActivityOfflineMapDemoActivity之间的切换

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-11 22:13:22

很小的世界,我只是做了你想要的。它需要一个补丁的osmdroid。

假设应用了修补程序,您需要自己对MapTileProviderBase进行扩展(请参阅MapTileProviderBasic作为参考)。您需要创建一个构造函数,该构造函数接收文件数组,然后将其传递给FileArchiveProvider。在这里,一旦用户选择了要用于脱机映射的文件,然后将该列表传递给您的自定义瓷砖提供程序的实例,然后调用MapView.setTileProvider。

还请注意,/sdcard/osmdroid在此用途上工作正常,但是如果您的设备位于kitkat上,并且文件位于/storage/extSdCard (例如三星设备),则还需要

最后,我将为一些我制作的适配器提交一个拉请求,以使这个过程更简单。

编辑:你的直接问题是“如何在MyTwoListItemsActivity和OfflineMapDemoActivity之间集成切换?”,更多的是关于如何将数据从一种活动传输到另一种活动的特定问题。意图和共享首选项是此应用程序最有可能的候选项。您可能需要考虑使用某种类型的弹出、菜单、操作栏、对话框等来翻转地图源。构建MapView很昂贵,防止重新初始化是个好主意。

编辑:这是我使用的代码。

警告1)您需要提前知道每个归档的Tile Source名称。Zip文件通常是映射源名,如OpenStreetMaps。如果你的瓷砖没有出现,这是最有可能的原因。

创建一个瓷砖源。为了简单起见,我选择将文件命名为精确映射文件源名。调整以满足你的需要。

代码语言:javascript
复制
public class FileBasedTileSource extends XYTileSource {

    public FileBasedTileSource(String aName, ResourceProxy.string aResourceId, int aZoomMinLevel, int aZoomMaxLevel, int aTileSizePixels, String aImageFilenameEnding, String[] aBaseUrl) {
        super(aName, aResourceId, aZoomMinLevel, aZoomMaxLevel, aTileSizePixels, aImageFilenameEnding, aBaseUrl);
    }

    public static ITileSource getSource(String name) {
        if (name.contains(".")) {
            name = name.substring(0, name.indexOf("."));
        }
        return new FileBasedTileSource(name,
            ResourceProxy.string.mapbox, 0, 18, 256, ".png", new String[]{
            "http://localhost"});
    }
}

然后你就可以用

代码语言:javascript
复制
ITileSource src=FileBasedTileSource.getSource("MyTileSource.gemf");

接下来,您将需要下面的类,我将为此创建一个拉请求。这是瓷砖供应商。

代码语言:javascript
复制
public class OfflineTileProvider extends MapTileProviderArray implements IMapTileProviderCallback {

    /**
     * Creates a {@link MapTileProviderBasic}.
     * throws with the source[] is null or empty
     */
    public OfflineTileProvider(final IRegisterReceiver pRegisterReceiver, File[] source
    )
        throws Exception {
        super(FileBasedTileSource.getSource(source[0].getName()), pRegisterReceiver);
        IArchiveFile[] f = new IArchiveFile[source.length];
        for (int i=0; i < source.length; i++)
            f[i]=ArchiveFileFactory.getArchiveFile(source[i]);

        mTileProviderList.add(new MapTileFileArchiveProvider(pRegisterReceiver, getTileSource(), f));

    }
}

然后按以下方式创建一个实例:

代码语言:javascript
复制
OfflineTileProvider provider = new OfflineTileProvider(new SimpleRegisterReceiver(mContext), myUserSelectedFiles[]));
mMapView.setTileProvider(provider);
mMapView.setUseDataConnection(false);
mMapView.invalidate();

它应该创建一个实例并更新地图视图。

补充说明: IO的例外情况是不可能的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31347019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档