Примеры
Создание виджета карты
Чтобы отобразить карту, для начала добавьте следующий Fragment в ваш layout-файл:
<fragment
android:name="ru.dublgis.dgismobile.mapsdk.MapFragment"
android:id="@+id/mapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
Затем инициализируйте виджет, вызвав метод setup()
и передав свой ключ API. Вы также можете передать начальные координаты и требуемый масштаб. Полный список возможных параметров приведён в описании API.
Например, приведённый ниже фрагмент кода показывает карту Москвы с Кремлём в центре карты и масштабом по умолчанию:
val mapFragment = supportFragmentManager.findFragmentById(R.id.mapFragment) as MapFragment
mapFragment.setup(
apiKey = "Your API key",
center = LonLat(37.6175, 55.7520),
zoom = 16.0
)
Для вызова какой-либо функции после инициализации карты, укажите её как callback:
mapFragment.mapReadyCallback = this::onDGisMapReady
Добавление маркера
Вы можете добавить на карту любое количество маркеров. Чаще всего это делается через callback-функцию карты:
private fun onDGisMapReady(map: DGisMap?) {
map?.let {
val marker = it.addMarker(MarkerOptions(
LonLat(37.6175, 55.7520)
)
}
}
...
mapFragment.mapReadyCallback = this::onDGisMapReady
Из параметров вам нужно задать только координаты маркера.
Кроме того, вы можете изменить внешний вид маркера. Вы можете задать иконку в SVG-формате, размер маркера в пикселях (ширина × высота), и якорь - координаты точки, к которой привязывается маркер (X × Y, относительно левого верхнего угла). Более подробную информацию о классе MarkerOptions смотрите в описании API.
private fun onDGisMapReady(map: DGisMap?) {
map?.let {
val marker = it.addMarker(MarkerOptions(
LonLat(37.6175, 55.7520),
icon = iconFromSvgAsset(assets, "pin.svg"),
size = 30.0 to 48.0,
anchor = 15.0 to 48.0)
)
}
}
Также вы можете добавить click listener для маркера, чтобы получать события клика/касания:
private fun onDGisMapReady(map: DGisMap?) {
map?.let {
val marker = it.addMarker(MarkerOptions(
LonLat(37.6175, 55.7520),
icon = iconFromSvgAsset(assets, "pin.svg"),
size = 30.0 to 48.0,
anchor = 15.0 to 48.0)
)
marker.setOnClickListener {
Toast.makeText(this, "Marker tap", Toast.LENGTH_LONG).show()
}
}
}
Обработка событий нажатия
Чтобы получать события нажатия на карту, вы можете добавить click listener для самой карты.
Для каждого объекта на карте можно получить координаты (event.lngLat
) и внутренний ID (event.target.id
). Затем вы сможете использовать ID объекта, чтобы выделить его на карте (подробнее в разделе Выделение объектов). Этот же ID можно использовать для получения полной информации об объекте через другие API, например, Places API, так как ID объектов одинаковы для всех API.
fun onDGisMapReady(map: Map?) {
map?.setOnClickListener { event : MapPointerEvent ->
val coordinates = "${event.lngLat.lat}° N, ${event.lngLat.lon}° E";
Toast.makeText(this, coordinates.toString(), Toast.LENGTH_LONG).show();
var objectId = event.target.id;
Toast.makeText(this, objectId.toString(), Toast.LENGTH_LONG).show();
}
}
Выделение объектов
Вы можете выделять на карте объекты: здания, дороги и т. д.
Для этого вызовите метод mapObjectsByIds(), передав ему список ID объектов, а затем вызовите метод setSelectedObjects() по результату mapObjectsByIds(). Вы можете получить нужные ID, добавив для карты click listener (смотрите раздел Обработка событий нажатия).
map?.setSelectedObjects(mapObjectsByIds("48231504731808815", "23520539192555249"))
Чтобы изменить список выделенных объектов, вызовите этот метод еще раз, передав в него новый список ID.
Чтобы убрать все выделения с карты, передайте пустой список методу setSelectedObjects().
map?.setSelectedObjects(listOf())