Offline reverse geocoding
This example does not contain a UI. Results will be logged in Android Studio. To run this example you will need access to our Offline Data API. Contact our team to request access.
Note
This example is a part of the Search SDK for Android sample app. You can find the values for all referenced resources in the res
directory. For example, see res/values/strings.xml
for R.string.*
references used in this example. The dependencies can be found here.The examples use View binding.See setup documention if necessary.
package com.mapbox.search.sample.api;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.mapbox.common.Cancelable;
import com.mapbox.common.TileRegionLoadOptions;
import com.mapbox.common.TileStore;
import com.mapbox.common.TilesetDescriptor;
import com.mapbox.geojson.Point;
import com.mapbox.search.common.AsyncOperationTask;
import com.mapbox.search.offline.OfflineIndexChangeEvent;
import com.mapbox.search.offline.OfflineIndexChangeEvent.EventType;
import com.mapbox.search.offline.OfflineIndexErrorEvent;
import com.mapbox.search.offline.OfflineResponseInfo;
import com.mapbox.search.offline.OfflineReverseGeoOptions;
import com.mapbox.search.offline.OfflineSearchCallback;
import com.mapbox.search.offline.OfflineSearchEngine;
import com.mapbox.search.offline.OfflineSearchEngineSettings;
import com.mapbox.search.offline.OfflineSearchOptions;
import com.mapbox.search.offline.OfflineSearchResult;
import com.mapbox.search.sample.BuildConfig;
import com.mapbox.search.sample.R;
import java.util.Collections;
import java.util.List;
public class OfflineReverseGeocodingJavaExampleActivity extends AppCompatActivity {
private OfflineSearchEngine searchEngine;
private Cancelable tilesLoadingTask;
@Nullable
private AsyncOperationTask searchRequestTask;
private final OfflineSearchEngine.EngineReadyCallback engineReadyCallback =
() -> Log.i("SearchApiExample", "Engine is ready");
private final OfflineSearchCallback searchCallback = new OfflineSearchCallback() {
@Override
public void onResults(@NonNull List<OfflineSearchResult> results, @NonNull OfflineResponseInfo responseInfo) {
Log.i("SearchApiExample", "Results: " + results);
}
@Override
public void onError(@NonNull Exception e) {
Log.i("SearchApiExample", "Search error: ", e);
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final TileStore tileStore = TileStore.create();
searchEngine = OfflineSearchEngine.create(
new OfflineSearchEngineSettings(getString(R.string.mapbox_access_token), tileStore)
);
searchEngine.addEngineReadyCallback(engineReadyCallback);
final List<TilesetDescriptor> descriptors = Collections.singletonList(OfflineSearchEngine.createTilesetDescriptor());
final String tileRegionId = "Washington DC";
final Point dcLocation = Point.fromLngLat(-77.0339911055176, 38.899920004207516);
final TileRegionLoadOptions tileRegionLoadOptions = new TileRegionLoadOptions.Builder()
.descriptors(descriptors)
.geometry(dcLocation)
.acceptExpired(true)
.build();
searchEngine.addOnIndexChangeListener(new OfflineSearchEngine.OnIndexChangeListener() {
@Override
public void onIndexChange(@NonNull OfflineIndexChangeEvent event) {
if (tileRegionId.equals(event.getRegionId()) && (event.getType() == EventType.ADD || event.getType() == EventType.UPDATE)) {
Log.i("SearchApiExample", tileRegionId + " was successfully added or updated");
searchRequestTask = searchEngine.reverseGeocoding(
new OfflineReverseGeoOptions(dcLocation),
searchCallback
);
}
}
@Override
public void onError(@NonNull OfflineIndexErrorEvent event) {
Log.i("SearchApiExample", "Offline index error: $event");
}
});
Log.i("SearchApiExample", "Loading tiles...");
tilesLoadingTask = tileStore.loadTileRegion(
tileRegionId,
tileRegionLoadOptions,
progress -> Log.i("SearchApiExample", "Loading progress: " + progress),
region -> {
if (region.isValue()) {
Log.i("SearchApiExample", "Tiles successfully loaded");
} else {
Log.i("SearchApiExample", "Tiles loading error: " + region.getError());
}
}
);
}
@Override
protected void onDestroy() {
searchEngine.removeEngineReadyCallback(engineReadyCallback);
tilesLoadingTask.cancel();
if (searchRequestTask != null) {
searchRequestTask.cancel();
}
super.onDestroy();
}
}
package com.mapbox.search.sample.api
import android.app.Activity
import android.os.Bundle
import android.util.Log
import com.mapbox.common.Cancelable
import com.mapbox.common.TileRegionLoadOptions
import com.mapbox.common.TileStore
import com.mapbox.geojson.Point
import com.mapbox.search.common.AsyncOperationTask
import com.mapbox.search.offline.OfflineIndexChangeEvent
import com.mapbox.search.offline.OfflineIndexChangeEvent.EventType
import com.mapbox.search.offline.OfflineIndexErrorEvent
import com.mapbox.search.offline.OfflineResponseInfo
import com.mapbox.search.offline.OfflineReverseGeoOptions
import com.mapbox.search.offline.OfflineSearchCallback
import com.mapbox.search.offline.OfflineSearchEngine
import com.mapbox.search.offline.OfflineSearchEngineSettings
import com.mapbox.search.offline.OfflineSearchResult
import com.mapbox.search.sample.R
class OfflineReverseGeocodingKotlinExampleActivity : Activity() {
private lateinit var searchEngine: OfflineSearchEngine
private lateinit var tilesLoadingTask: Cancelable
private var searchRequestTask: AsyncOperationTask? = null
private val engineReadyCallback = object : OfflineSearchEngine.EngineReadyCallback {
override fun onEngineReady() {
Log.i("SearchApiExample", "Engine is ready")
}
}
private val searchCallback = object : OfflineSearchCallback {
override fun onResults(results: List<OfflineSearchResult>, responseInfo: OfflineResponseInfo) {
Log.i("SearchApiExample", "Results: $results")
}
override fun onError(e: Exception) {
Log.i("SearchApiExample", "Search error", e)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val tileStore = TileStore.create()
searchEngine = OfflineSearchEngine.create(
OfflineSearchEngineSettings(
accessToken = getString(R.string.mapbox_access_token),
tileStore = tileStore
)
)
searchEngine.addEngineReadyCallback(engineReadyCallback)
val descriptors = listOf(OfflineSearchEngine.createTilesetDescriptor())
val tileRegionId = "Washington DC"
val dcLocation = Point.fromLngLat(-77.0339911055176, 38.899920004207516)
val tileRegionLoadOptions = TileRegionLoadOptions.Builder()
.descriptors(descriptors)
.geometry(dcLocation)
.acceptExpired(true)
.build()
searchEngine.addOnIndexChangeListener(object : OfflineSearchEngine.OnIndexChangeListener {
override fun onIndexChange(event: OfflineIndexChangeEvent) {
if (event.regionId == tileRegionId && (event.type == EventType.ADD || event.type == EventType.UPDATE)) {
Log.i("SearchApiExample", "$tileRegionId was successfully added or updated")
searchRequestTask = searchEngine.reverseGeocoding(
OfflineReverseGeoOptions(center = dcLocation),
searchCallback
)
}
}
override fun onError(event: OfflineIndexErrorEvent) {
Log.i("SearchApiExample", "Offline index error: $event")
}
})
Log.i("SearchApiExample", "Loading tiles...")
tilesLoadingTask = tileStore.loadTileRegion(
tileRegionId,
tileRegionLoadOptions,
{ progress -> Log.i("SearchApiExample", "Loading progress: $progress") },
{ result ->
if (result.isValue) {
Log.i("SearchApiExample", "Tiles successfully loaded: ${result.value}")
} else {
Log.i("SearchApiExample", "Tiles loading error: ${result.error}")
}
}
)
}
override fun onDestroy() {
searchEngine.removeEngineReadyCallback(engineReadyCallback)
tilesLoadingTask.cancel()
searchRequestTask?.cancel()
super.onDestroy()
}
}
Was this example helpful?