### Select your user interface
There are two UI components available to render maps on an Android app, the `MapLibreView` and the `AmplifyMapView`. The `MapLibreView` is an extension of the standard [Android MapLibre MapView](https://docs.maptiler.com/maplibre-gl-native-android/android-basic-get-started/) that is integrated with the `Amplify.Geo` APIs, while the `AmplifyMapView` is a wrapper with built-in location search, map controls, markers and a few standard UX interactions.
#### `MapLibreView` vs `AmplifyMapView`
If the goal is to customize the UI, the `MapLibreView` provides a plain map that allows you to build and integrate your own controls and flow. If the goal is to use the map to search and select places, with a standard UI, then `AmplifyMapView` is a good choice.
Note that even though the extensibility of `AmplifyMapView` is limited, you have access to the wrapped `MapLibreView` through the `mapView` property (`getMapView()` on Java). So any API available to `MapLibreView` is also available on `AmplifyMapView`.
## MapLibreView
The `MapLibreView` is an extension of the standard `MapView` provided by the MapLibre library. The implementation adds the `Amplify.Geo` integration behind the scenes to enable developers to focus on their UI instead of the library integration. That also means all MapLibre APIs are available and will work as expected. Check the [official MapLibre SDK for Android documentation](https://docs.maptiler.com/maplibre-gl-native-android/android-basic-get-started/) for the API reference and guides.
### Add a map to your app
1. Navigate to your app's `src/main/res/layout` directory in Android Studio
2. Create a new layout named `activity_main.xml`, or use an existing layout of your choice, and add the following:
```xml
```
### Initialize the MapLibreView
1. Navigate to your app's activity (e.g. `MainActivity`)
2. Add an import statement for MapLibreView at the top of your app's activity:
```java
import com.amplifyframework.geo.maplibre.view.MapLibreView;
```
```kotlin
import com.amplifyframework.geo.maplibre.view.MapLibreView
```
3. Declare the view instance variable at top-level of the activity:
```java
private MapLibreView mapView;
```
```kotlin
private val mapView by lazy {
findViewById(R.id.mapView)
}
```
4. Interact with the map in the Activity's `onCreate`:
```java
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Note: make sure you configure Amplify before calling setContentView
// See the Getting Started instructions
setContentView(R.layout.activity_main);
mapView = findViewById(R.id.mapView);
// now you can interact with the mapView, see examples below
}
```
```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Note: make sure you configure Amplify before calling setContentView
// See the Getting Started instructions
setContentView(R.layout.activity_main)
// now you can interact with the mapView, see examples below
}
```
### Interact with the map
The map needs to be loaded in order to interact with it. You can use either `getMapAsync` that is called when the map is ready or `getStyle` that is called when both the map and its style are ready. Some APIs, like the `SymbolManager`, require the style to also be loaded so you can draw markers and other symbols on the map, that's when `getStyle` comes in handy.
### Update the map center
```java
import com.mapbox.mapboxsdk.camera.CameraPosition;
import com.mapbox.mapboxsdk.geometry.LatLng;
```
```java
mapView.getMapAsync(map -> {
LatLng seattle = new LatLng(47.6160281982247, -122.32642111977668);
map.setCameraPosition(
new CameraPosition.Builder()
.target(seattle)
.zoom(13.0)
.build()
);
});
```
```kotlin
import com.mapbox.mapboxsdk.camera.CameraPosition
import com.mapbox.mapboxsdk.geometry.LatLng
```
```kotlin
mapView.getMapAsync { map ->
val seattle = LatLng(47.6160281982247, -122.32642111977668)
map.cameraPosition = CameraPosition.Builder()
.target(seattle)
.zoom(13.0)
.build()
}
```
Updating `cameraPosition` moves the camera to the passed coordinates without any animation. If animation is needed, use `map.animateCamera()` instead. See the [official reference](https://docs.maptiler.com/maplibre-gl-native-android/com.mapbox.mapboxsdk.camera/) for more details.
### Add markers to your map
The MapLibre SDK for Android relies on the [MapLibre Annotation Plugin](https://docs.maptiler.com/maplibre-gl-native-android/android-annotation/) in order to display markers on a map.
```java
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory;
import com.mapbox.mapboxsdk.plugins.annotation.SymbolOptions;
```
```java
mapView.getStyle((map, style) -> {
LatLng spaceNeedle = new LatLng(47.6205063, -122.3514661);
mapView.symbolManager.create(
new SymbolOptions()
.withIconImage("place")
.withLatLng(spaceNeedle)
);
map.animateCamera(CameraUpdateFactory.newLatLngZoom(spaceNeedle, 16.0));
});
```
```kotlin
import com.mapbox.mapboxsdk.camera.CameraUpdateFactory
import com.mapbox.mapboxsdk.plugins.annotation.SymbolOptions
```
```kotlin
mapView.getStyle { map, style ->
val spaceNeedle = LatLng(47.6205063, -122.3514661)
mapView.symbolManager.create(
SymbolOptions()
.withIconImage("place")
.withLatLng(spaceNeedle)
)
map.animateCamera(CameraUpdateFactory.newLatLngZoom(spaceNeedle, 16.0))
}
```
**Notes:**
- The `mapView.symbolManager` is a built-in reference of `SymbolManager` from the [MapLibre Annotation Plugin](https://docs.maptiler.com/maplibre-gl-native-android/android-annotation/) with some standard configuration.
- If customized icons or render other types of shapes and layers are needed, an instance of `SymbolManager` can be created and used to manage the different types of custom use-cases.
### MapLibreView configuration parameters
The `MapLibreView` has several configuration parameters that are not present in the official guides yet. For a complete list, refer to the [source xml file](https://github.com/maplibre/maplibre-gl-native/blob/main/platform/android/MapboxGLAndroidSDK/src/main/res/values/attrs.xml).
Also, check the [official MapView API reference](https://docs.maptiler.com/maplibre-gl-native-android/com.mapbox.mapboxsdk.maps/#mapview) for the available public API documentation.
## AmplifyMapView
The `AmplifyMapView` provides a default search field, place markers, visualization modes (map or list) and map controls. It can be used to easily embed a place picker into any app. To use the search functionality of `AmplifyMapView`, provision a search index resource using the instructions in either [Amplify CLI - Geo - Location Search](/cli/geo/search) or [Use existing Amazon Location Service resources](/lib/geo/existing-resources).
### Add a map to your app
1. Navigate to your app's `src/main/res/layout` directory in Android Studio
2. Create a new layout named `activity_main.xml`, or use an existing layout of your choice, and add the following:
```xml
```
### Initialize the AmplifyMapView
1. Navigate to your app's activity (e.g. `MainActivity`)
2. Add an import statement for AmplifyMapView at the top of your app's activity:
```java
import com.amplifyframework.geo.maplibre.view.AmplifyMapView;
```
```kotlin
import com.amplifyframework.geo.maplibre.view.AmplifyMapView
```
3. Declare the view instance variable at top-level of the activity:
```java
private AmplifyMapView amplifyMapView;
```
```kotlin
private val amplifyMapView by lazy {
findViewById(R.id.mapView)
}
```
4. Interact with the map in the Activity's `onCreate`:
```java
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Note: make sure you configure Amplify before calling setContentView
// See the Getting Started instructions
setContentView(R.layout.activity_main);
amplifyMapView = findViewById(R.id.mapView);
// now you can interact with the mapView, see examples below
}
```
```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Note: make sure you configure Amplify before calling setContentView
// See the Getting Started instructions
setContentView(R.layout.activity_main)
// now you can interact with the mapView, see examples below
}
```
### Place select
The main API provided by `AmplifyMapView` is an event listener that is called when a place is selected on the map, either by clicking on the mark or the item on the list.
```java
import android.util.Log;
```
```java
amplifyMapView.setOnPlaceSelectListener((place, symbol) -> {
// place is an instance of AmazonLocationPlace
// symbol is an instance of Symbol from MapLibre
Log.i("MyAmplifyApp", "The selected place is " + place.getLabel());
Log.i("MyAmplifyApp", "It is located at " + place.getCoordinates());
});
```
```kotlin
import android.util.Log
```
```kotlin
amplifyMapView.onPlaceSelect { place, symbol ->
// place is an instance of AmazonLocationPlace
// symbol is an instance of Symbol from MapLibre
Log.i("MyAmplifyApp", "The selected place is ${place.label}")
Log.i("MyAmplifyApp", "It is located at ${place.coordinates}")
}
```
### AmplifyMapView configuration parameters
The view can be initialized with the following configuration parameters:
| Property | Type | Description | Default |
|--------------------------------|---------|------------------------------------------------------|---------|
| `map:map_centerLatitude` | Float | The initial center latitude | `0.0` |
| `map:map_centerLongitude` | Float | The initial center longitude | `0.0` |
| `map:map_minZoomLevel` | Integer | The minimum zoom level (min is 0) | `3` |
| `map:map_maxZoomLevel` | Integer | The maximum zoom level (max is 22) | `18` |
| `map:map_showCompassIndicator` | Boolean | Whether the compass should be displayed or not | `true` |
| `map:map_showZoomControls` | Boolean | Whether the zoom controls should be displayed or not | `false` |
| `map:map_zoomLevel` | Integer | The initial zoom level (between 0 and 22) | `14` |
Example:
```xml
```