2013-02-20 9 views
5

Jestem nowy w OSM i OSMdroid.OsmDroid i MapQuest: Jak mogę używać płytek JPEG?

Podążałem za tym niezłym tutorial, aby wyświetlić mapy offline. Więc w zasadzie to, co zrobiłem to:

  • Utworzono pakiet płytki w formacie zip z Mobile Atlas Creator
  • wykorzystywanym źródłem MapQuest, format JPEG
  • Włóż suwak do prawego folderu: /mnt/sdcard/osmdroid/

Problem polegał na tym, że kafelki nie były renderowane. Mam pustą stronę.

Znalazłem this solution, aby rozwiązać mój problem.

Ale teraz niepokoi mnie to, że muszę używać plików PNG, które zajmują znacznie więcej miejsca. To nie jest naprawdę wydajne dla mojej aplikacji, ponieważ użytkownik będzie musiał pobrać znacznie większy pakiet.

MOJE PYTANIE JEST: Jak korzystać z kafelków JPEG z OSMDroid i MapQuest?

Z góry dziękuję.

+0

Brak odpowiedzi do tego? Mam ten sam problem. Mam wszystko działa, ale muszę użyć png, co powoduje, że pliki są znacznie większe. Chcesz móc korzystać z plików jpeg. –

+0

proszę zobaczyć każdą odpowiedź poniżej. Możesz nawet zmodyfikować kod, aby dostosować więcej formatu. –

Odpowiedz

1

Stworzyłem źródło płytek, które obsługuje jpg, możesz rzucić okiem i dostosować swoją skrzynkę, Należy pamiętać, że getTileRelativeFilenameString nie będzie zawierać .title ext. Ta część zostanie dodana przez (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); 
    } 

} 
+0

Jeśli to nie działa, sprawdź, czy mName w konstruktorze MapTilerCustomDataSource() pasuje do nazwy najwyższego folderu w twoim pliku zip. –

0

pobierać pliki 'xxx.JPG.tile' i zmień je na 'xxx.PNG.tile'.

+0

Po prostu zmiana nazwy plików nie zmieni ich formatu. – vonbrand

+0

@vonbrand - pobrałem już płytki .jpg i nie widziałem map. Po zmianie nazwy tych plików na .png.tile, zaczęło działać - więc płytki "pozostały" w formacie JPEG zgodnie z żądaniem. – flamencoman

3

Działa to dostać JPG zamiast PNG:

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

Notice ".jpg" w wierszu 3.

Powiązane problemy