2015-07-22 4 views
2

У меня есть следующий код:OSM карты, пользовательский источник плитки не используется

public class MainActivity extends Activity { 
    MapView map; 
    XYTileSource customTileSource; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     map = (MapView) findViewById(R.id.mapView); 
     map.setMultiTouchControls(true); 
     map.setMapListener(new MyMapListener()); 
     ITileSource tileSource = TileSourceFactory.MAPNIK; 
     String tileUrl[] = {"https://bla_bla_bla__don't wanna show this here"}; 
     customTileSource = new MyXYTileSource("Point", null, 8, 18, 256, ".png", tileUrl); 
     map.setTileSource(customTileSource); 

     GeoPoint startPoint = new GeoPoint(47.021461, 28.86383); 
     IMapController mapController = map.getController(); 
     mapController.setCenter(startPoint); 
     mapController.setZoom(10); 

     MapEventsOverlay eventsOverlay = new MapEventsOverlay(this, new MyMapEventsListener()); 
     map.getOverlays().add(eventsOverlay); 

    } 

    private class MyMapListener implements MapListener { 

     @Override 
     public boolean onScroll(ScrollEvent event) { 
      return false; 
     } 

     @Override 
     public boolean onZoom(ZoomEvent event) { 
      Log.d("atf", "Zoom level is: " + event.getZoomLevel()); 
      return true; 
     } 
    } 

    private class MyMapEventsListener implements MapEventsReceiver { 

     @Override 
     public boolean singleTapConfirmedHelper(GeoPoint p) { 
      Log.d("atf", "Taped on long="+p.getLongitude()+" lat="+p.getLatitude()); 
      return true; 
     } 

     @Override 
     public boolean longPressHelper(GeoPoint p) { 
      return false; 
     } 
    } 

    private class MyXYTileSource extends XYTileSource { 

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

     @Override 
     public String getTileURLString(MapTile aTile) { 
      String tileUrl = super.getTileURLString(aTile); 
      Log.d("atf", "Tile url String: "+tileUrl); 
      return tileUrl; 
     } 
    } 
} 

Целью этого является использование пользовательских плитки для отображения карты. Это действительно работает нормально. За исключением случая, когда этот код работает на «Samsung Galaxy Ace 3». Возможно, есть другие устройства с одинаковой проблемой.

Для уровней масштабирования ниже 17, он не загружает пользовательские плитки. Он начинает загружать их, когда увеличение увеличивается выше 17.

Может кто-нибудь объяснить мне почему?

К сожалению, я забыл указать: Когда новые плитки не загружены, старые загружаются (из исходного источника плитки по умолчанию). Таким образом, карта не совсем пуста.

+0

Вы можете уточнить? Zoom> 17 загрузок или масштабирование <17 загрузок. Нечетко – spy

+0

Zoom> = 17 загрузок – nolanic

+0

Вы пытались увеличить количество источников плитки max до чего-то большего? попробуйте 19 или 20, чтобы увидеть, есть ли разница – spy

ответ

0

Решение было проще, чем я. Это просто из-за кешей. На устройстве, указанном в вопросе, у меня есть другое приложение, которое, похоже, использует ту же библиотеку «OSM Bonus Pack». Оба приложения, в которых используется один и тот же каталог из внешнего хранилища для кэширования фрагментов. Я просто удалил этот каталог (/ storage/emulated/0/osmdroid), и новые плитки начали загружаться из моего приложения.

Возможно, лучшим решением является указание другого каталога для моего приложения для кэширования плитки. Конечно, потребуется некоторое время, пока я не узнаю, как это сделать, но я не думаю, что это будет сложно.

0

Проверьте logcat для исключения, возможно, есть много OutOfMemoryError. Если это так, вам нужно точно настроить использование памяти приложения.

Смежные вопросы