Как получить маркер из базы данных номеров на основе видимого региона в Картах GoogleAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как получить маркер из базы данных номеров на основе видимого региона в Картах Google

Сообщение 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

}


Подробнее здесь: https://stackoverflow.com/questions/790 ... oogle-maps
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»