OsmDroid和MapQuest:我如何使用JPEG图块?

rav*_*r99 5 maps android offline osmdroid mapquest

我是OSMOSMdroid的新手.

我正在按照这个非常好的教程来显示离线地图.基本上我所做的是:

  • 使用Mobile Atlas Creator创建了zip格式的tile包
  • 使用MapQuest源,JPEG格式
  • 将zip放入右侧文件夹: /mnt/sdcard/osmdroid/

问题是瓷砖没有渲染.我有一个空白页面.

我找到了这个解决方案来解决我的问题.

但现在,我不得不使用PNG文件,这需要更多的空间.它对我的应用程序来说效率不高,因为用户必须下载更大的包.

我的问题是:如何在OSMDroid和MapQuest中使用JPEG图块?

提前致谢.

Tra*_*Anh 1

我创建了一个支持 jpg 的图块源,您可以查看并调整您的情况,请注意 getTileRelativeFilenameString 不会包含 .title ext。该部分将由 (MapTileFilesystemProvider) 添加

import java.io.File;
import java.io.InputStream;
import java.util.Random;

import org.osmdroid.ResourceProxy;
import org.osmdroid.ResourceProxy.string;
import org.osmdroid.tileprovider.MapTile;
import org.osmdroid.tileprovider.tilesource.BitmapTileSourceBase.LowMemoryException;
import org.osmdroid.tileprovider.tilesource.ITileSource;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;

public class MapTilerCustomDataSource implements ITileSource {

    private static int globalOrdinal = 0;

    private final int mMinimumZoomLevel;
    private final int mMaximumZoomLevel;

    private final int mOrdinal;
    protected final String mName;
    protected final String mImageFilenameEnding;
    protected final Random random = new Random();

    private final int mTileSizePixels;

    private final string mResourceId;

    public MapTilerCustomDataSource() {
        mResourceId = null;
        mOrdinal = globalOrdinal++;
        mName = "MapquestOSM";
        mMinimumZoomLevel = 0;
        mMaximumZoomLevel = 20;
        mTileSizePixels = 256;
        mImageFilenameEnding = ".jpg";

    }

    @Override
    public String getTileRelativeFilenameString(final MapTile tile) {
        final StringBuilder sb = new StringBuilder();
        sb.append(pathBase());
        sb.append('/');
        sb.append(tile.getZoomLevel());
        sb.append('/');
        sb.append(tile.getX());
        sb.append('/');
        sb.append(tile.getY());
        sb.append(imageFilenameEnding());
        return sb.toString();
    }

    @Override
    public Drawable getDrawable(String aFilePath) throws LowMemoryException {
        try {
            // default implementation will load the file as a bitmap and create
            // a BitmapDrawable from it
            final Bitmap bitmap = BitmapFactory.decodeFile(aFilePath);
            if (bitmap != null) {
                return new BitmapDrawable(bitmap);
            } else {
                // if we couldn't load it then it's invalid - delete it
                try {
                    new File(aFilePath).delete();
                } catch (final Throwable e) {
                }
            }
        } catch (final OutOfMemoryError e) {
            System.gc();
        }
        return null;

    }

    @Override
    public Drawable getDrawable(InputStream aFileInputStream) throws LowMemoryException {
        try {
            // default implementation will load the file as a bitmap and create
            // a BitmapDrawable from it
            final Bitmap bitmap = BitmapFactory.decodeStream(aFileInputStream);
            if (bitmap != null) {
                return new BitmapDrawable(bitmap);
            }
        } catch (final OutOfMemoryError e) {
            System.gc();
        }
        return null;

    }

    @Override
    public int ordinal() {
        return mOrdinal;
    }

    @Override
    public String name() {
        return mName;
    }

    public String pathBase() {
        return mName;
    }

    public String imageFilenameEnding() {
        return mImageFilenameEnding;
    }

    @Override
    public int getMinimumZoomLevel() {
        return mMinimumZoomLevel;
    }

    @Override
    public int getMaximumZoomLevel() {
        return mMaximumZoomLevel;
    }

    @Override
    public int getTileSizePixels() {
        return mTileSizePixels;
    }

    @Override
    public String localizedName(final ResourceProxy proxy) {
        return proxy.getString(mResourceId);
    }

}
Run Code Online (Sandbox Code Playgroud)