Я использую Карты Google в своем приложении для Android и показываю маркеры, которые находятся в видимых областях на картах.
Это правильный подход к получению маркеров из базы данных номеров?< /p>
Я мог бы использовать пейджинг, чтобы быстрее получать данные.
Когда пользователь переходит к MapScreen, пользовательский интерфейс подтормаживает. Для отображения всех маркеров и загрузки карты требуется некоторое время
@Composable
fun MapScreen(viewModel: MapViewModel = viewModel()) {
val scope = rememberCoroutineScope()
val context = LocalContext.current
var mapProperties by remember { mutableStateOf(MapProperties(mapType = MapType.NORMAL)) }
var mapUiSettings by remember { mutableStateOf(MapUiSettings(zoomControlsEnabled = false)) }
var mapVisible by remember { mutableStateOf(false) }
val markerList by viewModel.markers.collectAsState()
GoogleMap(
modifier = Modifier.fillMaxSize(),
properties = mapProperties,
uiSettings = mapUiSettings,
onMapLoaded = {
mapVisible = true
}
) {
markerList.forEach { marker ->
Marker(
state = MarkerState(position = LatLng(marker.latitude, marker.longitude)),
title = marker.title,
snippet = marker.snippet
)
}
}
LaunchedEffect(cameraPositionState.position) {
visibleRegion.value = cameraPositionState.projection?.visibleRegion?.latLngBounds
mapViewModel.fetchMapTrains(visibleRegion.value, zoomLevel = zoomLevel, isFavorite = isFav)
}
}
// ViewModel
class MapViewModel @Inject constructor(private val repository: MapRepository) : ViewModel() {
private val _visibleRegion = MutableStateFlow(null)
private val visibleRegion: StateFlow = _visibleRegion.asStateFlow()
val markers: StateFlow = visibleRegion
.flatMapLatest { region ->
if (region == null) {
flowOf(emptyList())
} else {
repository.getMarkersInRegion(
region.southwest.latitude,
region.southwest.longitude,
region.northeast.latitude,
region.northeast.longitude
)
}
}
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
fun updateVisibleRegion(bounds: LatLngBounds) {
_visibleRegion.value = bounds
}
}
// Repository
class MapRepository @Inject constructor(private val markerDao: MarkerDao) {
fun getMarkersInRegion(
minLat: Double,
minLng: Double,
maxLat: Double,
maxLng: Double
): Flow {
return markerDao.getMarkersInRegion(minLat, minLng, maxLat, maxLng)
}
suspend fun insertMarker(marker: MarkerEntity) {
markerDao.insertMarker(marker)
}
}
// DAO
@Dao
interface MarkerDao {
@Query("""
SELECT * FROM markers
WHERE latitude BETWEEN :minLat AND :maxLat
AND longitude BETWEEN :minLng AND :maxLng
""")
fun getMarkersInRegion(
minLat: Double,
minLng: Double,
maxLat: Double,
maxLng: Double
): Flow
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... oogle-maps
Как получить маркер из базы данных номеров на основе видимого региона в Картах Google ⇐ Android
Форум для тех, кто программирует под Android
1727237366
Anonymous
Я использую Карты Google в своем приложении для Android и показываю маркеры, которые находятся в видимых областях на картах.
Это правильный подход к получению маркеров из базы данных номеров?< /p>
Я мог бы использовать пейджинг, чтобы быстрее получать данные.
Когда пользователь переходит к MapScreen, пользовательский интерфейс подтормаживает. Для отображения всех маркеров и загрузки карты требуется некоторое время
@Composable
fun MapScreen(viewModel: MapViewModel = viewModel()) {
val scope = rememberCoroutineScope()
val context = LocalContext.current
var mapProperties by remember { mutableStateOf(MapProperties(mapType = MapType.NORMAL)) }
var mapUiSettings by remember { mutableStateOf(MapUiSettings(zoomControlsEnabled = false)) }
var mapVisible by remember { mutableStateOf(false) }
val markerList by viewModel.markers.collectAsState()
GoogleMap(
modifier = Modifier.fillMaxSize(),
properties = mapProperties,
uiSettings = mapUiSettings,
onMapLoaded = {
mapVisible = true
}
) {
markerList.forEach { marker ->
Marker(
state = MarkerState(position = LatLng(marker.latitude, marker.longitude)),
title = marker.title,
snippet = marker.snippet
)
}
}
LaunchedEffect(cameraPositionState.position) {
visibleRegion.value = cameraPositionState.projection?.visibleRegion?.latLngBounds
mapViewModel.fetchMapTrains(visibleRegion.value, zoomLevel = zoomLevel, isFavorite = isFav)
}
}
// ViewModel
class MapViewModel @Inject constructor(private val repository: MapRepository) : ViewModel() {
private val _visibleRegion = MutableStateFlow(null)
private val visibleRegion: StateFlow = _visibleRegion.asStateFlow()
val markers: StateFlow = visibleRegion
.flatMapLatest { region ->
if (region == null) {
flowOf(emptyList())
} else {
repository.getMarkersInRegion(
region.southwest.latitude,
region.southwest.longitude,
region.northeast.latitude,
region.northeast.longitude
)
}
}
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())
fun updateVisibleRegion(bounds: LatLngBounds) {
_visibleRegion.value = bounds
}
}
// Repository
class MapRepository @Inject constructor(private val markerDao: MarkerDao) {
fun getMarkersInRegion(
minLat: Double,
minLng: Double,
maxLat: Double,
maxLng: Double
): Flow {
return markerDao.getMarkersInRegion(minLat, minLng, maxLat, maxLng)
}
suspend fun insertMarker(marker: MarkerEntity) {
markerDao.insertMarker(marker)
}
}
// DAO
@Dao
interface MarkerDao {
@Query("""
SELECT * FROM markers
WHERE latitude BETWEEN :minLat AND :maxLat
AND longitude BETWEEN :minLng AND :maxLng
""")
fun getMarkersInRegion(
minLat: Double,
minLng: Double,
maxLat: Double,
maxLng: Double
): Flow
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79021084/how-to-fetch-marker-from-room-database-based-on-visible-region-in-google-maps[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия