2014-02-20 3 views
4

У меня есть рабочий IOS прототип с использованием техники мозаичного кэширования IOS, как показано ниже (код Objective-C):кэширование плитки на форуме с помощью MapBox Android SDK

RMTileCache * tileCache = [[RMTileCache alloc] initWithExpiryPeriod:0]; 
[tileCache setBackgroundCacheDelegate:self]; 
RMMapboxSource * tileSource = [[RMMapboxSource alloc] initWithMapID:mapID]; 
[tileCache beginBackgroundCacheForTileSource:tileSource southWest:southWest northEast:northEasth minZoom:minZoom maxZoom:maxZoom]; 

что это в основном делает это загрузить карту, кэш плитки навсегда и позволяют приложению работать автономно в будущем. Поскольку мы проходим через официальный платный API, это, конечно, не нарушает никаких юридических ограничений.

Теперь я хотел бы добиться того же на Android. У меня есть SDK работает в Android Studio и рабочий проект с удаленной картой с помощью ID карты, в основном это (Android Eclipse, расположение XML):

<com.mapbox.mapboxsdk.views.MapView 
    android:id="@+id/mapview" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    mapid=“my_map_id" /> 

Это прекрасно работает, но решение должно быть полностью в автономном режиме один раз кеширование выполнено. Мой вопрос: есть ли Java-эквивалент исходного кода iOS выше в MapBox SDK? Я попытался посмотреть в API, но не смог найти надежную ссылку на систему кэширования плит. И после некоторого болезненного времени, пытаясь заставить его работать на основе имен методов и документации кода, я сдался.

Я использую последнее дистрибутив MapBox от GitHub вместе с последней версией Android Studio, все работает и работает нормально, но не удается найти код для этого. Мне не обязательно нужна ссылка на API, несколько строк кода, показывающих, как это будет сделано, будет достаточно.

ответ

9

Поддержка автономного Tile Кэширование теперь доступен в MapBox Android SDK в версии 0.5.1. Он был выпущен 20 декабря 2014 года. Вот простой пример того, как приступить к работе:

OfflineMapDownloader offlineMapDownloader = OfflineMapDownloader.getOfflineMapDownloader(getActivity()); 
BoundingBox boundingBox = mapView.getBoundingBox(); 
CoordinateSpan span = new CoordinateSpan(boundingBox.getLatitudeSpan(), boundingBox.getLongitudeSpan()); 
CoordinateRegion coordinateRegion = new CoordinateRegion(mapView.getCenter(), span); 
offlineMapDownloader.beginDownloadingMapID("MapboxMapID", coordinateRegion, (int) mapView.getZoomLevel(), (int) mapView.getZoomLevel()); 

Чтобы загрузить ранее сохраненную карту:

ArrayList<OfflineMapDatabase> offlineMapDatabases = offlineMapDownloader.getMutableOfflineMapDatabases(); 
OfflineMapDatabase db = offlineMapDatabases.get(0); 
OfflineMapTileProvider tp = new OfflineMapTileProvider(getActivity(), db); 
offlineMapOverlay = new TilesOverlay(tp); 
mapView.addOverlay(offlineMapOverlay); 
+0

Как использовать это с MapView? Проверяет ли он автономную версию автоматически? Или вам нужно указать в mapview, что вы хотите использовать автономную версию. – Aegis

+0

Я только что обновил ответ с инструкциями о том, как его загрузить. Надеюсь это поможет! –

+0

Я уже понял это из источника :) однако у меня есть небольшая проблема с загрузкой карты. Я думаю, что есть ошибка в SDK при преобразовании чисел lat/lng. Я опубликовал вопрос о github [isssue # 607] (https://github.com/mapbox/mapbox-android-sdk/issues/607) – Aegis

2

Я задал этот вопрос в службу поддержки, вот ответ:

«Мы в настоящее время не имеют дату выхода Android SDK или для этой функции, так как находятся в очень ранних стадиях развития.

- Том MacWright [email protected]»

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

+0

Да, я только что получил тот же ответ. Я с вами, MapBox отлично смотрится на iOS, и то, что доступно на Droid, выглядит так же многообещающе. К сожалению, мы не можем забрать его без этой части. – Yasper

+0

все еще не поддерживается? –

+0

Кто-нибудь имеет представление о ходе поддержки этой функции? –

0

В файле макета должны быть:

<com.mapbox.mapboxsdk.views.MapView 
     android:id="@+id/yourMapViewId" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 

В коде, где вы хотите инициализировать MapView:

File file = new File("your full path to tiles db"); 
MBTilesLayer mbTilesLayer = new MBTilesLayer(file); 
MapView mapView = (MapView) findViewById(R.id.yourMapViewId); 
mapView.setTileSource(mbTilesLayer);