2013-02-20 5 views
5

Ich bin neu zu OSM und OSMdroid.OsmDroid und MapQuest: Wie kann ich JPEG-Kacheln verwenden?

Ich folgte diesem ziemlich guten tutorial, um Offline-Karten anzuzeigen. Also im Grunde, was ich getan habe, ist:

  • ein Kachel-Paket im Zip-Format mit Handy Atlas Creator Erstellt
  • Gebrauchte MapQuest Quelle, JPEG-Format
  • die Zip in die richtigen Ordner Put: /mnt/sdcard/osmdroid/

Das Problem war, dass die Fliesen nicht gerendert wurden. Ich habe eine leere Seite.

Ich fand this solution, um mein Problem zu lösen.

Aber jetzt stört es mich, dass ich PNG-Dateien verwenden muss, die deutlich mehr Platz benötigen. Es ist nicht wirklich effizient für meine App, weil der Benutzer ein viel größeres Paket herunterladen muss.

MEINE FRAGE IST: Wie kann ich JPEG-Kacheln mit OSMDroid und MapQuest verwenden?

Vielen Dank im Voraus.

+0

Keine Antwort auf diese Frage? Ich habe das gleiche Problem. Alles funktioniert, aber ich muss png verwenden, was die Dateien viel größer macht. Möchten Sie JPEG-Dateien verwenden können. –

+0

Bitte beachten Sie jede Antwort unten. Sie können den Code sogar ändern, um mehr Format anzupassen –

Antwort

1

Ich habe eine Kachel Quelle, die Unterstützung jpg erstellt, können Sie einen Blick und passen Sie Ihre Fall, Bitte beachten Sie, dass getTileRelativeFilenameString nicht enthalten .title ext. Dieser Teil wird

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); 
    } 

} 
+0

Wenn dies für einige nicht funktioniert, überprüfen Sie, ob mName im MapTilerCustomDataSource() -Konstruktor den Namen des obersten Ordners in Ihrer ZIP-Datei übereinstimmt. –

0

Herunterladen 'xxx.JPG.tile' Dateien (MapTileFilesystemProvider) hinzugefügt werden, und benennen Sie sie zu 'xxx.PNG.tile'.

+0

Nur das Umbenennen der Dateien ändert nicht ihr Format. – vonbrand

+0

@vonbrand - Ich habe .jpg Kacheln heruntergeladen und konnte die Karten nicht sehen. Nach dem Umbenennen dieser Dateien in .png.tile, hat es angefangen zu arbeiten - so bleiben Kacheln wie gewünscht im JPEG-Format. – flamencoman

3

Dies funktioniert JPGs erhalten statt PNGs:

MapView myOpenMapView; 
myOpenMapView = (MapView) findViewById(R.id.openmapview); 
myOpenMapView.setTileSource(new XYTileSource("MapquestOSM", ResourceProxy.string.mapquest_osm, 0, 18, 256, ".jpg", new String[] { 
       "http://otile1.mqcdn.com/tiles/1.0.0/map/", "http://otile2.mqcdn.com/tiles/1.0.0/map/", "http://otile3.mqcdn.com/tiles/1.0.0/map/", 
       "http://otile4.mqcdn.com/tiles/1.0.0/map/" })); 

Hinweis ".jpg" in Zeile 3

Verwandte Themen