78 lines
2.5 KiB
Kotlin
Raw Normal View History

2022-07-23 10:58:16 +03:00
package center.sciprog.maps.compose
2022-07-11 09:36:43 +03:00
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
2022-07-11 09:36:43 +03:00
import androidx.compose.ui.Modifier
2022-12-23 22:16:16 +03:00
import center.sciprog.maps.coordinates.Gmc
2022-12-28 19:49:09 +03:00
import center.sciprog.maps.features.FeatureCollection
import center.sciprog.maps.features.FeatureId
import center.sciprog.maps.features.Rectangle
import center.sciprog.maps.features.ViewConfig
2022-07-11 09:36:43 +03:00
2022-07-13 11:36:02 +03:00
2022-07-11 09:36:43 +03:00
@Composable
2022-07-23 13:49:47 +03:00
public expect fun MapView(
mapState: MapViewScope,
2022-12-26 17:44:01 +03:00
featuresState: FeatureCollection<Gmc>,
modifier: Modifier = Modifier.fillMaxSize(),
)
/**
* A builder for a Map with static features.
*/
@Composable
public fun MapView(
mapTileProvider: MapTileProvider,
initialViewPoint: MapViewPoint? = null,
initialRectangle: Rectangle<Gmc>? = null,
2022-12-09 22:21:24 +03:00
featureMap: Map<FeatureId<*>, MapFeature>,
2022-12-24 22:59:33 +03:00
config: ViewConfig<Gmc> = ViewConfig(),
modifier: Modifier = Modifier.fillMaxSize(),
) {
val featuresState = remember(featureMap) {
FeatureCollection.build(WebMercatorSpace) {
2022-12-09 22:21:24 +03:00
featureMap.forEach { feature(it.key.id, it.value) }
}
}
val mapState: MapViewScope = rememberMapState(
mapTileProvider,
config,
featuresState.features.values,
initialViewPoint = initialViewPoint,
initialRectangle = initialRectangle,
)
MapView(mapState, featuresState, modifier)
}
/**
* Draw a map using convenient parameters. If neither [initialViewPoint], noe [initialRectangle] is defined,
* use map features to infer view region.
* @param initialViewPoint The view point of the map using center and zoom. Is used if provided
* @param initialRectangle The rectangle to be used for view point computation. Used if [initialViewPoint] is not defined.
* @param buildFeatures - a builder for features
*/
@Composable
2022-07-23 13:49:47 +03:00
public fun MapView(
2022-07-14 20:19:57 +03:00
mapTileProvider: MapTileProvider,
initialViewPoint: MapViewPoint? = null,
initialRectangle: Rectangle<Gmc>? = null,
2022-12-24 22:59:33 +03:00
config: ViewConfig<Gmc> = ViewConfig(),
2022-07-14 20:19:57 +03:00
modifier: Modifier = Modifier.fillMaxSize(),
2022-12-26 17:44:01 +03:00
buildFeatures: FeatureCollection<Gmc>.() -> Unit = {},
) {
val featureState = FeatureCollection.remember(WebMercatorSpace, buildFeatures)
val mapState: MapViewScope = rememberMapState(
mapTileProvider,
config,
featureState.features.values,
initialViewPoint = initialViewPoint,
initialRectangle = initialRectangle,
)
MapView(mapState, featureState, modifier)
}