Google Maps / Mapbox / MapLibre / HERE: 上向きピッチを直接表現できないため、カメラ位置を固定し、bearing 方向の前方へターゲットを移動してシミュレーションします。ネイティブの仰角ビューと完全に同一にはなりません。
+
diff --git a/docs/src/components/core/marker-icons/DefaultIconSignature.astro b/docs/src/components/core/marker-icons/ColorDefaultIconSignature.astro
similarity index 100%
rename from docs/src/components/core/marker-icons/DefaultIconSignature.astro
rename to docs/src/components/core/marker-icons/ColorDefaultIconSignature.astro
diff --git a/docs/src/components/core/marker-icons/DefaultIconUsageExamples.astro b/docs/src/components/core/marker-icons/ColorDefaultIconUsageExamples.astro
similarity index 94%
rename from docs/src/components/core/marker-icons/DefaultIconUsageExamples.astro
rename to docs/src/components/core/marker-icons/ColorDefaultIconUsageExamples.astro
index d804f170..9b8f09a8 100644
--- a/docs/src/components/core/marker-icons/DefaultIconUsageExamples.astro
+++ b/docs/src/components/core/marker-icons/ColorDefaultIconUsageExamples.astro
@@ -20,7 +20,7 @@ MapView(state = mapViewState) {
// Custom colored marker with label
Marker(
position = GeoPoint.fromLatLong(37.7849, -122.4094),
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
scale = 1.2f,
label = "SF",
fillColor = Color.Blue,
@@ -32,7 +32,7 @@ MapView(state = mapViewState) {
// Small marker with custom styling
Marker(
position = GeoPoint.fromLatLong(37.7649, -122.4294),
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
scale = 0.8f,
fillColor = Color.Green,
labelTextColor = Color.Black,
diff --git a/docs/src/components/core/marker-icons/DebugImageIconExample.astro b/docs/src/components/core/marker-icons/DebugImageIconExample.astro
index 65ce627e..e8613ba9 100644
--- a/docs/src/components/core/marker-icons/DebugImageIconExample.astro
+++ b/docs/src/components/core/marker-icons/DebugImageIconExample.astro
@@ -3,7 +3,7 @@ import { Code } from '@astrojs/starlight/components';
const code = `Marker(
position = position,
- icon = ImageDefaultIcon(
+ icon = ImageColorDefaultIcon(
drawable = customDrawable,
anchor = Offset(0.5f, 1.0f),
debug = true // Shows anchor point and bounds
diff --git a/docs/src/components/core/marker-icons/DynamicIconExample.astro b/docs/src/components/core/marker-icons/DynamicIconExample.astro
index d8f396b6..106cee64 100644
--- a/docs/src/components/core/marker-icons/DynamicIconExample.astro
+++ b/docs/src/components/core/marker-icons/DynamicIconExample.astro
@@ -17,7 +17,7 @@ fun DynamicIconExample() {
// ${commentForMapViewUsage}
MapView(state = mapViewState) {
val icon = when (iconType) {
- "default" -> DefaultIcon(
+ "default" -> ColorDefaultIcon(
fillColor = Color.Blue,
label = "D"
)
@@ -25,12 +25,12 @@ fun DynamicIconExample() {
DrawableDefaultIcon(backgroundDrawable = it)
}
"image" -> AppCompatResources.getDrawable(context, R.drawable.location_icon)?.let {
- ImageDefaultIcon(
+ ImageColorDefaultIcon(
drawable = it,
anchor = Offset(0.5f, 1.0f)
)
}
- else -> DefaultIcon()
+ else -> ColorDefaultIcon()
}
Marker(
diff --git a/docs/src/components/core/marker-icons/ImageDefaultIconSignature.astro b/docs/src/components/core/marker-icons/ImageDefaultIconSignature.astro
index fd1b4abf..2cd91701 100644
--- a/docs/src/components/core/marker-icons/ImageDefaultIconSignature.astro
+++ b/docs/src/components/core/marker-icons/ImageDefaultIconSignature.astro
@@ -1,7 +1,7 @@
---
import { Code } from '@astrojs/starlight/components';
-const code = `ImageDefaultIcon(
+const code = `ImageColorDefaultIcon(
drawable: Drawable,
anchor: Offset = Offset(0.5f, 0.5f),
debug: Boolean = false
diff --git a/docs/src/components/core/marker-icons/ImageIconExamples.astro b/docs/src/components/core/marker-icons/ImageIconExamples.astro
index a2a91db2..25977044 100644
--- a/docs/src/components/core/marker-icons/ImageIconExamples.astro
+++ b/docs/src/components/core/marker-icons/ImageIconExamples.astro
@@ -23,7 +23,7 @@ fun ImageIconExamples() {
AppCompatResources.getDrawable(context, R.drawable.weather_station)?.let { icon ->
Marker(
position = GeoPoint.fromLatLong(37.7749, -122.4194),
- icon = ImageDefaultIcon(
+ icon = ImageColorDefaultIcon(
drawable = icon,
anchor = Offset(0.5f, 1.0f), // Bottom center
debug = false
@@ -35,7 +35,7 @@ fun ImageIconExamples() {
AppCompatResources.getDrawable(context, R.drawable.direction_arrow)?.let { icon ->
Marker(
position = GeoPoint.fromLatLong(37.7849, -122.4094),
- icon = ImageDefaultIcon(
+ icon = ImageColorDefaultIcon(
drawable = icon,
anchor = Offset(0.5f, 0.5f), // Center
debug = true // Shows anchor point
diff --git a/docs/src/components/core/marker-icons/MarkerIconFactoryExample.astro b/docs/src/components/core/marker-icons/MarkerIconFactoryExample.astro
index 2c33b942..eb337dc8 100644
--- a/docs/src/components/core/marker-icons/MarkerIconFactoryExample.astro
+++ b/docs/src/components/core/marker-icons/MarkerIconFactoryExample.astro
@@ -27,7 +27,7 @@ const code = `object MarkerIconFactory {
val rotatedDrawable = drawable.mutate()
rotatedDrawable.setColorFilter(null)
- ImageDefaultIcon(
+ ImageColorDefaultIcon(
drawable = rotatedDrawable,
anchor = Offset(0.5f, 0.5f)
)
diff --git a/docs/src/components/core/spherical-utilities/GeofenceExample.astro b/docs/src/components/core/spherical-utilities/GeofenceExample.astro
index dedf2650..c5e50d9f 100644
--- a/docs/src/components/core/spherical-utilities/GeofenceExample.astro
+++ b/docs/src/components/core/spherical-utilities/GeofenceExample.astro
@@ -45,7 +45,7 @@ fun GeofenceExample() {
userLocation?.let { location ->
Marker(
position = location,
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
fillColor = if (insideGeofence) Color.Green else Color.Red,
label = if (insideGeofence) "${labelInside}" else "${labelOutside}"
)
diff --git a/docs/src/components/core/spherical-utilities/InterpolateExample.astro b/docs/src/components/core/spherical-utilities/InterpolateExample.astro
index 0b5eba47..e3d641c6 100644
--- a/docs/src/components/core/spherical-utilities/InterpolateExample.astro
+++ b/docs/src/components/core/spherical-utilities/InterpolateExample.astro
@@ -45,7 +45,7 @@ fun AnimatedRoute() {
if (currentWaypoint < waypoints.size) {
Marker(
position = waypoints[currentWaypoint],
- icon = DefaultIcon(fillColor = Color.Red)
+ icon = ColorDefaultIcon(fillColor = Color.Red)
)
}
}
diff --git a/docs/src/components/core/spherical-utilities/ProximityAlertExample.astro b/docs/src/components/core/spherical-utilities/ProximityAlertExample.astro
index 1c087ca5..81f91165 100644
--- a/docs/src/components/core/spherical-utilities/ProximityAlertExample.astro
+++ b/docs/src/components/core/spherical-utilities/ProximityAlertExample.astro
@@ -36,7 +36,7 @@ fun ProximityAlert() {
// Target location
Marker(
position = targetLocation,
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
fillColor = if (isNearTarget) Color.Green else Color.Red,
label = "Target"
)
@@ -54,7 +54,7 @@ fun ProximityAlert() {
userLocation?.let { location ->
Marker(
position = location,
- icon = DefaultIcon(fillColor = Color.Blue, label = "You")
+ icon = ColorDefaultIcon(fillColor = Color.Blue, label = "You")
)
}
}
diff --git a/docs/src/components/core/spherical-utilities/RouteProgressExample.astro b/docs/src/components/core/spherical-utilities/RouteProgressExample.astro
index 3173223c..e1a64d05 100644
--- a/docs/src/components/core/spherical-utilities/RouteProgressExample.astro
+++ b/docs/src/components/core/spherical-utilities/RouteProgressExample.astro
@@ -76,7 +76,7 @@ fun RouteProgress() {
// Current position
Marker(
position = currentPosition,
- icon = DefaultIcon(fillColor = Color.Red, label = "Current")
+ icon = ColorDefaultIcon(fillColor = Color.Red, label = "Current")
)
}
}
diff --git a/docs/src/components/core/zoom-levels/ContextAwareZoomExample.astro b/docs/src/components/core/zoom-levels/ContextAwareZoomExample.astro
index fb693dff..f61419c5 100644
--- a/docs/src/components/core/zoom-levels/ContextAwareZoomExample.astro
+++ b/docs/src/components/core/zoom-levels/ContextAwareZoomExample.astro
@@ -49,7 +49,7 @@ fun ContextAwareZoom() {
searchResults.forEach { result ->
Marker(
position = result.location,
- icon = DefaultIcon(fillColor = Color.Red)
+ icon = ColorDefaultIcon(fillColor = Color.Red)
)
}
}
diff --git a/docs/src/components/examples/advanced-usage/AdvancedMapExample.astro b/docs/src/components/examples/advanced-usage/AdvancedMapExample.astro
index 8368f7bb..a577fd63 100644
--- a/docs/src/components/examples/advanced-usage/AdvancedMapExample.astro
+++ b/docs/src/components/examples/advanced-usage/AdvancedMapExample.astro
@@ -60,7 +60,7 @@ fun AdvancedMapScreen() {
// ${commentMarker}
Marker(
position = GeoPoint.fromLatLong(${centerLat}, ${centerLong}),
- icon = DefaultIcon(label = "${markerLabel}"),
+ icon = ColorDefaultIcon(label = "${markerLabel}"),
onClick = { markerState ->
println("${commentForMarkerClick}")
}
diff --git a/docs/src/components/examples/basic-usage/ClickToAddMarkersExample.astro b/docs/src/components/examples/basic-usage/ClickToAddMarkersExample.astro
index 6bedeb93..c39da275 100644
--- a/docs/src/components/examples/basic-usage/ClickToAddMarkersExample.astro
+++ b/docs/src/components/examples/basic-usage/ClickToAddMarkersExample.astro
@@ -25,7 +25,7 @@ fun ClickToAddMarkersExample() {
onMapClick = { geoPoint ->
val newMarker = MarkerState(
position = geoPoint,
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
label = "\${markers.size + 1}",
fillColor = ${fillColor}
),
diff --git a/docs/src/components/examples/basic-usage/SimpleMapExampleTabs.astro b/docs/src/components/examples/basic-usage/SimpleMapExampleTabs.astro
index 4078004b..c87953c3 100644
--- a/docs/src/components/examples/basic-usage/SimpleMapExampleTabs.astro
+++ b/docs/src/components/examples/basic-usage/SimpleMapExampleTabs.astro
@@ -64,7 +64,7 @@ fun SimpleMapExample() {
GoogleMapView(state = mapViewState) {
Marker(
position = GeoPoint.fromLatLong(${googleMapsLat}, ${googleMapsLong}),
- icon = DefaultIcon(label = "${googleMapsLabel}"),
+ icon = ColorDefaultIcon(label = "${googleMapsLabel}"),
extra = "${googleMapsExtra}"
)
}
@@ -77,7 +77,7 @@ fun SimpleMapExample() {
MapboxMapView(state = mapViewState) {
Marker(
position = GeoPoint.fromLatLong(${mapboxLat}, ${mapboxLong}),
- icon = DefaultIcon(label = "${mapboxLabel}"),
+ icon = ColorDefaultIcon(label = "${mapboxLabel}"),
extra = "${mapboxExtra}"
)
}
@@ -90,7 +90,7 @@ fun SimpleMapExample() {
HereMapView(state = mapViewState) {
Marker(
position = GeoPoint.fromLatLong(${hereLat}, ${hereLong}),
- icon = DefaultIcon(label = "${hereLabel}"),
+ icon = ColorDefaultIcon(label = "${hereLabel}"),
extra = "${hereExtra}"
)
}
@@ -103,7 +103,7 @@ fun SimpleMapExample() {
ArcGISMapView(state = mapViewState) {
Marker(
position = GeoPoint.fromLatLong(${arcgisLat}, ${arcgisLong}),
- icon = DefaultIcon(label = "${arcgisLabel}"),
+ icon = ColorDefaultIcon(label = "${arcgisLabel}"),
extra = "${arcgisExtra}"
)
}
@@ -116,7 +116,7 @@ fun SimpleMapExample() {
MapLibreMapView(state = mapViewState) {
Marker(
position = GeoPoint.fromLatLong(${maplibreLat}, ${maplibreLong}),
- icon = DefaultIcon(label = "${maplibreLabel}"),
+ icon = ColorDefaultIcon(label = "${maplibreLabel}"),
extra = "${maplibreExtra}"
)
}
diff --git a/docs/src/components/experimental/geojson/GeoJSONBasicExample.astro b/docs/src/components/experimental/geojson/GeoJSONBasicExample.astro
new file mode 100644
index 00000000..3a9a48b0
--- /dev/null
+++ b/docs/src/components/experimental/geojson/GeoJSONBasicExample.astro
@@ -0,0 +1,43 @@
+---
+import { Code } from '@astrojs/starlight/components';
+
+const code = `val layerState = remember { GeoJSONLayerState() }
+val features = remember {
+ listOf(
+ GeoJSONFeature(
+ geometry = GeoJSONGeometry.Point(longitude = 139.76, latitude = 35.68),
+ properties = mapOf("name" to "東京駅"),
+ ),
+ GeoJSONFeature(
+ geometry = GeoJSONGeometry.LineString(
+ coordinates = listOf(
+ LonLat(139.76, 35.68),
+ LonLat(139.77, 35.69),
+ )
+ ),
+ ),
+ GeoJSONFeature(
+ geometry = GeoJSONGeometry.Polygon(
+ rings = listOf(
+ listOf(
+ LonLat(139.75, 35.67),
+ LonLat(139.77, 35.67),
+ LonLat(139.77, 35.69),
+ LonLat(139.75, 35.69),
+ LonLat(139.75, 35.67), // 始点と終点を同じにする
+ )
+ )
+ ),
+ ),
+ )
+}
+
+MapView(...) {
+ GeoJSONLayer(
+ state = layerState,
+ features = features,
+ )
+}`;
+---
+
+
diff --git a/docs/src/components/experimental/geojson/GeoJSONClickExample.astro b/docs/src/components/experimental/geojson/GeoJSONClickExample.astro
new file mode 100644
index 00000000..29fcf191
--- /dev/null
+++ b/docs/src/components/experimental/geojson/GeoJSONClickExample.astro
@@ -0,0 +1,35 @@
+---
+import { Code } from '@astrojs/starlight/components';
+
+interface Props {
+ commentForHitTest?: string;
+ commentForResult?: string;
+}
+
+const {
+ commentForHitTest = "タップ位置のフィーチャを検索",
+ commentForResult = "フィーチャが見つかった場合"
+} = Astro.props;
+
+const code = `val layerState = remember {
+ GeoJSONLayerState(
+ onClick = { feature, position ->
+ println("${commentForResult}: \${feature.properties["name"]}")
+ }
+ )
+}
+
+MapView(
+ onMapClick = { geoPoint ->
+ // ${commentForHitTest}
+ val handled = layerState.processClick(geoPoint)
+ if (!handled) {
+ // GeoJSON フィーチャ以外のタップ処理
+ }
+ }
+) {
+ GeoJSONLayer(state = layerState, features = features)
+}`;
+---
+
+
diff --git a/docs/src/components/experimental/geojson/GeoJSONFeatureSignature.astro b/docs/src/components/experimental/geojson/GeoJSONFeatureSignature.astro
new file mode 100644
index 00000000..9414a1ca
--- /dev/null
+++ b/docs/src/components/experimental/geojson/GeoJSONFeatureSignature.astro
@@ -0,0 +1,16 @@
+---
+import { Code } from '@astrojs/starlight/components';
+
+const code = `data class GeoJSONFeature(
+ val id: String? = null,
+ val geometry: GeoJSONGeometry,
+ val properties: Map = emptyMap(),
+ val strokeColor: Int? = null, // nullの場合は GeoJSONLayerState のデフォルトを使用
+ val fillColor: Int? = null,
+ val strokeWidth: Float? = null,
+ val pointRadius: Float? = null,
+ val visible: Boolean = true,
+)`;
+---
+
+
diff --git a/docs/src/components/experimental/geojson/GeoJSONFeatureStateExample.astro b/docs/src/components/experimental/geojson/GeoJSONFeatureStateExample.astro
new file mode 100644
index 00000000..108d6fce
--- /dev/null
+++ b/docs/src/components/experimental/geojson/GeoJSONFeatureStateExample.astro
@@ -0,0 +1,37 @@
+---
+import { Code } from '@astrojs/starlight/components';
+
+interface Props {
+ commentForDynamic?: string;
+ commentForContent?: string;
+}
+
+const {
+ commentForDynamic = "動的に変化するフィーチャ(Compose state)",
+ commentForContent = "content ブロック内に GeoJSONFeatureState を配置"
+} = Astro.props;
+
+const code = `val featureState = remember {
+ GeoJSONFeatureState(
+ geometry = GeoJSONGeometry.Point(longitude = 139.76, latitude = 35.68),
+ properties = mapOf("name" to "動的ポイント"),
+ )
+}
+
+// ${commentForDynamic}
+LaunchedEffect(userLocation) {
+ featureState.geometry = GeoJSONGeometry.Point(
+ longitude = userLocation.longitude,
+ latitude = userLocation.latitude,
+ )
+}
+
+MapView(...) {
+ GeoJSONLayer(state = layerState) {
+ // ${commentForContent}
+ GeoJSONFeatureCompose(state = featureState)
+ }
+}`;
+---
+
+
diff --git a/docs/src/components/experimental/geojson/GeoJSONGeometryTypes.astro b/docs/src/components/experimental/geojson/GeoJSONGeometryTypes.astro
new file mode 100644
index 00000000..5e4944d3
--- /dev/null
+++ b/docs/src/components/experimental/geojson/GeoJSONGeometryTypes.astro
@@ -0,0 +1,18 @@
+---
+import { Code } from '@astrojs/starlight/components';
+
+const code = `sealed class GeoJSONGeometry {
+ data class Point(val longitude: Double, val latitude: Double)
+ data class MultiPoint(val points: List)
+ data class LineString(val coordinates: List)
+ data class MultiLineString(val lines: List>)
+ data class Polygon(val rings: List>) // rings[0]=外周, rings[1..]=穴
+ data class MultiPolygon(val polygons: List>>)
+ data class GeometryCollection(val geometries: List)
+ object Empty
+}
+
+data class LonLat(val longitude: Double, val latitude: Double)`;
+---
+
+
diff --git a/docs/src/components/experimental/geojson/GeoJSONLayerInstall.astro b/docs/src/components/experimental/geojson/GeoJSONLayerInstall.astro
new file mode 100644
index 00000000..7649eb99
--- /dev/null
+++ b/docs/src/components/experimental/geojson/GeoJSONLayerInstall.astro
@@ -0,0 +1,14 @@
+---
+import { Code } from '@astrojs/starlight/components';
+
+const code = `dependencies {
+ implementation(platform("com.mapconductor:mapconductor-bom:{BOM_MODULE_VERSION}"))
+ implementation("com.mapconductor:core")
+ implementation("com.mapconductor:geojson-layer")
+
+ // 使用する地図 SDK を選択
+ implementation("com.mapconductor:for-googlemaps")
+}`;
+---
+
+
diff --git a/docs/src/components/experimental/geojson/GeoJSONLayerSignature.astro b/docs/src/components/experimental/geojson/GeoJSONLayerSignature.astro
new file mode 100644
index 00000000..14a161ac
--- /dev/null
+++ b/docs/src/components/experimental/geojson/GeoJSONLayerSignature.astro
@@ -0,0 +1,14 @@
+---
+import { Code } from '@astrojs/starlight/components';
+
+const code = `@Composable
+fun MapViewScope.GeoJSONLayer(
+ state: GeoJSONLayerState = remember { GeoJSONLayerState() },
+ features: List = emptyList(),
+ tileSize: Int = 512,
+ disableTileServerCache: Boolean = false,
+ content: @Composable () -> Unit = {},
+)`;
+---
+
+
diff --git a/docs/src/components/experimental/geojson/GeoJSONLayerStateSignature.astro b/docs/src/components/experimental/geojson/GeoJSONLayerStateSignature.astro
new file mode 100644
index 00000000..b4332bd5
--- /dev/null
+++ b/docs/src/components/experimental/geojson/GeoJSONLayerStateSignature.astro
@@ -0,0 +1,19 @@
+---
+import { Code } from '@astrojs/starlight/components';
+
+const code = `class GeoJSONLayerState(
+ opacity: Float = 1.0f,
+ strokeColor: Int = Color.argb(255, 30, 136, 229), // 青系
+ fillColor: Int = Color.argb(128, 30, 136, 229), // 半透明青系
+ strokeWidth: Float = 2f,
+ pointRadius: Float = 8f,
+ visible: Boolean = true,
+ minZoom: Int = 0,
+ maxZoom: Int = 22,
+ val onClick: ((feature: GeoJSONFeature, position: GeoPoint) -> Unit)? = null,
+) {
+ fun processClick(geoPoint: GeoPoint): Boolean
+}`;
+---
+
+
diff --git a/docs/src/components/experimental/geojson/GeoJSONParserExample.astro b/docs/src/components/experimental/geojson/GeoJSONParserExample.astro
new file mode 100644
index 00000000..9eef8ed3
--- /dev/null
+++ b/docs/src/components/experimental/geojson/GeoJSONParserExample.astro
@@ -0,0 +1,23 @@
+---
+import { Code } from '@astrojs/starlight/components';
+
+interface Props {
+ commentForLargeFile?: string;
+ commentForStream?: string;
+}
+
+const {
+ commentForLargeFile = "大容量 GeoJSON ファイルのパース",
+ commentForStream = "1フィーチャずつ処理(メモリ効率が良い)"
+} = Astro.props;
+
+const code = `// ${commentForLargeFile}
+val features = GeoJSONParser.parseStream(assets.open("data.geojson"))
+
+// ${commentForStream}
+GeoJSONParser.streamParse(assets.open("large-data.geojson")) { feature ->
+ // 1件ずつ処理
+}`;
+---
+
+
diff --git a/docs/src/components/experimental/geojson/GeoJSONParserSignature.astro b/docs/src/components/experimental/geojson/GeoJSONParserSignature.astro
new file mode 100644
index 00000000..4b3b9d9d
--- /dev/null
+++ b/docs/src/components/experimental/geojson/GeoJSONParserSignature.astro
@@ -0,0 +1,13 @@
+---
+import { Code } from '@astrojs/starlight/components';
+
+const code = `object GeoJSONParser {
+ // InputStream 全体をパースして List を返す
+ fun parseStream(inputStream: InputStream): List
+
+ // 1フィーチャずつコールバック — 大容量ファイル(10MB+)向け
+ fun streamParse(inputStream: InputStream, onFeature: (GeoJSONFeature) -> Unit)
+}`;
+---
+
+
diff --git a/docs/src/components/experimental/geojson/GeoJSONStyleExample.astro b/docs/src/components/experimental/geojson/GeoJSONStyleExample.astro
new file mode 100644
index 00000000..802cccbb
--- /dev/null
+++ b/docs/src/components/experimental/geojson/GeoJSONStyleExample.astro
@@ -0,0 +1,15 @@
+---
+import { Code } from '@astrojs/starlight/components';
+
+const code = `val layerState = remember {
+ GeoJSONLayerState(
+ strokeColor = Color.rgb(255, 87, 34), // オレンジ
+ fillColor = Color.argb(100, 255, 87, 34), // 半透明オレンジ
+ strokeWidth = 3f,
+ pointRadius = 12f,
+ opacity = 0.9f,
+ )
+}`;
+---
+
+
diff --git a/docs/src/components/experimental/marker-native-strategy/BasicNativeExampleComposable.astro b/docs/src/components/experimental/marker-native-strategy/BasicNativeExampleComposable.astro
index 18519761..88eef6ab 100644
--- a/docs/src/components/experimental/marker-native-strategy/BasicNativeExampleComposable.astro
+++ b/docs/src/components/experimental/marker-native-strategy/BasicNativeExampleComposable.astro
@@ -28,7 +28,7 @@ fun BasicNativeExample() {
state = MarkerState(
id = markerData.id,
position = markerData.position,
- icon = DefaultIcon()
+ icon = ColorDefaultIcon()
)
)
nativeManager.registerEntity(entity)
diff --git a/docs/src/components/experimental/marker-native-strategy/NativeBatchOperationsExample.astro b/docs/src/components/experimental/marker-native-strategy/NativeBatchOperationsExample.astro
index 2612d3c5..23885910 100644
--- a/docs/src/components/experimental/marker-native-strategy/NativeBatchOperationsExample.astro
+++ b/docs/src/components/experimental/marker-native-strategy/NativeBatchOperationsExample.astro
@@ -11,7 +11,7 @@ const code = `suspend fun batchNativeOperations(nativeManager: NativeMarkerManag
state = MarkerState(
id = markerData.id,
position = markerData.position,
- icon = DefaultIcon()
+ icon = ColorDefaultIcon()
)
)
nativeManager.registerEntity(entity)
diff --git a/docs/src/components/experimental/marker-native-strategy/NativeClusteringExampleComposable.astro b/docs/src/components/experimental/marker-native-strategy/NativeClusteringExampleComposable.astro
index 63c71448..88e6d043 100644
--- a/docs/src/components/experimental/marker-native-strategy/NativeClusteringExampleComposable.astro
+++ b/docs/src/components/experimental/marker-native-strategy/NativeClusteringExampleComposable.astro
@@ -39,7 +39,7 @@ fun NativeClusteringExample() {
state = MarkerState(
id = markerData.id,
position = markerData.position,
- icon = DefaultIcon(fillColor = Color.Blue, scale = 0.8f)
+ icon = ColorDefaultIcon(fillColor = Color.Blue, scale = 0.8f)
)
)
nativeManager.registerEntity(entity)
diff --git a/docs/src/components/experimental/marker-strategy/ClusteringStrategyExampleComposable.astro b/docs/src/components/experimental/marker-strategy/ClusteringStrategyExampleComposable.astro
index e3638821..a7e62359 100644
--- a/docs/src/components/experimental/marker-strategy/ClusteringStrategyExampleComposable.astro
+++ b/docs/src/components/experimental/marker-strategy/ClusteringStrategyExampleComposable.astro
@@ -36,7 +36,7 @@ fun ClusteringStrategyExample() {
state = MarkerState(
id = markerData.id,
position = markerData.position,
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
fillColor = markerData.category.color,
scale = 0.8f
)
diff --git a/docs/src/components/experimental/marker-strategy/CustomMarkerStrategyExample.astro b/docs/src/components/experimental/marker-strategy/CustomMarkerStrategyExample.astro
index bee9ed71..b2ab250e 100644
--- a/docs/src/components/experimental/marker-strategy/CustomMarkerStrategyExample.astro
+++ b/docs/src/components/experimental/marker-strategy/CustomMarkerStrategyExample.astro
@@ -43,7 +43,7 @@ const code = `class CustomMarkerStrategy(
val addParams = markersToShow.map { entity ->
object : MarkerOverlayRendererInterface.AddParamsInterface {
override val state: MarkerState = entity.state
- override val bitmapIcon: BitmapIcon = entity.state.icon?.toBitmapIcon() ?: defaultIcon
+ override val bitmapIcon: BitmapIcon = entity.state.icon?.toBitmapIcon() ?: ColorDefaultIcon
}
}
renderer.onAdd(addParams)
diff --git a/docs/src/components/experimental/marker-strategy/DynamicLoadingExampleComposable.astro b/docs/src/components/experimental/marker-strategy/DynamicLoadingExampleComposable.astro
index ad249fcf..93247978 100644
--- a/docs/src/components/experimental/marker-strategy/DynamicLoadingExampleComposable.astro
+++ b/docs/src/components/experimental/marker-strategy/DynamicLoadingExampleComposable.astro
@@ -32,7 +32,7 @@ fun DynamicLoadingExample() {
state = MarkerState(
id = markerData.id,
position = markerData.position,
- icon = DefaultIcon()
+ icon = ColorDefaultIcon()
)
)
diff --git a/docs/src/components/experimental/marker-strategy/MigrationBasicToStrategyComposable.astro b/docs/src/components/experimental/marker-strategy/MigrationBasicToStrategyComposable.astro
index 28c629f3..9f1ed0dc 100644
--- a/docs/src/components/experimental/marker-strategy/MigrationBasicToStrategyComposable.astro
+++ b/docs/src/components/experimental/marker-strategy/MigrationBasicToStrategyComposable.astro
@@ -16,7 +16,7 @@ fun BasicMarkers() {
markers.forEach { markerData ->
Marker(
position = markerData.position,
- icon = DefaultIcon()
+ icon = ColorDefaultIcon()
)
}
}
@@ -33,7 +33,7 @@ fun StrategyMarkers() {
state = MarkerState(
id = markerData.id,
position = markerData.position,
- icon = DefaultIcon()
+ icon = ColorDefaultIcon()
)
)
strategy.markerManager.registerEntity(entity)
diff --git a/docs/src/components/experimental/marker-strategy/StrategyMarkerManagementComposable.astro b/docs/src/components/experimental/marker-strategy/StrategyMarkerManagementComposable.astro
index a33fadc4..ebe2a464 100644
--- a/docs/src/components/experimental/marker-strategy/StrategyMarkerManagementComposable.astro
+++ b/docs/src/components/experimental/marker-strategy/StrategyMarkerManagementComposable.astro
@@ -24,7 +24,7 @@ fun StrategyMarkerManagement() {
state = MarkerState(
id = markerData.id,
position = markerData.position,
- icon = DefaultIcon(fillColor = markerData.color)
+ icon = ColorDefaultIcon(fillColor = markerData.color)
)
)
diff --git a/docs/src/components/get-started/CircleExample.astro b/docs/src/components/get-started/CircleExample.astro
index ce986844..759fc276 100644
--- a/docs/src/components/get-started/CircleExample.astro
+++ b/docs/src/components/get-started/CircleExample.astro
@@ -34,7 +34,7 @@ GoogleMapView(
// ${commentMarker}
Marker(
position = GeoPoint.fromLatLong(${markerLat}, ${markerLong}),
- icon = DefaultIcon(label = "${markerLabel}"),
+ icon = ColorDefaultIcon(label = "${markerLabel}"),
extra = "tokyo_tower"
)
diff --git a/docs/src/components/get-started/CompleteSample.astro b/docs/src/components/get-started/CompleteSample.astro
index 91132e43..a72bfbf6 100644
--- a/docs/src/components/get-started/CompleteSample.astro
+++ b/docs/src/components/get-started/CompleteSample.astro
@@ -125,7 +125,7 @@ fun CompleteSample(modifier: Modifier = Modifier) {
// ${commentMarkers}
Marker(
position = marker1,
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
label = "${marker1Label}",
fillColor = Color.Red,
),
@@ -135,7 +135,7 @@ fun CompleteSample(modifier: Modifier = Modifier) {
Marker(
position = marker2,
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
label = "${marker2Label}",
fillColor = Color.Blue
),
@@ -147,7 +147,7 @@ fun CompleteSample(modifier: Modifier = Modifier) {
clickedPosition?.let { position ->
Marker(
position = position,
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
label = "!",
fillColor = Color.Green
),
diff --git a/docs/src/components/get-started/InteractiveMap.astro b/docs/src/components/get-started/InteractiveMap.astro
index cf6abc50..3a9805ef 100644
--- a/docs/src/components/get-started/InteractiveMap.astro
+++ b/docs/src/components/get-started/InteractiveMap.astro
@@ -49,7 +49,7 @@ fun InteractiveMap(modifier: Modifier = Modifier) {
clickedPosition?.let { position ->
Marker(
position = position,
- icon = DefaultIcon(label = "${clickLabelIcon}"),
+ icon = ColorDefaultIcon(label = "${clickLabelIcon}"),
extra = "clicked_marker"
)
}
diff --git a/docs/src/components/get-started/MapWithCameraControl.astro b/docs/src/components/get-started/MapWithCameraControl.astro
index 1ff8ae8e..8ef0d2c4 100644
--- a/docs/src/components/get-started/MapWithCameraControl.astro
+++ b/docs/src/components/get-started/MapWithCameraControl.astro
@@ -91,8 +91,8 @@ fun MapWithCameraControl(modifier: Modifier = Modifier) {
modifier = Modifier.fillMaxSize(),
state = mapViewState
) {
- Marker(position = marker1, icon = DefaultIcon(label = "${marker1Label}"))
- Marker(position = marker2, icon = DefaultIcon(label = "${marker2Label}"))
+ Marker(position = marker1, icon = ColorDefaultIcon(label = "${marker1Label}"))
+ Marker(position = marker2, icon = ColorDefaultIcon(label = "${marker2Label}"))
}
}
}`;
diff --git a/docs/src/components/get-started/MapWithMarkers.astro b/docs/src/components/get-started/MapWithMarkers.astro
index 6faca652..a69be6a4 100644
--- a/docs/src/components/get-started/MapWithMarkers.astro
+++ b/docs/src/components/get-started/MapWithMarkers.astro
@@ -66,14 +66,14 @@ fun MapWithMarkers(modifier: Modifier = Modifier) {
// ${commentAddMarkers}
Marker(
position = marker1,
- icon = DefaultIcon(label = "${marker1Label}"),
+ icon = ColorDefaultIcon(label = "${marker1Label}"),
extra = "marker1",
onClick = onMarkerClick
)
Marker(
position = marker2,
- icon = DefaultIcon(label = "${marker2Label}"),
+ icon = ColorDefaultIcon(label = "${marker2Label}"),
extra = "marker2",
onClick = onMarkerClick
)
diff --git a/docs/src/components/get-started/MarkerClickInteraction.astro b/docs/src/components/get-started/MarkerClickInteraction.astro
index 412799ca..d0a57efc 100644
--- a/docs/src/components/get-started/MarkerClickInteraction.astro
+++ b/docs/src/components/get-started/MarkerClickInteraction.astro
@@ -30,7 +30,7 @@ GoogleMapView(
) {
Marker(
position = marker1,
- icon = DefaultIcon(label = "${marker1Label}"),
+ icon = ColorDefaultIcon(label = "${marker1Label}"),
extra = "marker1",
onClick = { markerState ->
// ${commentMarkerClicked}
@@ -39,7 +39,7 @@ GoogleMapView(
)
Marker(
position = marker2,
- icon = DefaultIcon(label = "${marker2Label}"),
+ icon = ColorDefaultIcon(label = "${marker2Label}"),
extra = "marker2",
onClick = { markerState ->
// ${commentMarkerClicked}
diff --git a/docs/src/components/get-started/MarkerCustomization.astro b/docs/src/components/get-started/MarkerCustomization.astro
index df5dd7f6..a96d1970 100644
--- a/docs/src/components/get-started/MarkerCustomization.astro
+++ b/docs/src/components/get-started/MarkerCustomization.astro
@@ -17,7 +17,7 @@ const {
const code = `Marker(
position = GeoPoint.fromLatLong(${lat}, ${long}),
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
label = "${label}",
backgroundColor = Color.Red,
textColor = Color.White
diff --git a/docs/src/components/get-started/PolylineExample.astro b/docs/src/components/get-started/PolylineExample.astro
index e0c00b0e..992ab72a 100644
--- a/docs/src/components/get-started/PolylineExample.astro
+++ b/docs/src/components/get-started/PolylineExample.astro
@@ -30,8 +30,8 @@ const code = `GoogleMapView(
state = mapViewState
) {
// ${commentMarker}
- Marker(position = GeoPoint.fromLatLong(${marker1Lat}, ${marker1Long}), icon = DefaultIcon(label = "${marker1Label}"))
- Marker(position = GeoPoint.fromLatLong(${marker2Lat}, ${marker2Long}), icon = DefaultIcon(label = "${marker2Label}"))
+ Marker(position = GeoPoint.fromLatLong(${marker1Lat}, ${marker1Long}), icon = ColorDefaultIcon(label = "${marker1Label}"))
+ Marker(position = GeoPoint.fromLatLong(${marker2Lat}, ${marker2Long}), icon = ColorDefaultIcon(label = "${marker2Label}"))
// ${commentDrawLine}
Polyline(
diff --git a/docs/src/components/index/QuickExampleTabs.astro b/docs/src/components/index/QuickExampleTabs.astro
index 8235436e..3214ae05 100644
--- a/docs/src/components/index/QuickExampleTabs.astro
+++ b/docs/src/components/index/QuickExampleTabs.astro
@@ -43,7 +43,7 @@ fun MyMap() {
) {
Marker(
position = targetPosition,
- icon = DefaultIcon(label = "SF")
+ icon = ColorDefaultIcon(label = "SF")
)
}
}`;
@@ -69,7 +69,7 @@ fun MyMap() {
) {
Marker(
position = targetPosition,
- icon = DefaultIcon(label = "WA")
+ icon = ColorDefaultIcon(label = "WA")
)
}
}`;
@@ -96,7 +96,7 @@ fun MyMap() {
) {
Marker(
position = targetPosition,
- icon = DefaultIcon(label = "EIN")
+ icon = ColorDefaultIcon(label = "EIN")
)
}
}`;
diff --git a/docs/src/components/introduction/BasicMapExample.astro b/docs/src/components/introduction/BasicMapExample.astro
index 98f119cf..ef242852 100644
--- a/docs/src/components/introduction/BasicMapExample.astro
+++ b/docs/src/components/introduction/BasicMapExample.astro
@@ -53,7 +53,7 @@ fun BasicMapExample(modifier: Modifier = Modifier) {
${markerComment}
Marker(
position = sanFrancisco,
- icon = DefaultIcon(label = "SF"),
+ icon = ColorDefaultIcon(label = "SF"),
extra = "San Francisco marker",
onClick = { markerState ->
println("Marker clicked: \${markerState.extra}")
diff --git a/docs/src/components/provider-compatibility/CompatibilityAwareMapExample.astro b/docs/src/components/provider-compatibility/CompatibilityAwareMapExample.astro
index fca86b33..2033255c 100644
--- a/docs/src/components/provider-compatibility/CompatibilityAwareMapExample.astro
+++ b/docs/src/components/provider-compatibility/CompatibilityAwareMapExample.astro
@@ -29,7 +29,7 @@ fun CompatibilityAwareMap() {
// ${alwaysSupportedComment}
Marker(
position = GeoPoint.fromLatLong(${lat}, ${long}),
- icon = DefaultIcon()
+ icon = ColorDefaultIcon()
)
Circle(
diff --git a/docs/src/components/states/groundimage/DynamicBoundsExampleComposable.astro b/docs/src/components/states/groundimage/DynamicBoundsExampleComposable.astro
index 2575723e..ef98e145 100644
--- a/docs/src/components/states/groundimage/DynamicBoundsExampleComposable.astro
+++ b/docs/src/components/states/groundimage/DynamicBoundsExampleComposable.astro
@@ -60,7 +60,7 @@ fun DynamicBoundsExample() {
// ${commentForCornerMarkers}
Marker(
position = southwest,
- icon = DefaultIcon(fillColor = Color.Green, label = "${southwestLabel}"),
+ icon = ColorDefaultIcon(fillColor = Color.Green, label = "${southwestLabel}"),
draggable = true,
extra = "${southwestLabel}",
onDrag = onCornerMarkerDrag
@@ -68,7 +68,7 @@ fun DynamicBoundsExample() {
Marker(
position = northeast,
- icon = DefaultIcon(fillColor = Color.Red, label = "${northeastLabel}"),
+ icon = ColorDefaultIcon(fillColor = Color.Red, label = "${northeastLabel}"),
draggable = true,
extra = "${northeastLabel}",
onDrag = onCornerMarkerDrag
diff --git a/docs/src/components/states/marker/AnimatedMarkerExampleComposable.astro b/docs/src/components/states/marker/AnimatedMarkerExampleComposable.astro
index f3b50245..62caa196 100644
--- a/docs/src/components/states/marker/AnimatedMarkerExampleComposable.astro
+++ b/docs/src/components/states/marker/AnimatedMarkerExampleComposable.astro
@@ -24,7 +24,7 @@ fun AnimatedMarkerExample() {
mutableStateOf(
MarkerState(
position = startPosition,
- icon = DefaultIcon(fillColor = Color.Green, label = "${markerLabel}"),
+ icon = ColorDefaultIcon(fillColor = Color.Green, label = "${markerLabel}"),
extra = "${extraLabel}"
)
)
diff --git a/docs/src/components/states/marker/DynamicMarkerExampleComposable.astro b/docs/src/components/states/marker/DynamicMarkerExampleComposable.astro
index 4493e15b..34c6d088 100644
--- a/docs/src/components/states/marker/DynamicMarkerExampleComposable.astro
+++ b/docs/src/components/states/marker/DynamicMarkerExampleComposable.astro
@@ -34,7 +34,7 @@ fun DynamicMarkerExample() {
mutableStateOf(
MarkerState(
position = GeoPoint.fromLatLong(${initialLatitude}, ${initialLongitude}),
- icon = DefaultIcon(fillColor = Color.Red, label = "${initialLabel}"),
+ icon = ColorDefaultIcon(fillColor = Color.Red, label = "${initialLabel}"),
extra = "${initialExtra}"
)
)
@@ -47,7 +47,7 @@ fun DynamicMarkerExample() {
onClick = {
counter++
markerState = markerState.copy(
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
fillColor = colors[counter % colors.size],
label = counter.toString()
),
diff --git a/docs/src/components/states/marker/MarkerStateAdvancedExamplesComposable.astro b/docs/src/components/states/marker/MarkerStateAdvancedExamplesComposable.astro
index 3b1a33c5..f0e7111e 100644
--- a/docs/src/components/states/marker/MarkerStateAdvancedExamplesComposable.astro
+++ b/docs/src/components/states/marker/MarkerStateAdvancedExamplesComposable.astro
@@ -125,7 +125,7 @@ fun CustomIconMarkerExample() {
listOf(
MarkerState(
position = GeoPoint.fromLatLong(${customMarkerLatitude}, ${customMarkerLongitude}),
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
scale = 1.5f,
fillColor = Color.Red,
strokeColor = Color.White,
diff --git a/docs/src/components/states/marker/MarkerStateCustomExample.astro b/docs/src/components/states/marker/MarkerStateCustomExample.astro
index da7a1cd2..204cb9a1 100644
--- a/docs/src/components/states/marker/MarkerStateCustomExample.astro
+++ b/docs/src/components/states/marker/MarkerStateCustomExample.astro
@@ -21,7 +21,7 @@ const {
const code = `val customMarkerState = MarkerState(
position = GeoPoint.fromLatLong(${latitude}, ${longitude}),
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
fillColor = Color.Blue,
label = "${markerLabel}",
scale = 1.2f
diff --git a/docs/src/components/states/polygon/EditablePolygonExampleComposable.astro b/docs/src/components/states/polygon/EditablePolygonExampleComposable.astro
index 2a0326b6..29e788c4 100644
--- a/docs/src/components/states/polygon/EditablePolygonExampleComposable.astro
+++ b/docs/src/components/states/polygon/EditablePolygonExampleComposable.astro
@@ -54,7 +54,7 @@ fun EditablePolygonExample() {
polygonState.points.dropLast(1).forEachIndexed { index, point ->
Marker(
position = point,
- icon = DefaultIcon(
+ icon = ColorDefaultIcon(
fillColor = Color.Red,
label = "\${index + 1}",
scale = 0.8f
diff --git a/docs/src/config.ts b/docs/src/config.ts
index 61f3fe63..cd00510f 100644
--- a/docs/src/config.ts
+++ b/docs/src/config.ts
@@ -1,23 +1,23 @@
-export const BOM_MODULE_VERSION = '1.1.3';
-export const CORE_MODULE_VERSION = '1.1.3';
-export const ARCGIS_MODULE_VERSION = '1.1.3';
-export const GOOGLEMAPS_MODULE_VERSION = '1.1.3';
-export const HERE_MODULE_VERSION = '1.1.3';
-export const MAPBOX_MODULE_VERSION = '1.1.3';
-export const MAPLIBRE_MODULE_VERSION = '1.1.3';
+export const BOM_MODULE_VERSION = '1.1.7';
+export const CORE_MODULE_VERSION = '1.1.7';
+export const ARCGIS_MODULE_VERSION = '1.1.7';
+export const GOOGLEMAPS_MODULE_VERSION = '1.1.7';
+export const HERE_MODULE_VERSION = '1.1.7';
+export const MAPBOX_MODULE_VERSION = '1.1.7';
+export const MAPLIBRE_MODULE_VERSION = '1.1.7';
export const ICON_MODULE_VERSION = '1.1.0';
export const MARKER_NATIVE_STRATEGY_MODULE_VERSION = '1.1.0';
export const MARKER_STRATEGY_MODULE_VERSION = '1.1.0';
-export const HEATMAP_MODULE_VERSION = '1.1.0';
-export const MARKER_CLUSTERING_MODULE_VERSION = '1.1.0';
-export const GOOGLE_MAPS_SDK_VERSION = '19.2.0';
-export const MAPBOX_SDK_VERSION = '11.14.3';
+export const HEATMAP_MODULE_VERSION = '1.0.0';
+export const MARKER_CLUSTERING_MODULE_VERSION = '1.0.0';
+export const GOOGLE_MAPS_SDK_VERSION = '20.0.0';
+export const MAPBOX_SDK_VERSION = '11.24.3';
export const HERE_EXPLORER_SDK_VERSION = '4.23.2.0.210004';
export const ARCGIS_SDK_VERSION = '200.7.0';
-export const MAPLBRE_SDK_VERSION = '12.0.0';
-export const KOTLIN_VERSION = '1.9.25';
+export const MAPLBRE_SDK_VERSION = '13.1.0';
+export const KOTLIN_VERSION = '2.4.0';
export const ANDROID_MIN_SDK_VERSION = '26';
-export const ANDROID_TARGET_SDK_VERSION = '35';
-export const JETPACK_COMPOSE_BOM_VERSION = '2025.05.00';
+export const ANDROID_TARGET_SDK_VERSION = '37';
+export const JETPACK_COMPOSE_BOM_VERSION = '2026.05.01';
export const JAVA_VERSION = '17';
export const SECRETS_GRADLE_PLUGIN_VERSION = "2.0.1";
diff --git a/docs/src/content/docs/components/infobubble.mdx b/docs/src/content/docs/components/infobubble.mdx
index 3ce27070..a76699a0 100644
--- a/docs/src/content/docs/components/infobubble.mdx
+++ b/docs/src/content/docs/components/infobubble.mdx
@@ -4,13 +4,17 @@ head:
- tag: meta
attrs:
name: description
- content: Display custom info windows anchored to markers using InfoBubble in MapConductor Android SDK.
+ content: MapConductor Android SDK InfoBubble - how to display custom information windows attached to markers
---
import SimpleInfoBubbleExample from '~/components/components/infobubble/SimpleInfoBubbleExample.astro';
import RichContentInfoBubbleExample from '~/components/components/infobubble/RichContentInfoBubbleExample.astro';
import InteractiveBubbleExample from '~/components/components/infobubble/InteractiveBubbleExample.astro';
import InfoBubbleSignature from '~/components/components/infobubble/InfoBubbleSignature.astro';
+import StandaloneInfoBubbleSignature from '~/components/components/infobubble/StandaloneInfoBubbleSignature.astro';
+import StandaloneInfoBubbleExample from '~/components/components/infobubble/StandaloneInfoBubbleExample.astro';
+import InfoBubbleCustomSignature from '~/components/components/infobubble/InfoBubbleCustomSignature.astro';
+import InfoBubbleCustomExample from '~/components/components/infobubble/InfoBubbleCustomExample.astro';
import MultipleBubblesExample from '~/components/components/infobubble/MultipleBubblesExample.astro';
import CustomPositioningExample from '~/components/components/infobubble/CustomPositioningExample.astro';
import LifecycleManagementExample from '~/components/components/infobubble/LifecycleManagementExample.astro';
@@ -23,25 +27,37 @@ import ImplementationTipsExample from '~/components/components/infobubble/Implem
import DebugModeExample from '~/components/components/infobubble/DebugModeExample.astro';
import RightInfoBubbleMapExample from '~/components/components/infobubble/RightInfoBubbleMapExample.astro';
-InfoBubble is a component that displays custom content in a speech bubble attached to a marker on the map. It provides a way to show detailed information about markers without cluttering the map interface.
+InfoBubble is a component that displays custom content in a callout-style bubble attached to a marker on the map. It provides a way to show detailed information about a marker.
## Overview
-InfoBubble appears above a specific marker. Because the content inside InfoBubble is provided as a composable, you can design the bubble freely to match your app’s UI.
+InfoBubble is displayed above a specific marker. Because the content shown inside an InfoBubble can be provided as a Composable, you can implement any design you need.
-## Composable Function
+## Composable Functions
## Parameters
-- **`marker`**: The `MarkerState` to which the bubble is attached.
-- **`bubbleColor`**: Background color of the bubble (default: White).
-- **`borderColor`**: Border color of the bubble (default: Black).
-- **`contentPadding`**: Internal padding around the content (default: 8dp).
-- **`cornerRadius`**: Radius of the bubble's rounded corners (default: 4dp).
-- **`tailSize`**: Size of the speech bubble tail pointing to the marker (default: 8dp).
-- **`content`**: Composable content to display inside the bubble.
+- **`marker`**: The `MarkerState` that the bubble is attached to
+- **`bubbleColor`**: The bubble background color (default: White)
+- **`borderColor`**: The bubble border color (default: Black)
+- **`contentPadding`**: Inner padding around the content (default: 8dp)
+- **`cornerRadius`**: The bubble corner radius (default: 4dp)
+- **`tailSize`**: The size of the bubble tail that points to the marker (default: 8dp)
+- **`content`**: Composable content to display inside the bubble
+
+## Marker-Free Placement
+
+`InfoBubble` can also be placed directly at any `GeoPoint` on the map without being tied to a `MarkerState`. When `position` changes, the bubble moves as well, and it follows map panning and zooming.
+
+
+
+
## Basic Usage
@@ -81,6 +97,7 @@ InfoBubble appears above a specific marker. Because the content inside InfoBubbl
markerId="coffee-shop-marker"
zoomLevel={16.0}
/>
+
-### Custom Designs
-To implement a custom design, you can build your own InfoBubble-based component. The following video shows an example of a bubble with a tail on the right side.
+### Custom Design
+
+To implement a custom design, you can create your own InfoBubble-derived component. The following is a detailed implementation example of a custom bubble with a tail on the right side.
-## Positioning and Behavior
-### Automatic Positioning
+## Placement and Behavior
-InfoBubble automatically handles its positioning:
+### Automatic Placement
-- The bubble tail points to the center of the marker.
-- The bubble is kept visible within the map viewport as much as possible.
-- When the map is panned or zoomed, the bubble follows the marker.
+InfoBubble is automatically positioned above the associated marker:
-### Custom Positioning
+- The bubble tail points to the center of the marker
+- The bubble adjusts its position to stay visible within the map viewport
+- When the map is panned or zoomed, the bubble follows the marker
-InfoBubble handles most positioning automatically, but you can influence the result by adjusting the marker icon’s anchor:
+### Custom Placement
+
+InfoBubble handles placement automatically, but you can influence it through the marker icon anchor:
@@ -163,13 +182,13 @@ InfoBubble automatically manages its lifecycle:
-## Styling and Theming
+## Styles and Themes
### Dark Mode Support
-### Custom Themes
+### Custom Theme
@@ -183,21 +202,35 @@ InfoBubble automatically manages its lifecycle:
+## InfoBubbleCustom
+
+With `InfoBubbleCustom`, you can freely draw the entire bubble, including its tail, as a Composable. `tailOffset` specifies which point inside the bubble is used as the connection point to the marker with `Offset(0f..1f, 0f..1f)`.
+
+- `Offset(1f, 0.5f)`: Use the right center as the connection point
+- `Offset(0.5f, 1f)`: Use the bottom center as the connection point
+
+
+
+
+
## Best Practices
### Design Guidelines
-1. **Keep content concise**: InfoBubbles should provide essential information without overwhelming users.
-2. **Use appropriate sizing**: Limit bubble width to maintain readability on mobile devices.
-3. **Provide clear actions**: If you include buttons, make their purpose obvious.
-4. **Consider touch targets**: Ensure interactive elements meet minimum touch target sizes.
+1. **Concise content**: InfoBubble should provide essential information without overwhelming the user
+2. **Appropriate size**: Limit the bubble width to maintain readability on mobile devices
+3. **Clear actions**: If you include buttons, make their purpose clear
+4. **Touch targets**: Make sure interactive elements meet the minimum touch target size
### User Experience
-1. **Dismiss behavior**: Allow users to dismiss bubbles by tapping the map or marker.
-2. **Loading states**: Show loading indicators for content that requires network requests.
-3. **Error handling**: Gracefully handle missing or invalid data.
-4. **Accessibility**: Provide content descriptions for screen readers.
+1. **Dismissal behavior**: Let users close the bubble by tapping the map or a marker
+2. **Loading states**: Show a loading indicator for content that requires network requests
+3. **Error handling**: Handle missing or invalid data appropriately
+4. **Accessibility**: Provide content descriptions for screen readers
### Implementation Tips
@@ -207,7 +240,7 @@ InfoBubble automatically manages its lifecycle:
### Common Issues
-1. **Bubble not appearing**: Verify the marker is properly configured and InfoBubble is inside `MapViewScope`.
-2. **Bubble not dismissing**: Check that conditional rendering properly responds to state changes.
-3. **Poor performance**: Limit the number of simultaneous bubbles and optimize content composition.
-4. **Layout issues**: Use appropriate sizing constraints and test on different screen sizes.
+1. **Bubble does not appear**: Make sure the marker is configured correctly and the InfoBubble is inside the MapViewScope
+2. **Bubble does not close**: Check that conditional rendering responds correctly to state changes
+3. **Poor performance**: Limit the number of bubbles displayed at the same time and optimize content composition
+4. **Layout issues**: Use appropriate size constraints and test with different screen sizes
diff --git a/docs/src/content/docs/components/marker.mdx b/docs/src/content/docs/components/marker.mdx
index cb8a3f6f..2a4baf30 100644
--- a/docs/src/content/docs/components/marker.mdx
+++ b/docs/src/content/docs/components/marker.mdx
@@ -14,7 +14,7 @@ import BasicMarkerExample from '~/components/components/marker/BasicMarkerExampl
import CustomIconMarkerExample from '~/components/components/marker/CustomIconMarkerExample.astro';
import DraggableMarkerExample from '~/components/components/marker/DraggableMarkerExample.astro';
import MultipleMarkersExample from '~/components/components/marker/MultipleMarkersExample.astro';
-import DefaultIconSignature from '~/components/components/marker/DefaultIconSignature.astro';
+import ColorDefaultIconSignature from '~/components/components/marker/ColorDefaultIconSignature.astro';
import DrawableDefaultIconSignature from '~/components/components/marker/DrawableDefaultIconSignature.astro';
import ImageIconSignature from '~/components/components/marker/ImageIconSignature.astro';
import MarkerAnimation from '~/components/components/marker/MarkerAnimation.astro';
@@ -63,7 +63,7 @@ For a large number of markers or when moving markers, using state is recommended
Standard marker with customizable appearance:
-
+
### DrawableDefaultMarkerIcon
diff --git a/docs/src/content/docs/core/mapcameraposition.mdx b/docs/src/content/docs/core/mapcameraposition.mdx
index 25450ef9..7e12bb99 100644
--- a/docs/src/content/docs/core/mapcameraposition.mdx
+++ b/docs/src/content/docs/core/mapcameraposition.mdx
@@ -1,10 +1,10 @@
---
-title: MapCameraPositionInterface
+title: MapCameraPositionInterface (Camera Position)
head:
- tag: meta
attrs:
name: description
- content: MapCameraPosition — configure map center, zoom, tilt, and bearing in MapConductor Android SDK.
+ content: MapCameraPosition - how to set the map center, zoom, tilt, and bearing in MapConductor Android SDK
---
import MapCameraPositionInterface from '~/components/core/mapcameraposition/MapCameraPositionInterface.astro';
@@ -14,6 +14,8 @@ import CustomCameraPositionsExample from '~/components/core/mapcameraposition/Cu
import ZoomLevelsExample from '~/components/core/mapcameraposition/ZoomLevelsExample.astro';
import BearingExamples from '~/components/core/mapcameraposition/BearingExamples.astro';
import TiltExamples from '~/components/core/mapcameraposition/TiltExamples.astro';
+import NegativeTiltExample from '~/components/core/mapcameraposition/NegativeTiltExample.astro';
+import NegativeTiltSdkNote from '~/components/core/mapcameraposition/NegativeTiltSdkNote.astro';
import VisibleRegionDataClass from '~/components/core/mapcameraposition/VisibleRegionDataClass.astro';
import VisibleRegionExample from '~/components/core/mapcameraposition/VisibleRegionExample.astro';
import AnimatedCameraExample from '~/components/core/mapcameraposition/AnimatedCameraExample.astro';
@@ -22,7 +24,7 @@ import UserLocationCameraExample from '~/components/core/mapcameraposition/UserL
import ShowMultiplePointsExample from '~/components/core/mapcameraposition/ShowMultiplePointsExample.astro';
import NavigationCameraExample from '~/components/core/mapcameraposition/NavigationCameraExample.astro';
-`MapCameraPositionInterface` represents the camera's viewing position, orientation, and visible area on the map. It defines where the camera is looking, how much of the map is visible, and the perspective from which the map is viewed.
+`MapCameraPositionInterface` represents the camera's view position, orientation, and visible region on the map. It defines where the camera is looking, how much of the map is visible, and the viewpoint used to display the map.
## Interface and Implementation
@@ -38,23 +40,23 @@ The main implementation provides immutable camera position data:
## Properties
-### Camera Location
+### Camera Position
-- **`position: GeoPointInterface`**: Geographic center point of the camera's view
-- **`zoom: Double`**: Zoom level (approximately follows Google Maps scale)
-- **`bearing: Double`**: Compass direction in degrees (0 = North, 90 = East)
-- **`tilt: Double`**: Camera tilt angle in degrees (0 = top-down, 90 = horizontal)
+- **`position: GeoPointInterface`**: The geographic center point of the camera view
+- **`zoom: Double`**: The zoom level (approximately follows the Google Maps scale)
+- **`bearing: Double`**: The compass direction in degrees (0 = north, 90 = east)
+- **`tilt: Double`**: The camera tilt angle in degrees (0 = straight down, 90 = horizontal)
### View Configuration
- **`paddings: MapPaddingsInterface?`**: Viewport padding that affects the visible region
-- **`visibleRegion: VisibleRegion?`**: `(Readonly)` The actual geographic bounds visible on screen. **Note: this property does not work in v{BOM_MODULE_VERSION} yet**.
+- **`visibleRegion: VisibleRegion?`**: `(read-only)` The geographic bounds actually displayed on screen
## Creation Methods
### Default Position
-
+
### Custom Position
@@ -72,9 +74,9 @@ The main implementation provides immutable camera position data:
## Zoom Levels
-MapConductor zoom levels approximately follow Google Maps scale but may vary slightly between providers:
+MapConductor zoom levels approximately follow the Google Maps scale, but they may vary slightly between map SDKs:
-- **0-2**: World view, continents visible
+- **0-2**: World view, continents are visible
- **3-5**: Country level
- **6-9**: State/region level
- **10-12**: City level
@@ -90,7 +92,7 @@ MapConductor zoom levels approximately follow Google Maps scale but may vary sli
cityLatitude={37.7749}
cityLongitude={-122.4194}
cityZoom={12.0}
- cityComment="Show entire city"
+ cityComment="Show the entire city"
streetLatitude={37.7749}
streetLongitude={-122.4194}
streetZoom={17.0}
@@ -109,15 +111,15 @@ Bearing rotates the map around the center point:
bearingNorth={0.0}
bearingEast={90.0}
bearingRoute={135.0}
- northUpComment="North-up (default)"
- eastUpComment="East-up"
- followingBearingComment="Following route bearing"
+ northUpComment="North up (default)"
+ eastUpComment="East up"
+ followingBearingComment="Follow the route bearing"
routeComment="Southeast"
/>
-### Tilt (3D Perspective)
+### Tilt (3D Viewpoint)
-Tilt provides 3D viewing angles:
+Tilt provides a 3D viewing angle:
+#### Negative `tilt` Values - Looking Forward
+
+When `tilt` is set to a negative value, the camera uses an upward-looking elevation view above the horizon. Positive tilt is treated as a view looking down at the ground, while negative tilt is treated as a view looking forward in the `bearing` direction.
+
+
+
+
+
## Visible Region
-The visible region describes the actual geographic area shown on screen after considering camera position, zoom level, bearing, tilt, and viewport padding.
+The visible region describes the actual geographic area displayed on screen after accounting for the camera position, zoom level, bearing, tilt, and viewport padding.
### VisibleRegion Class
-
-
### Properties
-- **`bounds: GeoRectBounds`**: The rectangular geographic bounds that encompass the entire visible area. This is the minimum bounding rectangle that contains all visible content.
-- **`nearLeft: GeoPointInterface?`**: The geographic coordinate of the bottom-left corner of the visible region. "Near" refers to the side closest to the camera position.
-- **`nearRight: GeoPointInterface?`**: The geographic coordinate of the bottom-right corner of the visible region.
-- **`farLeft: GeoPointInterface?`**: The geographic coordinate of the top-left corner of the visible region. "Far" refers to the side furthest from the camera position.
-- **`farRight: GeoPointInterface?`**: The geographic coordinate of the top-right corner of the visible region.
+- **`bounds: GeoRectBounds`**: Geographic bounds of the rectangle that contains the entire visible region. This is the smallest bounding rectangle that contains all visible content.
+- **`nearLeft: GeoPointInterface?`**: Geographic coordinates of the lower-left corner of the visible region. "near" refers to the side closest to the camera position.
+- **`nearRight: GeoPointInterface?`**: Geographic coordinates of the lower-right corner of the visible region.
+- **`farLeft: GeoPointInterface?`**: Geographic coordinates of the upper-left corner of the visible region. "far" refers to the side farthest from the camera position.
+- **`farRight: GeoPointInterface?`**: Geographic coordinates of the upper-right corner of the visible region.
-### Using Visible Region
+### Using VisibleRegion
-## Animation and Transitions
+
+
+## Animations and Transitions
### Smooth Camera Movement
@@ -186,7 +196,9 @@ The visible region describes the actual geographic area shown on screen after co
### Interactive Camera Control
-
+
-### Diseños Personalizados
-Para implementar un diseño personalizado, puede crear su propio componente basado en InfoBubble. El siguiente código y video muestran un ejemplo de una burbuja con una cola en el lado derecho.
+### Diseño personalizado
+
+Para implementar un diseño personalizado, puedes crear tu propio componente derivado de InfoBubble. El siguiente es un ejemplo de implementación detallado de una burbuja personalizada con una cola en el lado derecho.
@@ -137,77 +155,92 @@ Para implementar un diseño personalizado, puede crear su propio componente basa
-## Posicionamiento y Comportamiento
-### Posicionamiento Automático
+## Ubicación y comportamiento
-La InfoBubble se posiciona automáticamente encima de su marcador asociado:
+### Ubicación automática
+
+InfoBubble se coloca automáticamente sobre el marcador asociado:
- La cola de la burbuja apunta al centro del marcador
-- La burbuja ajusta su posición para permanecer visible en el viewport del mapa
-- La burbuja sigue al marcador mientras se realiza pan o zoom en el mapa
+- La burbuja ajusta su posición para mantenerse visible dentro del viewport del mapa
+- Cuando se panea o se aplica zoom al mapa, la burbuja sigue al marcador
-### Posicionamiento Personalizado
+### Ubicación personalizada
-Aunque InfoBubble maneja el posicionamiento automáticamente, puede influir en él a través del ancla del icono del marcador:
+InfoBubble maneja la ubicación automáticamente, pero puedes influir en ella mediante el anclaje del icono del marcador:
-## Gestión del Ciclo de Vida
+## Administración del ciclo de vida
-La InfoBubble gestiona automáticamente su ciclo de vida:
+InfoBubble administra automáticamente su ciclo de vida:
-### Control Manual del Ciclo de Vida
+### Control manual del ciclo de vida
-## Estilo y Temas
+## Estilos y temas
-### Soporte de Modo Oscuro
+### Compatibilidad con modo oscuro
-### Tema Personalizado
+### Tema personalizado
-## Consideraciones de Rendimiento
+## Consideraciones de rendimiento
-### Actualizaciones Eficientes
+### Actualizaciones eficientes
-### Gestión de Memoria
+### Administración de memoria
-## Mejores Prácticas
+## InfoBubbleCustom
+
+Con `InfoBubbleCustom`, puedes dibujar libremente toda la burbuja, incluida su cola, como un Composable. `tailOffset` especifica qué punto dentro de la burbuja se usa como punto de conexión con el marcador mediante `Offset(0f..1f, 0f..1f)`.
+
+- `Offset(1f, 0.5f)`: Usar el centro derecho como punto de conexión
+- `Offset(0.5f, 1f)`: Usar el centro inferior como punto de conexión
+
+
+
+
+
+## Mejores prácticas
-### Directrices de Diseño
+### Guías de diseño
-1. **Contenido Conciso**: La InfoBubble debe proporcionar información esencial sin abrumar al usuario
-2. **Tamaño Apropiado**: Limitar el ancho de la burbuja para mantener la legibilidad en dispositivos móviles
-3. **Acciones Claras**: Si se incluyen botones, aclarar su propósito
-4. **Objetivos táctiles**: Asegurar que los elementos interactivos cumplan con los tamaños mínimos de objetivo táctil
+1. **Contenido conciso**: InfoBubble debe proporcionar información esencial sin abrumar al usuario
+2. **Tamaño adecuado**: Limita el ancho de la burbuja para mantener la legibilidad en dispositivos móviles
+3. **Acciones claras**: Si incluyes botones, deja claro su propósito
+4. **Objetivos táctiles**: Asegúrate de que los elementos interactivos cumplan con el tamaño mínimo de objetivo táctil
-### Experiencia del Usuario
+### Experiencia de usuario
-1. **Comportamiento de Cierre**: Permitir que los usuarios cierren la burbuja tocando el mapa o marcadores
-2. **Estado de Carga**: Mostrar un indicador de carga para contenido que requiere solicitudes de red
-3. **Manejo de Errores**: Manejar datos faltantes o inválidos apropiadamente
-4. **Accesibilidad**: Proporcionar descripciones de contenido para lectores de pantalla
+1. **Comportamiento de cierre**: Permite que los usuarios cierren la burbuja tocando el mapa o un marcador
+2. **Estados de carga**: Muestra un indicador de carga para el contenido que requiere solicitudes de red
+3. **Manejo de errores**: Maneja adecuadamente los datos faltantes o no válidos
+4. **Accesibilidad**: Proporciona descripciones del contenido para lectores de pantalla
-### Consejos de Implementación
+### Consejos de implementación
-## Solución de Problemas
+## Solución de problemas
-### Problemas Comunes
+### Problemas comunes
-1. **La burbuja no aparece**: Verificar que el marcador esté configurado correctamente y que la InfoBubble esté dentro de un MapViewScope
-2. **La burbuja no se cierra**: Verificar que el renderizado condicional responda adecuadamente a los cambios de estado
-3. **Degradación del rendimiento**: Limitar el número de burbujas mostradas simultáneamente y optimizar la composición del contenido
-4. **Problemas de diseño**: Usar restricciones de tamaño apropiadas y probar en diversos tamaños de pantalla
+1. **La burbuja no aparece**: Asegúrate de que el marcador esté configurado correctamente y de que InfoBubble esté dentro de MapViewScope
+2. **La burbuja no se cierra**: Verifica que el renderizado condicional responda correctamente a los cambios de estado
+3. **Bajo rendimiento**: Limita la cantidad de burbujas que se muestran al mismo tiempo y optimiza la composición del contenido
+4. **Problemas de layout**: Usa restricciones de tamaño adecuadas y prueba con distintos tamaños de pantalla
diff --git a/docs/src/content/docs/es-419/components/marker.mdx b/docs/src/content/docs/es-419/components/marker.mdx
index eb553f6e..a253f865 100644
--- a/docs/src/content/docs/es-419/components/marker.mdx
+++ b/docs/src/content/docs/es-419/components/marker.mdx
@@ -15,7 +15,7 @@ import CustomIconMarkerExample from '~/components/components/marker/CustomIconMa
import DraggableMarkerExample from '~/components/components/marker/DraggableMarkerExample.astro';
import DraggableMarkerWithStateExample from '~/components/components/marker/DraggableMarkerWithStateExample.astro';
import MultipleMarkersExample from '~/components/components/marker/MultipleMarkersExample.astro';
-import DefaultIconSignature from '~/components/components/marker/DefaultIconSignature.astro';
+import ColorDefaultIconSignature from '~/components/components/marker/ColorDefaultIconSignature.astro';
import DrawableDefaultIconSignature from '~/components/components/marker/DrawableDefaultIconSignature.astro';
import ImageIconSignature from '~/components/components/marker/ImageIconSignature.astro';
import MarkerAnimation from '~/components/components/marker/MarkerAnimation.astro';
@@ -67,7 +67,7 @@ Especificar `id` puede reducir Recomposiciones innecesarias.
Icono de marcador estándar con apariencia personalizable:
-
+
### DrawableDefaultIcon
diff --git a/docs/src/content/docs/es-419/core/mapcameraposition.mdx b/docs/src/content/docs/es-419/core/mapcameraposition.mdx
index 7d203e52..12c0586a 100644
--- a/docs/src/content/docs/es-419/core/mapcameraposition.mdx
+++ b/docs/src/content/docs/es-419/core/mapcameraposition.mdx
@@ -1,10 +1,10 @@
---
-title: MapCameraPositionInterface
+title: MapCameraPositionInterface (posición de cámara)
head:
- tag: meta
attrs:
name: description
- content: MapCameraPosition — configura centro, zoom, inclinación y orientación del mapa en MapConductor Android SDK.
+ content: MapCameraPosition - cómo configurar el centro, zoom, inclinación y orientación del mapa en MapConductor Android SDK
---
import MapCameraPositionInterface from '~/components/core/mapcameraposition/MapCameraPositionInterface.astro';
@@ -14,6 +14,8 @@ import CustomCameraPositionsExample from '~/components/core/mapcameraposition/Cu
import ZoomLevelsExample from '~/components/core/mapcameraposition/ZoomLevelsExample.astro';
import BearingExamples from '~/components/core/mapcameraposition/BearingExamples.astro';
import TiltExamples from '~/components/core/mapcameraposition/TiltExamples.astro';
+import NegativeTiltExample from '~/components/core/mapcameraposition/NegativeTiltExample.astro';
+import NegativeTiltSdkNote from '~/components/core/mapcameraposition/NegativeTiltSdkNote.astro';
import VisibleRegionDataClass from '~/components/core/mapcameraposition/VisibleRegionDataClass.astro';
import VisibleRegionExample from '~/components/core/mapcameraposition/VisibleRegionExample.astro';
import AnimatedCameraExample from '~/components/core/mapcameraposition/AnimatedCameraExample.astro';
@@ -22,7 +24,7 @@ import UserLocationCameraExample from '~/components/core/mapcameraposition/UserL
import ShowMultiplePointsExample from '~/components/core/mapcameraposition/ShowMultiplePointsExample.astro';
import NavigationCameraExample from '~/components/core/mapcameraposition/NavigationCameraExample.astro';
-`MapCameraPositionInterface` representa la posición, orientación y área visible de la cámara en el mapa. Define hacia dónde mira la cámara, cuánto mapa se ve y desde qué perspectiva.
+`MapCameraPositionInterface` representa la posición de vista de la cámara, su orientación y la región visible en el mapa. Define hacia dónde mira la cámara, qué parte del mapa se muestra y el punto de vista usado para mostrar el mapa.
## Interfaz e implementación
@@ -32,36 +34,36 @@ import NavigationCameraExample from '~/components/core/mapcameraposition/Navigat
### MapCameraPosition
-La implementación principal proporciona datos inmutables de la posición de la cámara:
+La implementación principal proporciona datos inmutables de posición de cámara:
## Propiedades
-### Posición de la cámara
+### Posición de cámara
-- **`position: GeoPointInterface`**: Punto geográfico central de la vista de la cámara.
-- **`zoom: Double`**: Nivel de zoom (aproximadamente alineado con la escala de Google Maps).
-- **`bearing: Double`**: Rumbo en grados (0 = norte, 90 = este).
-- **`tilt: Double`**: Ángulo de inclinación en grados (0 = vista cenital, 90 = horizontal).
+- **`position: GeoPointInterface`**: El punto central geográfico de la vista de la cámara
+- **`zoom: Double`**: El nivel de zoom (sigue aproximadamente la escala de Google Maps)
+- **`bearing: Double`**: La orientación de brújula en grados (0 = norte, 90 = este)
+- **`tilt: Double`**: El ángulo de inclinación de la cámara en grados (0 = vista vertical hacia abajo, 90 = horizontal)
-### Configuración de la vista
+### Configuración de vista
-- **`paddings: MapPaddingsInterface?`**: Márgenes del viewport que afectan a la región visible. **Nota: esta propiedad aún no funciona en v{BOM_MODULE_VERSION}**.
-- **`visibleRegion: VisibleRegion?`**: `(Solo lectura)` Límites geográficos que realmente se ven en pantalla.
+- **`paddings: MapPaddingsInterface?`**: Padding del viewport que afecta la región visible
+- **`visibleRegion: VisibleRegion?`**: `(solo lectura)` Los límites geográficos que realmente se muestran en pantalla
-## Formas de creación
+## Métodos de creación
-### Posición por defecto
+### Posición predeterminada
-
+
### Posición personalizada
-## Rumbo e inclinación
+## Orientación e inclinación
-### Rumbo (rotación)
+### Orientación (rotación)
-El rumbo rota el mapa alrededor del punto central:
+La orientación rota el mapa alrededor del punto central:
-### Inclinación (perspectiva 3D)
+### Inclinación (vista 3D)
-La inclinación proporciona ángulos de vista en 3D:
+La inclinación proporciona un ángulo de visualización 3D:
+#### Valores negativos de `tilt` - mirar hacia adelante
+
+Cuando `tilt` se establece en un valor negativo, la cámara usa una vista elevada que mira hacia arriba por encima del horizonte. Un tilt positivo se trata como una vista que mira hacia abajo al suelo, mientras que un tilt negativo se trata como una vista que mira hacia adelante en la dirección de `bearing`.
+
+
+
+
+
## Región visible
-La región visible describe el área geográfica real mostrada en pantalla teniendo en cuenta la posición de la cámara, el nivel de zoom, el rumbo, la inclinación y los márgenes del viewport.
+La región visible describe el área geográfica real que se muestra en pantalla después de considerar la posición de cámara, el nivel de zoom, la orientación, la inclinación y el padding del viewport.
### Clase VisibleRegion
### Propiedades
-- **`bounds: GeoRectBounds`**: Límites geográficos rectangulares que abarcan toda el área visible.
-- **`nearLeft: GeoPointInterface?`**: Coordenada geográfica de la esquina inferior izquierda de la región visible.
-- **`nearRight: GeoPointInterface?`**: Coordenada geográfica de la esquina inferior derecha.
-- **`farLeft: GeoPointInterface?`**: Coordenada geográfica de la esquina superior izquierda.
-- **`farRight: GeoPointInterface?`**: Coordenada geográfica de la esquina superior derecha.
+- **`bounds: GeoRectBounds`**: Límites geográficos del rectángulo que contiene toda la región visible. Este es el rectángulo delimitador más pequeño que contiene todo el contenido visible.
+- **`nearLeft: GeoPointInterface?`**: Coordenadas geográficas de la esquina inferior izquierda de la región visible. "near" se refiere al lado más cercano a la posición de la cámara.
+- **`nearRight: GeoPointInterface?`**: Coordenadas geográficas de la esquina inferior derecha de la región visible.
+- **`farLeft: GeoPointInterface?`**: Coordenadas geográficas de la esquina superior izquierda de la región visible. "far" se refiere al lado más lejano a la posición de la cámara.
+- **`farRight: GeoPointInterface?`**: Coordenadas geográficas de la esquina superior derecha de la región visible.
-### Uso de la región visible
+### Uso de VisibleRegion
@@ -168,12 +178,12 @@ La región visible describe el área geográfica real mostrada en pantalla tenie
-## Animación y transiciones
+## Animaciones y transiciones
### Movimiento suave de cámara
+
diff --git a/docs/src/content/docs/es-419/core/marker-icons.mdx b/docs/src/content/docs/es-419/core/marker-icons.mdx
index 42aff764..40bb24db 100644
--- a/docs/src/content/docs/es-419/core/marker-icons.mdx
+++ b/docs/src/content/docs/es-419/core/marker-icons.mdx
@@ -8,8 +8,8 @@ head:
---
import MarkerIconInterface from '~/components/core/marker-icons/MarkerIconInterface.astro';
-import DefaultIconSignature from '~/components/core/marker-icons/DefaultIconSignature.astro';
-import DefaultIconUsageExamples from '~/components/core/marker-icons/DefaultIconUsageExamples.astro';
+import ColorDefaultIconSignature from '~/components/core/marker-icons/ColorDefaultIconSignature.astro';
+import ColorDefaultIconUsageExamples from '~/components/core/marker-icons/ColorDefaultIconUsageExamples.astro';
import DrawableDefaultIconSignature from '~/components/core/marker-icons/DrawableDefaultIconSignature.astro';
import DrawableIconExamples from '~/components/core/marker-icons/DrawableIconExamples.astro';
import ImageDefaultIconSignature from '~/components/core/marker-icons/ImageDefaultIconSignature.astro';
@@ -31,13 +31,13 @@ Interfaz base para todos los iconos de marcador:
## Tipos de icono
-### DefaultMarkerIcon (ColorDefaultMarkerIcon)
+### ColorDefaultIcon(DefaultMarkerIcon)
Icono estándar de marcador coloreado con apariencia y texto personalizables.
> **Nota**: `DefaultMarkerIcon` es un alias de `ColorDefaultIcon`.
-
+
#### Parámetros
@@ -52,7 +52,7 @@ Icono estándar de marcador coloreado con apariencia y texto personalizables.
#### Ejemplos de uso
-
@@ -77,7 +77,7 @@ Usa un recurso `Drawable` como fondo del marcador, con superposiciones de estilo
commentForCustomBorder="Drawable con borde personalizado"
/>
-### ImageDefaultIcon
+### ImageColorDefaultIcon
Usa un drawable de imagen personalizado con control preciso del punto de anclaje.
diff --git a/docs/src/content/docs/es-419/event/event-handlers.mdx b/docs/src/content/docs/es-419/event/event-handlers.mdx
index 59ccd7ce..ae5169ac 100644
--- a/docs/src/content/docs/es-419/event/event-handlers.mdx
+++ b/docs/src/content/docs/es-419/event/event-handlers.mdx
@@ -4,7 +4,7 @@ head:
- tag: meta
attrs:
name: description
- content: Manejadores de eventos de mapa y superposiciones, incluidos onMapClick, onMarkerClick y onDragEnd en MapConductor Android SDK.
+ content: Manejadores de eventos de MapConductor Android SDK - eventos de mapa y overlays como onMapClick, onMarkerClick y onDragEnd
---
import MapViewEventHandlersSignature from '~/components/api/event-handlers/MapViewEventHandlersSignature.astro';
@@ -12,6 +12,8 @@ import OnMapLoadedSignature from '~/components/api/event-handlers/OnMapLoadedSig
import OnMapLoadedExample from '~/components/api/event-handlers/OnMapLoadedExample.astro';
import OnMapClickSignature from '~/components/api/event-handlers/OnMapClickSignature.astro';
import OnMapClickExample from '~/components/api/event-handlers/OnMapClickExample.astro';
+import OnMapLongClickSignature from '~/components/api/event-handlers/OnMapLongClickSignature.astro';
+import OnMapLongClickExample from '~/components/api/event-handlers/OnMapLongClickExample.astro';
import OnMarkerClickSignature from '~/components/api/event-handlers/OnMarkerClickSignature.astro';
import OnMarkerClickExample from '~/components/api/event-handlers/OnMarkerClickExample.astro';
import OnMarkerDragSignatures from '~/components/api/event-handlers/OnMarkerDragSignatures.astro';
@@ -24,8 +26,8 @@ import OnPolylineClickSignature from '~/components/api/event-handlers/OnPolyline
import PolylineEventDataClass from '~/components/api/event-handlers/PolylineEventDataClass.astro';
import OnPolylineClickExample from '~/components/api/event-handlers/OnPolylineClickExample.astro';
-MapConductor proporciona un sistema completo de manejo de eventos para las interacciones de usuario con el mapa y sus componentes.
-Los eventos del mapa se gestionan en el componente MapView, mientras que los eventos de overlays se configuran en sus State.
+MapConductor ofrece manejo integral de eventos para las interacciones del usuario con el mapa y sus componentes.
+Los eventos del mapa se manejan en el componente MapView, y los eventos de overlays se configuran en cada State.
@@ -33,58 +35,68 @@ Los eventos del mapa se gestionan en el componente MapView, mientras que los eve
### Inicialización del mapa
-- Se llama cuando el mapa ha terminado de cargarse y está listo para recibir interacciones.
+- Se llama cuando el mapa terminó de cargar y está listo para la interacción.
-- Ejemplo:
+- Ejemplo
-
+
-### Interacción con el mapa
+### Interacciones del mapa
-- Se llama cuando el usuario toca el mapa (pero no sobre un overlay).
+- Se llama cuando el usuario toca el mapa (una parte que no es un overlay).
-**Datos del evento**: `GeoPointInterface` – coordenadas geográficas donde se hizo tap.
+**Datos del evento**: `GeoPointInterface` - coordenadas geográficas tocadas
-- Ejemplo:
+- Ejemplo
-
+
-## Eventos de marcadores
+### onMapLongClick
-Todos los eventos de marcador reciben un objeto `MarkerState` con el estado actual del marcador.
+- Se llama cuando el usuario mantiene presionado el mapa (una parte que no es un overlay).
-### Eventos de clic
+
-- Se llama cuando el usuario toca un marcador.
+**Datos del evento**: `GeoPointInterface` - coordenadas geográficas mantenidas presionadas
-
+- Ejemplo
+
+
-**Datos del evento**: `MarkerState` – estado del marcador clicado.
+## Eventos de marcador
+
+Todos los eventos de marcador reciben un objeto `MarkerState` que contiene el estado actual del marcador.
+
+### Evento de clic
+
+- Se llama cuando se toca un marcador.
+
+
- Ejemplo
-
+
### Eventos de arrastre
-- `onDragStart`: se llama cuando el usuario comienza a arrastrar un marcador.
-- `onDrag`: se llama mientras el marcador se está arrastrando.
-- `onDragEnd`: se llama cuando el usuario suelta el marcador.
+- **`onDragStart`**: Se llama cuando inicia el arrastre
+- **`onDrag`**: Se llama continuamente durante el arrastre
+- **`onDragEnd`**: Se llama cuando termina el arrastre
### Eventos de animación
-- Se llama cuando comienza y termina una animación de marcador.
+- Se llama cuando las animaciones del marcador inician y terminan.
@@ -92,7 +104,7 @@ Todos los eventos de marcador reciben un objeto `MarkerState` con el estado actu
### Eventos de círculo
-- Se llama cuando el usuario toca un círculo.
+- Se llama cuando se toca un círculo.
@@ -102,11 +114,11 @@ Todos los eventos de marcador reciben un objeto `MarkerState` con el estado actu
- Ejemplo
-
+
### Eventos de polilínea
-- Se llama cuando el usuario toca una polilínea.
+- Se llama cuando se toca una polilínea.
@@ -116,4 +128,4 @@ Todos los eventos de marcador reciben un objeto `MarkerState` con el estado actu
- Ejemplo
-
+
diff --git a/docs/src/content/docs/es-419/experimental/geojson-layer.mdx b/docs/src/content/docs/es-419/experimental/geojson-layer.mdx
new file mode 100644
index 00000000..7542222b
--- /dev/null
+++ b/docs/src/content/docs/es-419/experimental/geojson-layer.mdx
@@ -0,0 +1,101 @@
+---
+title: Capa GeoJSON
+head:
+ - tag: meta
+ attrs:
+ name: description
+ content: Capa GeoJSON de MapConductor Android SDK - módulo para mostrar datos GeoJSON con cualquier proveedor de mapas
+---
+
+import GeoJSONLayerInstall from '~/components/experimental/geojson/GeoJSONLayerInstall.astro';
+import GeoJSONLayerSignature from '~/components/experimental/geojson/GeoJSONLayerSignature.astro';
+import GeoJSONLayerStateSignature from '~/components/experimental/geojson/GeoJSONLayerStateSignature.astro';
+import GeoJSONFeatureSignature from '~/components/experimental/geojson/GeoJSONFeatureSignature.astro';
+import GeoJSONGeometryTypes from '~/components/experimental/geojson/GeoJSONGeometryTypes.astro';
+import GeoJSONParserSignature from '~/components/experimental/geojson/GeoJSONParserSignature.astro';
+import GeoJSONBasicExample from '~/components/experimental/geojson/GeoJSONBasicExample.astro';
+import GeoJSONParserExample from '~/components/experimental/geojson/GeoJSONParserExample.astro';
+import GeoJSONClickExample from '~/components/experimental/geojson/GeoJSONClickExample.astro';
+import GeoJSONFeatureStateExample from '~/components/experimental/geojson/GeoJSONFeatureStateExample.astro';
+import GeoJSONStyleExample from '~/components/experimental/geojson/GeoJSONStyleExample.astro';
+
+`android-geojson-layer` es un módulo independiente para mostrar datos GeoJSON sin depender de la implementación del mapa.
+Como se renderiza como una capa ráster basada en mosaicos, puede usarse con cualquier SDK de mapas, incluidos Google Maps, Mapbox, MapLibre, ArcGIS y HERE.
+
+## Instalación
+
+
+
+## Uso básico
+
+Crea una lista de objetos `GeoJSONFeature` y pásala a `GeoJSONLayer` dentro del bloque content de cualquier `MapView`.
+
+
+
+## Referencia de API
+
+### Composable GeoJSONLayer
+
+
+
+- **`state`**: El `GeoJSONLayerState` que administra el estado de visualización, los estilos y el manejo de clics de la capa.
+- **`features`**: Una lista de objetos `GeoJSONFeature` para renderizar como datos estáticos o por lote.
+- **`tileSize`**: El tamaño de mosaico de la capa ráster.
+- **`disableTileServerCache`**: Especifica si se deshabilita la caché del lado del servidor de mosaicos.
+- **`content`**: Un bloque para colocar features que funcionan con el estado de Compose, como `GeoJSONFeatureState`.
+
+### GeoJSONLayerState
+
+
+
+`processClick(geoPoint)` se llama desde el manejador de clics del mapa para ejecutar hit testing de features. Cuando se encuentra una feature objetivo, llama a `onClick` y devuelve `true`.
+
+### Parámetros de GeoJSONLayerState
+
+- **`opacity`**: La opacidad de toda la capa.
+- **`strokeColor`**: El color predeterminado de líneas y contornos de polígonos.
+- **`fillColor`**: El color predeterminado de relleno de polígonos.
+- **`strokeWidth`**: El valor predeterminado del ancho de línea.
+- **`pointRadius`**: El radio predeterminado para Point / MultiPoint.
+- **`visible`**: Especifica si la capa está visible.
+- **`minZoom`**: El nivel de zoom mínimo en el que se muestra la capa.
+- **`maxZoom`**: El nivel de zoom máximo en el que se muestra la capa.
+- **`onClick`**: Callback que se invoca cuando el hit testing encuentra una feature.
+
+### GeoJSONFeature
+
+
+
+`GeoJSONFeature` es adecuado para datos estáticos o datos cargados por lote. Al renderizar datasets grandes, es más eficiente pasar los datos al parámetro `features` de `GeoJSONLayer`.
+
+## Tipos de geometría
+
+
+
+En `Polygon`, `rings[0]` se trata como el anillo exterior y `rings[1..]` como huecos. Usa `LonLat(longitude, latitude)` para especificar coordenadas.
+
+## Parseo de archivos grandes
+
+`GeoJSONParser` proporciona un método para parsear un InputStream completo de una vez y también parseo en streaming que procesa una feature a la vez.
+
+
+
+
+
+## Eventos de clic / hit testing
+
+Llamar a `GeoJSONLayerState.processClick()` desde el manejador `onMapClick` de `MapView` permite encontrar features GeoJSON en la posición tocada.
+
+
+
+## Features reactivas (GeoJSONFeatureState)
+
+`GeoJSONFeatureState` es una feature que se coloca dentro del bloque `content` de `GeoJSONLayer` y admite actualizaciones de estado de Compose. Es útil para una pequeña cantidad de features que cambian con frecuencia, pero para datasets grandes se recomienda pasar objetos `GeoJSONFeature` mediante el parámetro `features`.
+
+
+
+## Personalización de estilos
+
+Los estilos predeterminados de toda la capa pueden especificarse con `GeoJSONLayerState`. Si se configura `strokeColor` o `fillColor` en una `GeoJSONFeature` individual, el estilo específico de esa feature tiene prioridad.
+
+
diff --git a/docs/src/content/docs/es-419/mapviewholder/arcgis-2d.mdx b/docs/src/content/docs/es-419/mapviewholder/arcgis-2d.mdx
new file mode 100644
index 00000000..bbdbea98
--- /dev/null
+++ b/docs/src/content/docs/es-419/mapviewholder/arcgis-2d.mdx
@@ -0,0 +1,57 @@
+---
+title: ArcGISMapView2D (vista plana 2D)
+head:
+ - tag: meta
+ attrs:
+ name: description
+ content: ArcGISMapView2D de MapConductor Android SDK - Composable de vista de mapa plana 2D de ArcGIS
+---
+
+import ArcGISMapView2DSignature from '~/components/api/mapviewholder/ArcGISMapView2DSignature.astro';
+import ArcGISMapView2DVsArcGISMapView from '~/components/api/mapviewholder/ArcGISMapView2DVsArcGISMapView.astro';
+import ArcGISMapView2DBasicExample from '~/components/api/mapviewholder/ArcGISMapView2DBasicExample.astro';
+
+`ArcGISMapView2D` es un Composable que muestra una vista de mapa plana 2D de ArcGIS.
+Mientras que el `ArcGISMapView` estándar se basa en un `SceneView` 3D, `ArcGISMapView2D` usa el `MapView` 2D de ArcGIS.
+
+## Descripción general
+
+Úsalo cuando necesites un mapa de ArcGIS especializado para visualización 2D. `ArcGISMapViewState` puede compartirse con el `ArcGISMapView` estándar y se crea con `rememberArcGISMapViewState()`.
+
+## Firma del Composable
+
+`ArcGISMapView2D` se proporciona en el módulo `android-for-arcgis`.
+
+
+
+## Diferencias con ArcGISMapView
+
+
+
+- Usa un `MapView` 2D en lugar de un `SceneView` 3D
+- `tilt` siempre queda fijo en `0`, por lo que no hay inclinación 3D
+- No muestra edificios 3D ni otro contenido 3D
+- Está especializado para mapas 2D y es liviano para pantallas que no necesitan visualización 3D
+- `ArcGISMapViewState` puede compartirse con el `ArcGISMapView` estándar
+
+## Uso básico
+
+
+
+## Parámetros
+
+- **`state`**: `ArcGISMapViewState`. Mantiene la posición de cámara, el diseño del mapa, el controlador y otros estados.
+- **`modifier`**: `Modifier` de Compose. Se usa para ajustes de layout como tamaño, márgenes y fondo.
+- **`markerTiling`**: `MarkerTilingOptions?`. Configuración de visualización de marcadores basada en mosaicos.
+- **`sdkInitialize`**: Función suspend usada para reemplazar el proceso de inicialización del SDK de ArcGIS.
+- **`onMapLoaded`**: Se llama cuando el mapa terminó de cargar.
+- **`onCameraMoveStart`**: Se llama cuando inicia el movimiento de la cámara.
+- **`onCameraMove`**: Se llama mientras la cámara se mueve.
+- **`onCameraMoveEnd`**: Se llama cuando termina el movimiento de la cámara.
+- **`onMapClick`**: Se llama cuando el usuario toca una parte del mapa que no es un overlay.
+- **`onMapLongClick`**: Se llama cuando el usuario mantiene presionada una parte del mapa que no es un overlay.
+- **`content`**: Bloque Composable de `ArcGISMapViewScope` para colocar contenido del mapa, como marcadores, polilíneas y polígonos.
+
+## Notas
+
+En `ArcGISMapView2D`, `tilt` siempre queda fijo en `0`. Aunque se especifique `tilt` en `MapCameraPosition`, el `MapView` 2D lo ignora y no se realiza visualización 3D ni visualización tridimensional de edificios.
diff --git a/docs/src/content/docs/event/event-handlers.mdx b/docs/src/content/docs/event/event-handlers.mdx
index 442e1098..deb20065 100644
--- a/docs/src/content/docs/event/event-handlers.mdx
+++ b/docs/src/content/docs/event/event-handlers.mdx
@@ -4,7 +4,7 @@ head:
- tag: meta
attrs:
name: description
- content: Map and overlay event handlers including onMapClick, onMarkerClick, and onDragEnd in MapConductor Android SDK.
+ content: MapConductor Android SDK event handlers - map and overlay events such as onMapClick, onMarkerClick, and onDragEnd
---
import MapViewEventHandlersSignature from '~/components/api/event-handlers/MapViewEventHandlersSignature.astro';
@@ -12,6 +12,8 @@ import OnMapLoadedSignature from '~/components/api/event-handlers/OnMapLoadedSig
import OnMapLoadedExample from '~/components/api/event-handlers/OnMapLoadedExample.astro';
import OnMapClickSignature from '~/components/api/event-handlers/OnMapClickSignature.astro';
import OnMapClickExample from '~/components/api/event-handlers/OnMapClickExample.astro';
+import OnMapLongClickSignature from '~/components/api/event-handlers/OnMapLongClickSignature.astro';
+import OnMapLongClickExample from '~/components/api/event-handlers/OnMapLongClickExample.astro';
import OnMarkerClickSignature from '~/components/api/event-handlers/OnMarkerClickSignature.astro';
import OnMarkerClickExample from '~/components/api/event-handlers/OnMarkerClickExample.astro';
import OnMarkerDragSignatures from '~/components/api/event-handlers/OnMarkerDragSignatures.astro';
@@ -25,7 +27,7 @@ import PolylineEventDataClass from '~/components/api/event-handlers/PolylineEven
import OnPolylineClickExample from '~/components/api/event-handlers/OnPolylineClickExample.astro';
MapConductor provides comprehensive event handling for user interactions with the map and its components.
-Map events are handled through the MapView component, while overlay events are configured on their State objects.
+Map events are handled on the MapView component, and overlay events are configured on each State.
@@ -41,23 +43,35 @@ Map events are handled through the MapView component, while overlay events are c
-### Map Interaction
+### Map Interactions
-- Called when the user taps on the map (not on any overlay).
+- Called when the user taps the map (an area that is not an overlay).
-**Event Data**: `GeoPointInterface` - the geographic coordinates of the tap
+**Event data**: `GeoPointInterface` - geographic coordinate that was tapped
- Example
+### onMapLongClick
+
+- Called when the user long-presses the map (an area that is not an overlay).
+
+
+
+**Event data**: `GeoPointInterface` - geographic coordinate that was long-pressed
+
+- Example
+
+
+
## Marker Events
-All marker events receive a `MarkerState` object containing the marker's current state.
+All marker events receive a `MarkerState` object that contains the marker's current state.
-### Click Events
+### Click Event
- Called when a marker is tapped.
@@ -69,8 +83,8 @@ All marker events receive a `MarkerState` object containing the marker's current
### Drag Events
-- **`onDragStart`**: Called when dragging begins
-- **`onDrag`**: Called continuously during dragging
+- **`onDragStart`**: Called when dragging starts
+- **`onDrag`**: Called continuously while dragging
- **`onDragEnd`**: Called when dragging ends
@@ -94,11 +108,11 @@ All marker events receive a `MarkerState` object containing the marker's current
-**Event Data**: `CircleEvent`
+**Event data**: `CircleEvent`
-- example
+- Example
@@ -108,10 +122,10 @@ All marker events receive a `MarkerState` object containing the marker's current
-**Event Data**: `PolylineEvent`
+**Event data**: `PolylineEvent`
-- example
+- Example
diff --git a/docs/src/content/docs/experimental/geojson-layer.mdx b/docs/src/content/docs/experimental/geojson-layer.mdx
new file mode 100644
index 00000000..879f4583
--- /dev/null
+++ b/docs/src/content/docs/experimental/geojson-layer.mdx
@@ -0,0 +1,101 @@
+---
+title: GeoJSON Layer
+head:
+ - tag: meta
+ attrs:
+ name: description
+ content: MapConductor Android SDK GeoJSON layer - a module for displaying GeoJSON data with any map provider
+---
+
+import GeoJSONLayerInstall from '~/components/experimental/geojson/GeoJSONLayerInstall.astro';
+import GeoJSONLayerSignature from '~/components/experimental/geojson/GeoJSONLayerSignature.astro';
+import GeoJSONLayerStateSignature from '~/components/experimental/geojson/GeoJSONLayerStateSignature.astro';
+import GeoJSONFeatureSignature from '~/components/experimental/geojson/GeoJSONFeatureSignature.astro';
+import GeoJSONGeometryTypes from '~/components/experimental/geojson/GeoJSONGeometryTypes.astro';
+import GeoJSONParserSignature from '~/components/experimental/geojson/GeoJSONParserSignature.astro';
+import GeoJSONBasicExample from '~/components/experimental/geojson/GeoJSONBasicExample.astro';
+import GeoJSONParserExample from '~/components/experimental/geojson/GeoJSONParserExample.astro';
+import GeoJSONClickExample from '~/components/experimental/geojson/GeoJSONClickExample.astro';
+import GeoJSONFeatureStateExample from '~/components/experimental/geojson/GeoJSONFeatureStateExample.astro';
+import GeoJSONStyleExample from '~/components/experimental/geojson/GeoJSONStyleExample.astro';
+
+`android-geojson-layer` is a standalone module for displaying GeoJSON data independently of any map implementation.
+Because it is rendered as a tile-based raster layer, it can be used with any map SDK, including Google Maps, Mapbox, MapLibre, ArcGIS, and HERE.
+
+## Installation
+
+
+
+## Basic Usage
+
+Create a list of `GeoJSONFeature` objects and pass it to `GeoJSONLayer` inside the content block of any `MapView`.
+
+
+
+## API Reference
+
+### GeoJSONLayer Composable
+
+
+
+- **`state`**: The `GeoJSONLayerState` that manages the layer's display state, styles, and click handling.
+- **`features`**: A list of `GeoJSONFeature` objects to render as static or batch data.
+- **`tileSize`**: The tile size for the raster layer.
+- **`disableTileServerCache`**: Specifies whether to disable server-side tile caching.
+- **`content`**: A block for placing features that work with Compose state, such as `GeoJSONFeatureState`.
+
+### GeoJSONLayerState
+
+
+
+`processClick(geoPoint)` is called from the map click handler to run feature hit testing. When a target feature is found, it calls `onClick` and returns `true`.
+
+### GeoJSONLayerState Parameters
+
+- **`opacity`**: The opacity of the entire layer.
+- **`strokeColor`**: The default color for lines and polygon outlines.
+- **`fillColor`**: The default polygon fill color.
+- **`strokeWidth`**: The default stroke width.
+- **`pointRadius`**: The default radius for Point / MultiPoint.
+- **`visible`**: Specifies whether the layer is visible.
+- **`minZoom`**: The minimum zoom level at which the layer is displayed.
+- **`maxZoom`**: The maximum zoom level at which the layer is displayed.
+- **`onClick`**: A callback invoked when hit testing finds a feature.
+
+### GeoJSONFeature
+
+
+
+`GeoJSONFeature` is suitable for static data or batch-loaded data. When rendering large datasets, it is more efficient to pass data to the `features` parameter of `GeoJSONLayer`.
+
+## Geometry Types
+
+
+
+For `Polygon`, `rings[0]` is treated as the outer ring and `rings[1..]` as holes. Use `LonLat(longitude, latitude)` to specify coordinates.
+
+## Parsing Large Files
+
+`GeoJSONParser` provides both a method for parsing an entire InputStream at once and streaming parsing that processes one feature at a time.
+
+
+
+
+
+## Click Events / Hit Testing
+
+Calling `GeoJSONLayerState.processClick()` from the `onMapClick` handler of `MapView` lets you find GeoJSON features at the tapped position.
+
+
+
+## Reactive Features (GeoJSONFeatureState)
+
+`GeoJSONFeatureState` is a feature placed inside the `content` block of `GeoJSONLayer` that supports Compose state updates. It is useful for a small number of frequently changing features, but for large datasets, passing `GeoJSONFeature` objects through the `features` parameter is recommended.
+
+
+
+## Style Customization
+
+Default styles for the entire layer can be specified with `GeoJSONLayerState`. If `strokeColor` or `fillColor` is set on an individual `GeoJSONFeature`, that feature-specific style takes precedence.
+
+
diff --git a/docs/src/content/docs/ja/components/infobubble.mdx b/docs/src/content/docs/ja/components/infobubble.mdx
index fc2cf52b..fe59d8d0 100644
--- a/docs/src/content/docs/ja/components/infobubble.mdx
+++ b/docs/src/content/docs/ja/components/infobubble.mdx
@@ -11,6 +11,10 @@ import SimpleInfoBubbleExample from '~/components/components/infobubble/SimpleIn
import RichContentInfoBubbleExample from '~/components/components/infobubble/RichContentInfoBubbleExample.astro';
import InteractiveBubbleExample from '~/components/components/infobubble/InteractiveBubbleExample.astro';
import InfoBubbleSignature from '~/components/components/infobubble/InfoBubbleSignature.astro';
+import StandaloneInfoBubbleSignature from '~/components/components/infobubble/StandaloneInfoBubbleSignature.astro';
+import StandaloneInfoBubbleExample from '~/components/components/infobubble/StandaloneInfoBubbleExample.astro';
+import InfoBubbleCustomSignature from '~/components/components/infobubble/InfoBubbleCustomSignature.astro';
+import InfoBubbleCustomExample from '~/components/components/infobubble/InfoBubbleCustomExample.astro';
import MultipleBubblesExample from '~/components/components/infobubble/MultipleBubblesExample.astro';
import CustomPositioningExample from '~/components/components/infobubble/CustomPositioningExample.astro';
import LifecycleManagementExample from '~/components/components/infobubble/LifecycleManagementExample.astro';
@@ -43,6 +47,18 @@ InfoBubble は、特定のマーカーの上に表示されます。InfoBubble
- **`tailSize`**: マーカーを指す吹き出しの尾のサイズ(デフォルト: 8dp)
- **`content`**: バブル内に表示する Composable コンテンツ
+## マーカー不要の配置
+
+`InfoBubble` は `MarkerState` に紐付けず、地図上の任意の `GeoPoint` に直接配置することもできます。`position` が変更されるとバブルも移動し、地図のパンやズームにも追従します。
+
+
+
+
+
## 基本的な使用方法
### シンプルなテキストバブル
@@ -186,6 +202,20 @@ InfoBubble は自動的にライフサイクルを管理します:
+## InfoBubbleCustom
+
+`InfoBubbleCustom` を使うと、尾を含む吹き出し全体を Composable として自由に描画できます。`tailOffset` には、バブル内のどの点をマーカーとの接続点にするかを `Offset(0f..1f, 0f..1f)` で指定します。
+
+- `Offset(1f, 0.5f)`: 右側中央を接続点にする
+- `Offset(0.5f, 1f)`: 下中央を接続点にする
+
+
+
+
+
## ベストプラクティス
### デザインガイドライン
diff --git a/docs/src/content/docs/ja/components/marker.mdx b/docs/src/content/docs/ja/components/marker.mdx
index f63a60f0..9d86ff39 100644
--- a/docs/src/content/docs/ja/components/marker.mdx
+++ b/docs/src/content/docs/ja/components/marker.mdx
@@ -15,7 +15,7 @@ import CustomIconMarkerExample from '~/components/components/marker/CustomIconMa
import DraggableMarkerExample from '~/components/components/marker/DraggableMarkerExample.astro';
import DraggableMarkerWithStateExample from '~/components/components/marker/DraggableMarkerWithStateExample.astro';
import MultipleMarkersExample from '~/components/components/marker/MultipleMarkersExample.astro';
-import DefaultIconSignature from '~/components/components/marker/DefaultIconSignature.astro';
+import ColorDefaultIconSignature from '~/components/components/marker/ColorDefaultIconSignature.astro';
import DrawableDefaultIconSignature from '~/components/components/marker/DrawableDefaultIconSignature.astro';
import ImageIconSignature from '~/components/components/marker/ImageIconSignature.astro';
import MarkerAnimation from '~/components/components/marker/MarkerAnimation.astro';
@@ -70,7 +70,7 @@ Marker は、特定の地理位置に配置できるポイント型の注釈で
外観をカスタマイズできる標準的なマーカーアイコン:
-
+
### DrawableDefaultIcon
diff --git a/docs/src/content/docs/ja/core/mapcameraposition.mdx b/docs/src/content/docs/ja/core/mapcameraposition.mdx
index 971ab411..fbc479bd 100644
--- a/docs/src/content/docs/ja/core/mapcameraposition.mdx
+++ b/docs/src/content/docs/ja/core/mapcameraposition.mdx
@@ -14,6 +14,8 @@ import CustomCameraPositionsExample from '~/components/core/mapcameraposition/Cu
import ZoomLevelsExample from '~/components/core/mapcameraposition/ZoomLevelsExample.astro';
import BearingExamples from '~/components/core/mapcameraposition/BearingExamples.astro';
import TiltExamples from '~/components/core/mapcameraposition/TiltExamples.astro';
+import NegativeTiltExample from '~/components/core/mapcameraposition/NegativeTiltExample.astro';
+import NegativeTiltSdkNote from '~/components/core/mapcameraposition/NegativeTiltSdkNote.astro';
import VisibleRegionDataClass from '~/components/core/mapcameraposition/VisibleRegionDataClass.astro';
import VisibleRegionExample from '~/components/core/mapcameraposition/VisibleRegionExample.astro';
import AnimatedCameraExample from '~/components/core/mapcameraposition/AnimatedCameraExample.astro';
@@ -133,6 +135,14 @@ MapConductor のズームレベルは、おおよそ Google Maps のスケール
streetLevelComment="ストリートレベルの最大傾斜"
/>
+#### 負の tilt 値 — 前方を見る
+
+`tilt` にマイナス値を指定すると、水平線より上方を向く仰角ビューになります。正の tilt は地面を見下ろす視点、負の tilt は `bearing` 方向の前方を見る視点として扱われます。
+
+
+
+
+
## 可視領域
可視領域は、カメラ位置、ズームレベル、方位角、傾き、およびビューポートのパディングを考慮した後、画面上に表示される実際の地理的エリアを記述します。
diff --git a/docs/src/content/docs/ja/core/marker-icons.mdx b/docs/src/content/docs/ja/core/marker-icons.mdx
index ecad07a2..281de641 100644
--- a/docs/src/content/docs/ja/core/marker-icons.mdx
+++ b/docs/src/content/docs/ja/core/marker-icons.mdx
@@ -8,8 +8,8 @@ head:
---
import MarkerIconInterface from '~/components/core/marker-icons/MarkerIconInterface.astro';
-import DefaultIconSignature from '~/components/core/marker-icons/DefaultIconSignature.astro';
-import DefaultIconUsageExamples from '~/components/core/marker-icons/DefaultIconUsageExamples.astro';
+import ColorDefaultIconSignature from '~/components/core/marker-icons/ColorDefaultIconSignature.astro';
+import ColorDefaultIconUsageExamples from '~/components/core/marker-icons/ColorDefaultIconUsageExamples.astro';
import DrawableDefaultIconSignature from '~/components/core/marker-icons/DrawableDefaultIconSignature.astro';
import DrawableIconExamples from '~/components/core/marker-icons/DrawableIconExamples.astro';
import ImageDefaultIconSignature from '~/components/core/marker-icons/ImageDefaultIconSignature.astro';
@@ -31,13 +31,13 @@ MapConductor は、地図上のマーカーの外観をカスタマイズする
## アイコンタイプ
-### DefaultMarkerIcon (ColorDefaultIcon)
+### ColorDefaultIcon(DefaultMarkerIcon)
カスタマイズ可能な外観とテキストラベルを持つ標準的な色付きマーカーアイコンです。
> **注意**: `DefaultMarkerIcon` は `ColorDefaultIcon` のエイリアスです。
-
+
#### パラメータ
@@ -52,7 +52,7 @@ MapConductor は、地図上のマーカーの外観をカスタマイズする
#### 使用例
-
@@ -77,7 +77,7 @@ MapConductor は、地図上のマーカーの外観をカスタマイズする
commentForCustomBorder="カスタムボーダー付きドローアブル"
/>
-### ImageDefaultIcon
+### ImageColorDefaultIcon
正確なアンカー位置制御を持つカスタム画像ドローアブルを使用します。
diff --git a/docs/src/content/docs/ja/event/event-handlers.mdx b/docs/src/content/docs/ja/event/event-handlers.mdx
index 476ae1d6..fd3f9393 100644
--- a/docs/src/content/docs/ja/event/event-handlers.mdx
+++ b/docs/src/content/docs/ja/event/event-handlers.mdx
@@ -12,6 +12,8 @@ import OnMapLoadedSignature from '~/components/api/event-handlers/OnMapLoadedSig
import OnMapLoadedExample from '~/components/api/event-handlers/OnMapLoadedExample.astro';
import OnMapClickSignature from '~/components/api/event-handlers/OnMapClickSignature.astro';
import OnMapClickExample from '~/components/api/event-handlers/OnMapClickExample.astro';
+import OnMapLongClickSignature from '~/components/api/event-handlers/OnMapLongClickSignature.astro';
+import OnMapLongClickExample from '~/components/api/event-handlers/OnMapLongClickExample.astro';
import OnMarkerClickSignature from '~/components/api/event-handlers/OnMarkerClickSignature.astro';
import OnMarkerClickExample from '~/components/api/event-handlers/OnMarkerClickExample.astro';
import OnMarkerDragSignatures from '~/components/api/event-handlers/OnMarkerDragSignatures.astro';
@@ -53,6 +55,18 @@ MapConductor は、マップとそのコンポーネントに対するユーザ
+### onMapLongClick
+
+- ユーザーがマップ(オーバーレイではない部分)を長押ししたときに呼び出されます。
+
+
+
+**イベントデータ**: `GeoPointInterface` - 長押しされた地理座標
+
+- 例
+
+
+
## マーカーイベント
すべてのマーカーイベントは、マーカーの現在の状態を含む `MarkerState` オブジェクトを受け取ります。
diff --git a/docs/src/content/docs/ja/experimental/geojson-layer.mdx b/docs/src/content/docs/ja/experimental/geojson-layer.mdx
new file mode 100644
index 00000000..08df18c7
--- /dev/null
+++ b/docs/src/content/docs/ja/experimental/geojson-layer.mdx
@@ -0,0 +1,101 @@
+---
+title: GeoJSON レイヤー
+head:
+ - tag: meta
+ attrs:
+ name: description
+ content: MapConductor Android SDKのGeoJSONレイヤー — 任意の地図プロバイダでGeoJSONデータを表示するモジュール
+---
+
+import GeoJSONLayerInstall from '~/components/experimental/geojson/GeoJSONLayerInstall.astro';
+import GeoJSONLayerSignature from '~/components/experimental/geojson/GeoJSONLayerSignature.astro';
+import GeoJSONLayerStateSignature from '~/components/experimental/geojson/GeoJSONLayerStateSignature.astro';
+import GeoJSONFeatureSignature from '~/components/experimental/geojson/GeoJSONFeatureSignature.astro';
+import GeoJSONGeometryTypes from '~/components/experimental/geojson/GeoJSONGeometryTypes.astro';
+import GeoJSONParserSignature from '~/components/experimental/geojson/GeoJSONParserSignature.astro';
+import GeoJSONBasicExample from '~/components/experimental/geojson/GeoJSONBasicExample.astro';
+import GeoJSONParserExample from '~/components/experimental/geojson/GeoJSONParserExample.astro';
+import GeoJSONClickExample from '~/components/experimental/geojson/GeoJSONClickExample.astro';
+import GeoJSONFeatureStateExample from '~/components/experimental/geojson/GeoJSONFeatureStateExample.astro';
+import GeoJSONStyleExample from '~/components/experimental/geojson/GeoJSONStyleExample.astro';
+
+`android-geojson-layer` は、地図実装に依存せず GeoJSON データを表示するための独立モジュールです。
+タイルベースのラスターレイヤーとして描画するため、Google Maps、Mapbox、MapLibre、ArcGIS、HERE など、任意の地図 SDK で使用できます。
+
+## インストール
+
+
+
+## 基本的な使い方
+
+`GeoJSONFeature` のリストを作成し、任意の `MapView` の content ブロック内で `GeoJSONLayer` に渡します。
+
+
+
+## API リファレンス
+
+### GeoJSONLayer Composable
+
+
+
+- **`state`**: レイヤーの表示状態、スタイル、クリック処理を管理する `GeoJSONLayerState` です。
+- **`features`**: 静的または一括データとして描画する `GeoJSONFeature` のリストです。
+- **`tileSize`**: ラスターレイヤーのタイルサイズです。
+- **`disableTileServerCache`**: タイルサーバー側のキャッシュを無効化するかどうかを指定します。
+- **`content`**: `GeoJSONFeatureState` など、Compose の状態と連動するフィーチャを配置するブロックです。
+
+### GeoJSONLayerState
+
+
+
+`processClick(geoPoint)` は、マップのクリックハンドラから呼び出してフィーチャのヒットテストを実行します。対象フィーチャが見つかると `onClick` を呼び出し、`true` を返します。
+
+### GeoJSONLayerState パラメータ
+
+- **`opacity`**: レイヤー全体の不透明度です。
+- **`strokeColor`**: 線やポリゴン外周のデフォルト色です。
+- **`fillColor`**: ポリゴン塗りつぶしのデフォルト色です。
+- **`strokeWidth`**: 線幅のデフォルト値です。
+- **`pointRadius`**: Point / MultiPoint の半径のデフォルト値です。
+- **`visible`**: レイヤーを表示するかどうかを指定します。
+- **`minZoom`**: レイヤーを表示する最小ズームレベルです。
+- **`maxZoom`**: レイヤーを表示する最大ズームレベルです。
+- **`onClick`**: ヒットテストでフィーチャが見つかったときに呼び出されるコールバックです。
+
+### GeoJSONFeature
+
+
+
+`GeoJSONFeature` は静的データや一括ロードしたデータに適しています。大量データを描画する場合は、`GeoJSONLayer` の `features` パラメータに渡す方法が効率的です。
+
+## ジオメトリタイプ
+
+
+
+`Polygon` の `rings[0]` は外周、`rings[1..]` は穴として扱われます。座標指定には `LonLat(longitude, latitude)` を使用します。
+
+## 大容量ファイルのパース
+
+`GeoJSONParser` は、InputStream 全体を一括でパースする方法と、1フィーチャずつ処理するストリームパースを提供します。
+
+
+
+
+
+## クリックイベント / ヒットテスト
+
+`GeoJSONLayerState.processClick()` を `MapView` の `onMapClick` から呼び出すと、タップ位置にある GeoJSON フィーチャを検索できます。
+
+
+
+## リアクティブフィーチャ(GeoJSONFeatureState)
+
+`GeoJSONFeatureState` は `GeoJSONLayer` の `content` ブロック内に配置する、Compose の状態更新に対応したフィーチャです。頻繁に変化する少数のフィーチャには便利ですが、大量データには `features` パラメータで `GeoJSONFeature` を渡す方法を推奨します。
+
+
+
+## スタイルカスタマイズ
+
+レイヤー全体のデフォルトスタイルは `GeoJSONLayerState` で指定できます。個別の `GeoJSONFeature` に `strokeColor` や `fillColor` を設定した場合は、そのフィーチャ固有のスタイルが優先されます。
+
+
diff --git a/docs/src/content/docs/ja/mapviewholder/arcgis-2d.mdx b/docs/src/content/docs/ja/mapviewholder/arcgis-2d.mdx
new file mode 100644
index 00000000..7ebaaf23
--- /dev/null
+++ b/docs/src/content/docs/ja/mapviewholder/arcgis-2d.mdx
@@ -0,0 +1,57 @@
+---
+title: ArcGISMapView2D(2D フラットビュー)
+head:
+ - tag: meta
+ attrs:
+ name: description
+ content: MapConductor Android SDKのArcGISMapView2D — ArcGISの2DフラットマップビューComposable
+---
+
+import ArcGISMapView2DSignature from '~/components/api/mapviewholder/ArcGISMapView2DSignature.astro';
+import ArcGISMapView2DVsArcGISMapView from '~/components/api/mapviewholder/ArcGISMapView2DVsArcGISMapView.astro';
+import ArcGISMapView2DBasicExample from '~/components/api/mapviewholder/ArcGISMapView2DBasicExample.astro';
+
+`ArcGISMapView2D` は ArcGIS の 2D フラット地図ビューを表示する Composable です。
+通常の `ArcGISMapView` が 3D `SceneView` ベースであるのに対し、`ArcGISMapView2D` は ArcGIS の 2D `MapView` を使用します。
+
+## 概要
+
+2D 表示に特化した ArcGIS マップが必要な場合に使用します。`ArcGISMapViewState` は通常の `ArcGISMapView` と共用でき、`rememberArcGISMapViewState()` で生成します。
+
+## Composable シグネチャ
+
+`ArcGISMapView2D` は `android-for-arcgis` モジュールで提供されます。
+
+
+
+## ArcGISMapView との違い
+
+
+
+- 3D `SceneView` の代わりに 2D `MapView` を使用します
+- `tilt` は常に `0` に固定され、3D 傾斜はありません
+- 建物などの 3D 表示は行いません
+- 2D マップに特化しており、3D 表示が不要な画面で軽量に扱えます
+- `ArcGISMapViewState` は通常の `ArcGISMapView` と共用できます
+
+## 基本的な使い方
+
+
+
+## パラメータ
+
+- **`state`**: `ArcGISMapViewState`。カメラ位置、地図デザイン、コントローラなどを保持します。
+- **`modifier`**: Compose の `Modifier`。サイズ、余白、背景などのレイアウト指定に使います。
+- **`markerTiling`**: `MarkerTilingOptions?`。マーカー表示のタイル化設定です。
+- **`sdkInitialize`**: ArcGIS SDK の初期化処理を差し替えるための suspend 関数です。
+- **`onMapLoaded`**: 地図の読み込みが完了したときに呼び出されます。
+- **`onCameraMoveStart`**: カメラ移動が開始されたときに呼び出されます。
+- **`onCameraMove`**: カメラ移動中に呼び出されます。
+- **`onCameraMoveEnd`**: カメラ移動が終了したときに呼び出されます。
+- **`onMapClick`**: ユーザーがマップ上のオーバーレイではない部分をタップしたときに呼び出されます。
+- **`onMapLongClick`**: ユーザーがマップ上のオーバーレイではない部分を長押ししたときに呼び出されます。
+- **`content`**: マーカー、ポリライン、ポリゴンなどの地図コンテンツを配置する `ArcGISMapViewScope` の Composable ブロックです。
+
+## 注意事項
+
+`ArcGISMapView2D` では `tilt` は常に `0` に固定されます。`MapCameraPosition` に `tilt` を指定しても 2D `MapView` では無視され、3D 表示や建物の立体表示は行われません。
diff --git a/docs/src/content/docs/ja/modules.mdx b/docs/src/content/docs/ja/modules.mdx
index 4b986d48..6f1583d6 100644
--- a/docs/src/content/docs/ja/modules.mdx
+++ b/docs/src/content/docs/ja/modules.mdx
@@ -58,6 +58,7 @@ MapConductor は複数の Gradle モジュールに分割されているため
### `android-for-arcgis`
- `ArcGISMapView` Composable
+- `ArcGISMapView2D` Composable(詳しくは [ArcGISMapView2D(2D フラットビュー)](/ja/mapviewholder/arcgis-2d/) を参照してください)
- `ArcGISMapViewState`
### `android-for-maplibre`
@@ -93,6 +94,17 @@ MapConductor は複数の Gradle モジュールに分割されているため
タイルベースのラスターレイヤーを通じてすべての地図プロバイダで動作します。詳しくは [ヒートマップ](/ja/experimental/heatmap/) を参照してください。
+### `android-geojson-layer`
+
+地図実装非依存な GeoJSON レイヤー:
+
+- `GeoJSONLayer` Composable
+- 静的データ向けの `GeoJSONFeature`
+- Compose state と連携する `GeoJSONFeatureState`
+- `GeoJSONParser` による一括パースとストリームパース
+
+タイルベースのラスターレイヤーを通じてすべての地図プロバイダで動作します。詳しくは [GeoJSON レイヤー](/ja/experimental/geojson-layer/) を参照してください。
+
### `android-marker-clustering`
すべての地図プロバイダに対応した自動マーカークラスタリング:
diff --git a/docs/src/content/docs/mapviewholder/arcgis-2d.mdx b/docs/src/content/docs/mapviewholder/arcgis-2d.mdx
new file mode 100644
index 00000000..18ef0c89
--- /dev/null
+++ b/docs/src/content/docs/mapviewholder/arcgis-2d.mdx
@@ -0,0 +1,57 @@
+---
+title: ArcGISMapView2D (2D Flat View)
+head:
+ - tag: meta
+ attrs:
+ name: description
+ content: MapConductor Android SDK ArcGISMapView2D - ArcGIS 2D flat map view Composable
+---
+
+import ArcGISMapView2DSignature from '~/components/api/mapviewholder/ArcGISMapView2DSignature.astro';
+import ArcGISMapView2DVsArcGISMapView from '~/components/api/mapviewholder/ArcGISMapView2DVsArcGISMapView.astro';
+import ArcGISMapView2DBasicExample from '~/components/api/mapviewholder/ArcGISMapView2DBasicExample.astro';
+
+`ArcGISMapView2D` is a Composable that displays an ArcGIS 2D flat map view.
+While the standard `ArcGISMapView` is based on a 3D `SceneView`, `ArcGISMapView2D` uses the ArcGIS 2D `MapView`.
+
+## Overview
+
+Use this when you need an ArcGIS map specialized for 2D display. `ArcGISMapViewState` can be shared with the standard `ArcGISMapView` and is created with `rememberArcGISMapViewState()`.
+
+## Composable Signature
+
+`ArcGISMapView2D` is provided by the `android-for-arcgis` module.
+
+
+
+## Differences from ArcGISMapView
+
+
+
+- Uses a 2D `MapView` instead of a 3D `SceneView`
+- `tilt` is always fixed at `0`, so there is no 3D tilt
+- Does not display 3D buildings or other 3D content
+- Specialized for 2D maps and lightweight for screens that do not need 3D display
+- `ArcGISMapViewState` can be shared with the standard `ArcGISMapView`
+
+## Basic Usage
+
+
+
+## Parameters
+
+- **`state`**: `ArcGISMapViewState`. Holds the camera position, map design, controller, and other state.
+- **`modifier`**: Compose `Modifier`. Used for layout settings such as size, margins, and background.
+- **`markerTiling`**: `MarkerTilingOptions?`. Tile-based marker display settings.
+- **`sdkInitialize`**: A suspend function used to replace the ArcGIS SDK initialization process.
+- **`onMapLoaded`**: Called when the map has finished loading.
+- **`onCameraMoveStart`**: Called when camera movement starts.
+- **`onCameraMove`**: Called while the camera is moving.
+- **`onCameraMoveEnd`**: Called when camera movement ends.
+- **`onMapClick`**: Called when the user taps an area of the map that is not an overlay.
+- **`onMapLongClick`**: Called when the user long-presses an area of the map that is not an overlay.
+- **`content`**: A Composable block in `ArcGISMapViewScope` for placing map content such as markers, polylines, and polygons.
+
+## Notes
+
+In `ArcGISMapView2D`, `tilt` is always fixed at `0`. Even if `tilt` is specified in `MapCameraPosition`, it is ignored by the 2D `MapView`, and 3D display or three-dimensional building display is not performed.
diff --git a/docs/tmp-codex-docs-prompt.md b/docs/tmp-codex-docs-prompt.md
new file mode 100644
index 00000000..cdb1dcdd
--- /dev/null
+++ b/docs/tmp-codex-docs-prompt.md
@@ -0,0 +1,589 @@
+# MapConductor Android SDK — 新機能ドキュメント生成タスク
+
+作業ディレクトリ: `/Users/masashi/android-sdk/docs`
+
+以下の5つの新機能について、**日本語のみ**のドキュメントを Astro/Starlight 形式で生成してください。
+各機能について `.astro` コンポーネントファイルと `.mdx` ページ(新規または更新)を作成します。
+
+---
+
+## 前提: Astro コンポーネントの書き方
+
+既存ファイル `src/components/api/event-handlers/OnMapClickSignature.astro` の形式:
+```astro
+---
+import { Code } from '@astrojs/starlight/components';
+const code = `onMapClick: OnMapEventHandler? = null`;
+---
+
+```
+
+既存ファイル `src/components/api/event-handlers/OnMapClickExample.astro` の形式:
+```astro
+---
+import { Code } from '@astrojs/starlight/components';
+interface Props {
+ commentForPrint?: string;
+}
+const { commentForPrint = "Map clicked at:" } = Astro.props;
+const code = `MapView(
+ onMapClick = { geoPoint ->
+ println("${commentForPrint} \${geoPoint.latitude}, \${geoPoint.longitude}")
+ }
+) { }`;
+---
+
+```
+
+既存ファイル `src/components/api/event-handlers/MapViewEventHandlersSignature.astro` を**更新**して `onMapLongClick` を追加してください(既存の内容に `onMapLongClick: OnMapEventHandler? = null,` を追加する)。
+
+MDX ページは `src/content/docs/ja/` 以下にあります。
+
+---
+
+## 機能1: `onMapLongClick` — 全 MapView への長押しイベント追加
+
+### 概要
+`onMapLongClick: OnMapEventHandler? = null` が全 MapView(GoogleMapView, ArcGISMapView, ArcGISMapView2D, MapboxMapView, MapLibreMapView, HereMapView)に追加されました。シグネチャは `onMapClick` と同じです。
+
+### 作成するファイル
+
+**`src/components/api/event-handlers/OnMapLongClickSignature.astro`**:
+```astro
+---
+import { Code } from '@astrojs/starlight/components';
+const code = `onMapLongClick: OnMapEventHandler? = null`;
+---
+
+```
+
+**`src/components/api/event-handlers/OnMapLongClickExample.astro`**:
+Props: `commentForPrint: string = "Map long-clicked at:"`
+コード例:
+```kotlin
+MapView(
+ onMapLongClick = { geoPoint ->
+ println("${commentForPrint} ${geoPoint.latitude}, ${geoPoint.longitude}")
+ }
+) {
+ // ...
+}
+```
+
+### 更新するファイル
+`src/content/docs/ja/event/event-handlers.mdx` に `## マップインタラクション` セクションへ `onMapLongClick` のサブセクションを追加:
+- 既存の `onMapClick` セクションの直後に追加
+- `` と `` を使う
+- import 文も追加する
+- 説明: 「ユーザーがマップ(オーバーレイではない部分)を長押ししたときに呼び出されます。」
+- イベントデータ: `GeoPointInterface` — 長押しされた地理座標
+
+---
+
+## 機能2: `ArcGISMapView2D` — ArcGIS 2D フラットマップ
+
+### 概要
+`ArcGISMapView2D` は ArcGIS の 2D フラット地図ビューです。通常の `ArcGISMapView`(3D SceneView ベース)とは異なり、ArcGIS の `MapView`(2D)を使用します。tilt や 3D 表示はサポートされません(tilt は常に 0 に固定)。
+
+### Composable シグネチャ(`android-for-arcgis` モジュール)
+```kotlin
+@Composable
+fun ArcGISMapView2D(
+ state: ArcGISMapViewState,
+ modifier: Modifier = Modifier,
+ markerTiling: MarkerTilingOptions? = null,
+ sdkInitialize: (suspend (android.content.Context) -> Boolean)? = null,
+ onMapLoaded: OnMapLoadedHandler? = null,
+ onCameraMoveStart: OnCameraMoveHandler? = null,
+ onCameraMove: OnCameraMoveHandler? = null,
+ onCameraMoveEnd: OnCameraMoveHandler? = null,
+ onMapClick: OnMapEventHandler? = null,
+ onMapLongClick: OnMapEventHandler? = null,
+ content: (@Composable ArcGISMapViewScope.() -> Unit)? = null,
+)
+```
+
+通常の `ArcGISMapView` との違い:
+- 3D SceneView の代わりに 2D MapView を使用
+- tilt は常に 0(3D 傾斜なし)
+- 建物の 3D 表示なし
+- 軽量で 2D マップに特化
+- `ArcGISMapViewState` は共用(`rememberArcGISMapViewState()` で生成)
+
+### 作成するファイル
+
+**`src/components/api/mapviewholder/ArcGISMapView2DSignature.astro`**:
+`ArcGISMapView2D` の Composable シグネチャをコード表示
+
+**`src/components/api/mapviewholder/ArcGISMapView2DBasicExample.astro`**:
+Props: なし
+基本的な使用例:
+```kotlin
+val state = rememberArcGISMapViewState(
+ mapDesign = ArcGISDesign.Streets,
+ cameraPosition = MapCameraPosition(
+ position = GeoPoint(35.68, 139.76),
+ zoom = 12.0,
+ )
+)
+
+ArcGISMapView2D(
+ state = state,
+ modifier = Modifier.fillMaxSize(),
+ onMapLoaded = {
+ println("2D マップ読み込み完了")
+ },
+ onMapClick = { geoPoint ->
+ println("タップ: ${geoPoint.latitude}, ${geoPoint.longitude}")
+ }
+) {
+ // マーカーや他のオーバーレイを配置できます
+}
+```
+
+**`src/components/api/mapviewholder/ArcGISMapView2DVsArcGISMapView.astro`**:
+Props: なし
+2D と 3D の比較コード例:
+```kotlin
+// 3D ビュー(デフォルト ArcGISMapView)
+ArcGISMapView(
+ state = state,
+ modifier = Modifier.fillMaxSize(),
+) { }
+
+// 2D フラットビュー(ArcGISMapView2D)
+ArcGISMapView2D(
+ state = state,
+ modifier = Modifier.fillMaxSize(),
+) { }
+```
+
+### 新規作成: `src/content/docs/ja/mapviewholder/arcgis-2d.mdx`
+
+frontmatter:
+```yaml
+title: ArcGISMapView2D(2D フラットビュー)
+head:
+ - tag: meta
+ attrs:
+ name: description
+ content: MapConductor Android SDKのArcGISMapView2D — ArcGISの2DフラットマップビューComposable
+```
+
+内容:
+- 概要: ArcGIS 2D フラットマップビュー。3D SceneView ではなく 2D MapView を使用
+- Composable シグネチャセクション
+- `ArcGISMapView` との違いセクション(tilt固定・建物3D表示なし・軽量)
+- 基本的な使い方セクション
+- パラメータ説明(state, modifier, markerTiling, sdkInitialize, onMapLoaded, onCameraMoveStart/Move/End, onMapClick, onMapLongClick, content)
+- 注意事項: tilt は常に 0 に固定。MapCameraPosition に tilt を指定しても無視される。
+
+---
+
+## 機能3: `InfoBubble` マーカー不要オーバーロードと `InfoBubbleCustom`
+
+### 概要
+`InfoBubble` に `MarkerState` なしで地図上の任意座標に配置できる新オーバーロードが追加されました。また `InfoBubbleCustom` で完全カスタム形状のバブルが作れます。
+
+### 新しい API シグネチャ
+
+```kotlin
+// マーカー不要の新オーバーロード
+@Composable
+fun MapViewScope.InfoBubble(
+ position: GeoPoint,
+ bubbleColor: Color = Color.White,
+ borderColor: Color = Color.Black,
+ contentPadding: Dp = 8.dp,
+ cornerRadius: Dp = 4.dp,
+ tailSize: Dp = 8.dp,
+ content: @Composable () -> Unit,
+)
+
+// カスタム形状バブル
+@Composable
+fun MapViewScope.InfoBubbleCustom(
+ marker: MarkerState,
+ tailOffset: Offset,
+ content: @Composable () -> Unit,
+)
+```
+
+`InfoBubble(position: GeoPoint)` の動作:
+- マーカーに紐付けず、`GeoPoint` で指定した座標に吹き出しを表示
+- `position` が変更されるとバブルが移動する
+- 地図のパン/ズームに追従する
+
+`InfoBubbleCustom` の動作:
+- `tailOffset` でバブルのどの点(0..1)が接続点かを指定
+ - 例: 右側中央 = `Offset(1f, 0.5f)`、下中央 = `Offset(0.5f, 1f)`
+- `content` で吹き出し全体(尾を含む)を自由に描画
+
+### 作成するファイル
+
+**`src/components/components/infobubble/StandaloneInfoBubbleSignature.astro`**:
+`InfoBubble(position: GeoPoint, ...)` シグネチャ
+
+**`src/components/components/infobubble/StandaloneInfoBubbleExample.astro`**:
+Props: `latitude: number = 35.6812`, `longitude: number = 139.7671`, `commentForLabel: string = "ここに吹き出し"`
+```kotlin
+MapView(...) {
+ InfoBubble(
+ position = GeoPoint(${latitude}, ${longitude}),
+ bubbleColor = Color.White,
+ borderColor = Color.Blue,
+ ) {
+ Text("${commentForLabel}")
+ }
+}
+```
+
+**`src/components/components/infobubble/InfoBubbleCustomSignature.astro`**:
+`InfoBubbleCustom` シグネチャ
+
+**`src/components/components/infobubble/InfoBubbleCustomExample.astro`**:
+Props: `commentForTailOffset: string = "右側中央を接続点にする"`, `commentForMarker: string = "マーカー"`
+右側に尾を持つカスタムバブルの例:
+```kotlin
+InfoBubbleCustom(
+ marker = markerState, // ${commentForMarker}
+ tailOffset = Offset(1f, 0.5f), // ${commentForTailOffset}
+) {
+ // カスタム形状の吹き出しを描画
+ Box(
+ modifier = Modifier
+ .background(Color.Yellow, RoundedCornerShape(8.dp))
+ .padding(8.dp)
+ ) {
+ Text("カスタムバブル")
+ }
+}
+```
+
+### 更新するファイル
+`src/content/docs/ja/components/infobubble.mdx` に以下を追加:
+- 既存の「基本的な使用方法」セクションの前に「マーカー不要の配置」セクションを追加
+- `InfoBubbleCustom` の使い方セクションを末尾付近に追加
+- 対応する import 文を追加
+
+---
+
+## 機能4: `MapCameraPosition.tilt` マイナス値 — 前方を見るカメラ
+
+### 概要
+`MapCameraPosition.tilt` にマイナス値を指定すると、水平線より上方を向く「仰角ビュー」になります。
+
+- **正の tilt(0〜90)**: 真上(0)から水平(90)の間で地面を見下ろす(既存の動作)
+- **負の tilt(-1〜-90)**: 水平線より abs(tilt) 度上方を向く(前方を見る)
+
+各 SDK の実装:
+- **ArcGIS**: ネイティブに対応(ArcGIS のカメラ仕様と同一)
+- **Google Maps, MapLibre, Mapbox, HERE**: 上向きピッチを直接表現できないため、カメラ位置を固定し bearing 方向の前方へターゲットを `altitude * tan(|tilt|)` メートル移動してシミュレート
+
+### 作成するファイル
+
+**`src/components/core/mapcameraposition/NegativeTiltExample.astro`**:
+Props: `latitude: number = 35.68`, `longitude: number = 139.76`, `commentForLookUp: string = "前方(水平線上方)を見る"`, `commentForNormal: string = "通常の俯瞰ビュー"`, `commentForArcGISNote: string = "ArcGIS はネイティブ対応"`
+```kotlin
+// ${commentForNormal}(従来の動作)
+MapCameraPosition(
+ position = GeoPoint(${latitude}, ${longitude}),
+ zoom = 15.0,
+ tilt = 60.0, // 地面を60度の角度で見下ろす
+)
+
+// ${commentForLookUp}
+MapCameraPosition(
+ position = GeoPoint(${latitude}, ${longitude}),
+ zoom = 15.0,
+ tilt = -30.0, // 水平線より30度上方を見る
+ bearing = 45.0,
+)
+```
+
+**`src/components/core/mapcameraposition/NegativeTiltSdkNote.astro`**:
+Props: なし
+SDK ごとの対応状況を箇条書きで表示するコンポーネント(Markdown テキスト、コードブロックなし):
+ArcGIS: ネイティブ対応、Google Maps / Mapbox / MapLibre / HERE: ターゲット移動によるシミュレーション(完全に同一にはならない)
+
+### 更新するファイル
+`src/content/docs/ja/core/mapcameraposition.mdx` の「傾き(3D 視点)」セクション内 `` の直後に「負の tilt 値 — 前方を見る」サブセクションを追加:
+- `` と `` を使う
+- import 文も追加
+
+---
+
+## 機能5: GeoJSON レイヤーモジュール (`android-geojson-layer`)
+
+### 概要
+`android-geojson-layer` は独立したモジュールで、地図実装に依存しない GeoJSON データの表示機能を提供します。タイルベースのラスターレイヤーとして動作するため、あらゆる地図 SDK で使用できます。
+
+### 主要 API
+
+#### `GeoJSONLayer` Composable
+```kotlin
+@Composable
+fun MapViewScope.GeoJSONLayer(
+ state: GeoJSONLayerState = remember { GeoJSONLayerState() },
+ features: List = emptyList(),
+ tileSize: Int = 512,
+ disableTileServerCache: Boolean = false,
+ content: @Composable () -> Unit = {},
+)
+```
+
+#### `GeoJSONLayerState`
+```kotlin
+class GeoJSONLayerState(
+ opacity: Float = 1.0f,
+ strokeColor: Int = Color.argb(255, 30, 136, 229), // 青系
+ fillColor: Int = Color.argb(128, 30, 136, 229), // 半透明青系
+ strokeWidth: Float = 2f,
+ pointRadius: Float = 8f,
+ visible: Boolean = true,
+ minZoom: Int = 0,
+ maxZoom: Int = 22,
+ val onClick: ((feature: GeoJSONFeature, position: GeoPoint) -> Unit)? = null,
+)
+```
+メソッド:
+- `processClick(geoPoint: GeoPoint): Boolean` — マップのクリックハンドラから呼び出してフィーチャのヒットテストを行う。フィーチャが見つかれば `onClick` を呼び出し `true` を返す
+
+#### `GeoJSONFeature`(静的/一括データ用)
+```kotlin
+data class GeoJSONFeature(
+ val id: String? = null,
+ val geometry: GeoJSONGeometry,
+ val properties: Map = emptyMap(),
+ val strokeColor: Int? = null, // nullの場合は GeoJSONLayerState のデフォルトを使用
+ val fillColor: Int? = null,
+ val strokeWidth: Float? = null,
+ val pointRadius: Float? = null,
+ val visible: Boolean = true,
+)
+```
+
+#### `GeoJSONFeatureState`(Compose のリアクティブ状態用)
+`GeoJSONFeatureState` は `GeoJSONLayer` の `content` ブロック内に配置する Composable 対応の状態クラス。大量データには `GeoJSONFeature`(`features` パラメータ)を使う方が効率的。
+
+#### `GeoJSONGeometry` sealed class
+```kotlin
+sealed class GeoJSONGeometry {
+ data class Point(val longitude: Double, val latitude: Double)
+ data class MultiPoint(val points: List)
+ data class LineString(val coordinates: List)
+ data class MultiLineString(val lines: List>)
+ data class Polygon(val rings: List>) // rings[0]=外周, rings[1..]=穴
+ data class MultiPolygon(val polygons: List>>)
+ data class GeometryCollection(val geometries: List)
+ object Empty
+}
+
+data class LonLat(val longitude: Double, val latitude: Double)
+```
+
+#### `GeoJSONParser`
+```kotlin
+object GeoJSONParser {
+ // InputStream 全体をパースして List を返す
+ fun parseStream(inputStream: InputStream): List
+
+ // 1フィーチャずつコールバック — 大容量ファイル(10MB+)向け
+ fun streamParse(inputStream: InputStream, onFeature: (GeoJSONFeature) -> Unit)
+}
+```
+
+### インストール(Gradle)
+```kotlin
+dependencies {
+ implementation(platform("com.mapconductor:mapconductor-bom:{BOM_MODULE_VERSION}"))
+ implementation("com.mapconductor:core")
+ implementation("com.mapconductor:geojson-layer")
+
+ // 使用する地図 SDK を選択
+ implementation("com.mapconductor:for-googlemaps")
+}
+```
+
+### 作成するファイル
+
+**`src/components/experimental/geojson/GeoJSONLayerInstall.astro`**:
+上記 Gradle 依存関係コードを表示
+
+**`src/components/experimental/geojson/GeoJSONLayerSignature.astro`**:
+`GeoJSONLayer` Composable シグネチャを表示
+
+**`src/components/experimental/geojson/GeoJSONLayerStateSignature.astro`**:
+`GeoJSONLayerState` コンストラクタと `processClick` メソッドを表示
+
+**`src/components/experimental/geojson/GeoJSONFeatureSignature.astro`**:
+`GeoJSONFeature` data class を表示
+
+**`src/components/experimental/geojson/GeoJSONGeometryTypes.astro`**:
+`GeoJSONGeometry` sealed class 全体を表示
+
+**`src/components/experimental/geojson/GeoJSONParserSignature.astro`**:
+`GeoJSONParser` オブジェクトのメソッドシグネチャを表示
+
+**`src/components/experimental/geojson/GeoJSONBasicExample.astro`**:
+Props: なし
+ポイント・ラインストリング・ポリゴンを含む基本的な使用例:
+```kotlin
+val layerState = remember { GeoJSONLayerState() }
+val features = remember {
+ listOf(
+ GeoJSONFeature(
+ geometry = GeoJSONGeometry.Point(longitude = 139.76, latitude = 35.68),
+ properties = mapOf("name" to "東京駅"),
+ ),
+ GeoJSONFeature(
+ geometry = GeoJSONGeometry.LineString(
+ coordinates = listOf(
+ LonLat(139.76, 35.68),
+ LonLat(139.77, 35.69),
+ )
+ ),
+ ),
+ GeoJSONFeature(
+ geometry = GeoJSONGeometry.Polygon(
+ rings = listOf(
+ listOf(
+ LonLat(139.75, 35.67),
+ LonLat(139.77, 35.67),
+ LonLat(139.77, 35.69),
+ LonLat(139.75, 35.69),
+ LonLat(139.75, 35.67), // 始点と終点を同じにする
+ )
+ )
+ ),
+ ),
+ )
+}
+
+MapView(...) {
+ GeoJSONLayer(
+ state = layerState,
+ features = features,
+ )
+}
+```
+
+**`src/components/experimental/geojson/GeoJSONParserExample.astro`**:
+Props: `commentForLargeFile: string = "大容量 GeoJSON ファイルのパース"`, `commentForStream: string = "1フィーチャずつ処理(メモリ効率が良い)"`
+```kotlin
+// ${commentForLargeFile}
+val features = GeoJSONParser.parseStream(assets.open("data.geojson"))
+
+// ${commentForStream}
+GeoJSONParser.streamParse(assets.open("large-data.geojson")) { feature ->
+ // 1件ずつ処理
+}
+```
+
+**`src/components/experimental/geojson/GeoJSONClickExample.astro`**:
+Props: `commentForHitTest: string = "タップ位置のフィーチャを検索"`, `commentForResult: string = "フィーチャが見つかった場合"`
+```kotlin
+val layerState = remember {
+ GeoJSONLayerState(
+ onClick = { feature, position ->
+ println("${commentForResult}: ${feature.properties["name"]}")
+ }
+ )
+}
+
+MapView(
+ onMapClick = { geoPoint ->
+ // ${commentForHitTest}
+ val handled = layerState.processClick(geoPoint)
+ if (!handled) {
+ // GeoJSON フィーチャ以外のタップ処理
+ }
+ }
+) {
+ GeoJSONLayer(state = layerState, features = features)
+}
+```
+
+**`src/components/experimental/geojson/GeoJSONFeatureStateExample.astro`**:
+Props: `commentForDynamic: string = "動的に変化するフィーチャ(Compose state)"`, `commentForContent: string = "content ブロック内に GeoJSONFeatureState を配置"`
+リアクティブな `GeoJSONFeatureState` の使用例:
+```kotlin
+val featureState = remember {
+ GeoJSONFeatureState(
+ geometry = GeoJSONGeometry.Point(longitude = 139.76, latitude = 35.68),
+ properties = mapOf("name" to "動的ポイント"),
+ )
+}
+
+// ${commentForDynamic}
+LaunchedEffect(userLocation) {
+ featureState.geometry = GeoJSONGeometry.Point(
+ longitude = userLocation.longitude,
+ latitude = userLocation.latitude,
+ )
+}
+
+MapView(...) {
+ GeoJSONLayer(state = layerState) {
+ // ${commentForContent}
+ GeoJSONFeatureCompose(state = featureState)
+ }
+}
+```
+
+**`src/components/experimental/geojson/GeoJSONStyleExample.astro`**:
+Props: なし
+スタイルカスタマイズ例:
+```kotlin
+val layerState = remember {
+ GeoJSONLayerState(
+ strokeColor = Color.rgb(255, 87, 34), // オレンジ
+ fillColor = Color.argb(100, 255, 87, 34), // 半透明オレンジ
+ strokeWidth = 3f,
+ pointRadius = 12f,
+ opacity = 0.9f,
+ )
+}
+```
+
+### 新規作成: `src/content/docs/ja/experimental/geojson-layer.mdx`
+
+frontmatter:
+```yaml
+title: GeoJSON レイヤー
+head:
+ - tag: meta
+ attrs:
+ name: description
+ content: MapConductor Android SDKのGeoJSONレイヤー — 任意の地図プロバイダでGeoJSONデータを表示するモジュール
+```
+
+ページ構成:
+1. 概要(地図実装非依存のタイルベース GeoJSON レンダリング)
+2. インストール(``)
+3. 基本的な使い方(``)
+4. API リファレンス
+ - `GeoJSONLayer` Composable(``)
+ - `GeoJSONLayerState`(``)
+ - `GeoJSONLayerState` パラメータ説明
+ - `GeoJSONFeature`(``)
+5. ジオメトリタイプ(``)
+6. 大容量ファイルのパース(`` + ``)
+7. クリックイベント / ヒットテスト(``)
+8. リアクティブフィーチャ(GeoJSONFeatureState)(``)
+9. スタイルカスタマイズ(``)
+
+### 更新するファイル
+`src/content/docs/ja/modules.mdx` に `geojson-layer` モジュールのエントリを追加(既存の `heatmap` エントリを参考にして)
+
+---
+
+## 注意事項
+
+- 全テキストは**日本語**で書く(コードコメントも日本語可)
+- `.astro` ファイルはすべて `src/components/` 以下の適切なサブディレクトリに作成
+- `.mdx` ファイルはすべて `src/content/docs/ja/` 以下
+- MDX の import 文は必ず `~/components/...` 形式(`@` ではなく `~`)
+- コードブロックは `` 形式(直接 `\`\`\`` でもよい)
+- `GeoJSONFeatureCompose` は `content` ブロック内に配置する Composable(使用例で参照可)
+- 既存ページを更新する場合は既存の内容を削除せず、新しいセクションを追加する
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 1e1cfd71..e3b34468 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -20,7 +20,7 @@ lifecycleViewmodelCompose = "2.10.0"
# gradle.properties?kotlinCompilerExtensionVersion??????
compose = "1.11.2"
composeBom = "2026.05.01"
-okhttp = "5.3.2"
+okhttp = "5.4.0"
runner = "1.7.0"
mapboxAndroid = "11.24.3"
@@ -30,7 +30,7 @@ arcgisMapsKotlin = "200.7.0"
vectordrawable = "1.2.0"
ktLint = "14.2.0"
geographiclib = "2.1"
-mapLibreSdk = "13.2.0"
+mapLibreSdk = "13.3.0"
mapLibreAnnotation = "3.0.2"
runtime = "1.11.2"
runtimeVersion = "1.11.2"
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 311b1ea0..18226d06 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Fri Apr 11 01:40:57 PDT 2025
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/mapconductor-bom/build.gradle.kts b/mapconductor-bom/build.gradle.kts
index 01e45bf2..574ea999 100644
--- a/mapconductor-bom/build.gradle.kts
+++ b/mapconductor-bom/build.gradle.kts
@@ -25,7 +25,7 @@ val moduleInfo = mapOf(
"for-maplibre" to getModuleVersion(":android-for-maplibre"),
"icons" to getModuleVersion(":android-icons"),
"heatmap" to getModuleVersion(":android-heatmap"),
- "geojson" to getModuleVersion(":android-geojson-layer"),
+ "geojson-layer" to getModuleVersion(":android-geojson-layer"),
"marker-clustering" to getModuleVersion(":android-marker-clustering"),
)
diff --git a/scripts/update-gradle-wrappers.sh b/scripts/update-gradle-wrappers.sh
new file mode 100755
index 00000000..cebf0657
--- /dev/null
+++ b/scripts/update-gradle-wrappers.sh
@@ -0,0 +1,254 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+ROOT_DIR="$(dirname "${SCRIPT_DIR}")"
+
+DRY_RUN=0
+MODE="set"
+VERSION=""
+DISTRIBUTION_TYPE="bin"
+
+usage() {
+ cat <<'USAGE'
+Usage:
+ scripts/update-gradle-wrappers.sh [options]
+ scripts/update-gradle-wrappers.sh --sync-from-root [options]
+ scripts/update-gradle-wrappers.sh --list
+
+Update distributionUrl in every gradle/wrapper/gradle-wrapper.properties file.
+
+Options:
+ --sync-from-root Copy the Gradle version and distribution type from the
+ root wrapper into module wrappers.
+ --type Distribution archive type. Defaults to bin.
+ --list List wrapper files and their current Gradle versions.
+ --dry-run Print files that would change without editing.
+ -h, --help Show this help.
+
+Examples:
+ scripts/update-gradle-wrappers.sh 9.5.1
+ scripts/update-gradle-wrappers.sh 9.5.1 --type all --dry-run
+ scripts/update-gradle-wrappers.sh --sync-from-root
+USAGE
+}
+
+log() {
+ printf '%s\n' "$*"
+}
+
+wrapper_files() {
+ find "${ROOT_DIR}" \
+ -path '*/build' -prune -o \
+ -path '*/.gradle' -prune -o \
+ -path '*/gradle/wrapper/gradle-wrapper.properties' -type f -print |
+ sort
+}
+
+wrapper_distribution() {
+ local file="$1"
+
+ awk -F= '$1 == "distributionUrl" { print $2; exit }' "${file}"
+}
+
+wrapper_version() {
+ local file="$1"
+ local url
+
+ url="$(wrapper_distribution "${file}")"
+ case "${url}" in
+ *gradle-*-bin.zip|*gradle-*-all.zip)
+ printf '%s\n' "${url}" |
+ perl -ne 'if (/gradle-([^-]+)-(?:bin|all)\.zip/) { print "$1\n"; exit }'
+ ;;
+ esac
+}
+
+wrapper_type() {
+ local file="$1"
+ local url
+
+ url="$(wrapper_distribution "${file}")"
+ case "${url}" in
+ *-bin.zip)
+ printf 'bin\n'
+ ;;
+ *-all.zip)
+ printf 'all\n'
+ ;;
+ esac
+}
+
+validate_version() {
+ local version="$1"
+
+ if [[ ! "${version}" =~ ^[0-9]+(\.[0-9]+)*([.-][A-Za-z0-9]+)*$ ]]; then
+ log "Invalid Gradle version: ${version}"
+ exit 1
+ fi
+}
+
+validate_type() {
+ case "$1" in
+ bin|all)
+ ;;
+ *)
+ log "Invalid distribution type: $1"
+ exit 1
+ ;;
+ esac
+}
+
+list_wrappers() {
+ local file
+ local version
+ local type
+
+ while IFS= read -r file; do
+ version="$(wrapper_version "${file}")"
+ type="$(wrapper_type "${file}")"
+ if [[ -n "${version}" && -n "${type}" ]]; then
+ log "${file#${ROOT_DIR}/}: ${version} (${type})"
+ else
+ log "${file#${ROOT_DIR}/}: unsupported distributionUrl"
+ fi
+ done < <(wrapper_files)
+}
+
+update_file() {
+ local file="$1"
+ local version="$2"
+ local type="$3"
+ local current_version
+ local current_type
+
+ current_version="$(wrapper_version "${file}")"
+ current_type="$(wrapper_type "${file}")"
+
+ if [[ -z "${current_version}" || -z "${current_type}" ]]; then
+ log "Skipping ${file#${ROOT_DIR}/}: unsupported distributionUrl"
+ return 1
+ fi
+
+ if [[ "${current_version}" == "${version}" && "${current_type}" == "${type}" ]]; then
+ log "unchanged ${file#${ROOT_DIR}/}: ${version} (${type})"
+ return 0
+ fi
+
+ log "update ${file#${ROOT_DIR}/}: ${current_version} (${current_type}) -> ${version} (${type})"
+ if [[ "${DRY_RUN}" -eq 1 ]]; then
+ return 0
+ fi
+
+ if ! perl -0pi -e \
+ 'BEGIN { ($version, $type) = splice(@ARGV, 0, 2) } s#^(distributionUrl=.*?/gradle-)[^-]+-(bin|all)(\.zip)$#${1}${version}-${type}${3}#mg' \
+ "${version}" "${type}" "${file}"; then
+ log "Failed to update ${file#${ROOT_DIR}/}"
+ exit 1
+ fi
+}
+
+parse_args() {
+ if [[ $# -eq 0 ]]; then
+ usage
+ exit 1
+ fi
+
+ case "$1" in
+ --list)
+ MODE="list"
+ shift
+ ;;
+ --sync-from-root)
+ MODE="sync"
+ shift
+ ;;
+ esac
+
+ while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --dry-run)
+ DRY_RUN=1
+ shift
+ ;;
+ --type)
+ DISTRIBUTION_TYPE="${2:-}"
+ if [[ -z "${DISTRIBUTION_TYPE}" ]]; then
+ log "Missing value for --type"
+ exit 1
+ fi
+ validate_type "${DISTRIBUTION_TYPE}"
+ shift 2
+ ;;
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ -*)
+ log "Unknown option: $1"
+ usage
+ exit 1
+ ;;
+ *)
+ if [[ "${MODE}" != "set" || -n "${VERSION}" ]]; then
+ log "Unexpected argument: $1"
+ usage
+ exit 1
+ fi
+ VERSION="$1"
+ shift
+ ;;
+ esac
+ done
+}
+
+main() {
+ local file
+ local matched=0
+ parse_args "$@"
+
+ if [[ "${MODE}" == "list" ]]; then
+ list_wrappers
+ exit 0
+ fi
+
+ if [[ "${MODE}" == "sync" ]]; then
+ local root_wrapper="${ROOT_DIR}/gradle/wrapper/gradle-wrapper.properties"
+ VERSION="$(wrapper_version "${root_wrapper}")"
+ DISTRIBUTION_TYPE="$(wrapper_type "${root_wrapper}")"
+
+ if [[ -z "${VERSION}" || -z "${DISTRIBUTION_TYPE}" ]]; then
+ log "Root wrapper has an unsupported distributionUrl."
+ exit 1
+ fi
+
+ while IFS= read -r file; do
+ [[ "${file}" == "${root_wrapper}" ]] && continue
+ if update_file "${file}" "${VERSION}" "${DISTRIBUTION_TYPE}"; then
+ matched=1
+ fi
+ done < <(wrapper_files)
+ else
+ if [[ -z "${VERSION}" ]]; then
+ usage
+ exit 1
+ fi
+
+ validate_version "${VERSION}"
+ validate_type "${DISTRIBUTION_TYPE}"
+
+ while IFS= read -r file; do
+ if update_file "${file}" "${VERSION}" "${DISTRIBUTION_TYPE}"; then
+ matched=1
+ fi
+ done < <(wrapper_files)
+ fi
+
+ if [[ "${matched}" -eq 0 ]]; then
+ log "No supported Gradle wrapper files found."
+ exit 1
+ fi
+}
+
+main "$@"
diff --git a/scripts/update-version-catalogs.sh b/scripts/update-version-catalogs.sh
new file mode 100755
index 00000000..44537ced
--- /dev/null
+++ b/scripts/update-version-catalogs.sh
@@ -0,0 +1,226 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+ROOT_DIR="$(dirname "${SCRIPT_DIR}")"
+
+DRY_RUN=0
+MODE="set"
+KEY=""
+VERSION=""
+POSITIONAL=()
+
+usage() {
+ cat <<'USAGE'
+Usage:
+ scripts/update-version-catalogs.sh [options]
+ scripts/update-version-catalogs.sh --sync-from-root [ ...] [options]
+ scripts/update-version-catalogs.sh --list
+
+Update version entries in every gradle/libs.versions.toml file in this repo.
+
+Options:
+ --sync-from-root Copy the version value from root gradle/libs.versions.toml
+ into module gradle/libs.versions.toml files.
+ --list List all version keys found in catalog files.
+ --dry-run Print files that would change without editing.
+ -h, --help Show this help.
+
+Examples:
+ scripts/update-version-catalogs.sh agp 9.2.2
+ scripts/update-version-catalogs.sh composeBom 2026.06.00 --dry-run
+ scripts/update-version-catalogs.sh --sync-from-root agp kotlin compose composeBom
+USAGE
+}
+
+log() {
+ printf '%s\n' "$*"
+}
+
+catalog_files() {
+ find "${ROOT_DIR}" \
+ -path '*/build' -prune -o \
+ -path '*/.gradle' -prune -o \
+ -path '*/gradle/libs.versions.toml' -type f -print |
+ sort
+}
+
+version_keys() {
+ awk '
+ /^\[versions\]/ { in_versions = 1; next }
+ /^\[/ { in_versions = 0 }
+ in_versions && /^[[:space:]]*[A-Za-z0-9_.-]+[[:space:]]*=/ {
+ key = $0
+ sub(/^[[:space:]]*/, "", key)
+ sub(/[[:space:]]*=.*/, "", key)
+ print key
+ }
+ ' "$@"
+}
+
+version_value() {
+ local file="$1"
+ local key="$2"
+
+ awk -v key="${key}" '
+ /^\[versions\]/ { in_versions = 1; next }
+ /^\[/ { in_versions = 0 }
+ in_versions {
+ line = $0
+ sub(/^[[:space:]]*/, "", line)
+ if (line ~ "^" key "[[:space:]]*=") {
+ sub(/^[^=]*=[[:space:]]*"/, "", line)
+ sub(/".*/, "", line)
+ print line
+ exit
+ }
+ }
+ ' "${file}"
+}
+
+update_file() {
+ local file="$1"
+ local key="$2"
+ local version="$3"
+ local current
+
+ current="$(version_value "${file}" "${key}")"
+ if [[ -z "${current}" ]]; then
+ return 1
+ fi
+
+ if [[ "${current}" == "${version}" ]]; then
+ log "unchanged ${file#${ROOT_DIR}/}: ${key}=${version}"
+ return 0
+ fi
+
+ log "update ${file#${ROOT_DIR}/}: ${key} ${current} -> ${version}"
+ if [[ "${DRY_RUN}" -eq 1 ]]; then
+ return 0
+ fi
+
+ perl -0pi -e \
+ 'BEGIN { ($key, $version) = splice(@ARGV, 0, 2) } s/^([ \t]*\Q$key\E[ \t]*=[ \t]*")[^"]*(")/$1$version$2/mg' \
+ "${key}" "${version}" "${file}"
+}
+
+parse_args() {
+ if [[ $# -eq 0 ]]; then
+ usage
+ exit 1
+ fi
+
+ case "$1" in
+ --list)
+ MODE="list"
+ shift
+ ;;
+ --sync-from-root)
+ MODE="sync"
+ shift
+ ;;
+ esac
+
+ while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --dry-run)
+ DRY_RUN=1
+ shift
+ ;;
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ -*)
+ log "Unknown option: $1"
+ usage
+ exit 1
+ ;;
+ *)
+ if [[ "${MODE}" == "set" ]]; then
+ if [[ -z "${KEY}" ]]; then
+ KEY="$1"
+ elif [[ -z "${VERSION}" ]]; then
+ VERSION="$1"
+ else
+ log "Unexpected argument: $1"
+ usage
+ exit 1
+ fi
+ else
+ POSITIONAL+=("$1")
+ fi
+ shift
+ ;;
+ esac
+ done
+}
+
+main() {
+ local -a files
+ parse_args "$@"
+ while IFS= read -r file; do
+ files+=("${file}")
+ done < <(catalog_files)
+
+ if [[ "${MODE}" == "list" ]]; then
+ version_keys "${files[@]}" | sort -u
+ exit 0
+ fi
+
+ if [[ "${MODE}" == "set" ]]; then
+ if [[ -z "${KEY}" || -z "${VERSION}" ]]; then
+ usage
+ exit 1
+ fi
+
+ local matched=0
+ for file in "${files[@]}"; do
+ if update_file "${file}" "${KEY}" "${VERSION}"; then
+ matched=1
+ fi
+ done
+
+ if [[ "${matched}" -eq 0 ]]; then
+ log "No catalog defines version key: ${KEY}"
+ exit 1
+ fi
+ exit 0
+ fi
+
+ if [[ "${MODE}" == "sync" ]]; then
+ local root_catalog="${ROOT_DIR}/gradle/libs.versions.toml"
+ local key
+ local version
+
+ if [[ "${#POSITIONAL[@]}" -eq 0 ]]; then
+ log "Pass at least one version key to --sync-from-root."
+ usage
+ exit 1
+ fi
+
+ for key in "${POSITIONAL[@]}"; do
+ version="$(version_value "${root_catalog}" "${key}")"
+ if [[ -z "${version}" ]]; then
+ log "Root catalog does not define version key: ${key}"
+ exit 1
+ fi
+
+ local matched=0
+ for file in "${files[@]}"; do
+ [[ "${file}" == "${root_catalog}" ]] && continue
+ if update_file "${file}" "${key}" "${version}"; then
+ matched=1
+ fi
+ done
+
+ if [[ "${matched}" -eq 0 ]]; then
+ log "No module catalog defines version key: ${key}"
+ exit 1
+ fi
+ done
+ fi
+}
+
+main "$@"