From 8f7ffc60ad3b82261df6c05c7d21e5972fa8d7f9 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Sat, 7 Nov 2026 05:40:54 -0800 Subject: [PATCH 1/3] Draw large polygon sets as raster tiles (PolygonTiler) The polygon controller gets a PolygonTiler, whose tiles are shown through the raster layer path the marker tiles use (upsert / removeById, outside the app's RasterLayer composition). Tiled polygons stay registered for taps and give the map SDK nothing. Longdo has no RasterLayer controller, so the tiles are mounted like other rasters from outside the content (mountRasterLayer), and reapply skips tiled entities, which have no handle. --- .../longdo/LongdoMapViewController.kt | 16 ++++++++++++++++ .../longdo/polygon/LongdoPolygonController.kt | 4 +++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/mapconductor/longdo/LongdoMapViewController.kt b/src/main/java/com/mapconductor/longdo/LongdoMapViewController.kt index 2161b8d..f168b3e 100644 --- a/src/main/java/com/mapconductor/longdo/LongdoMapViewController.kt +++ b/src/main/java/com/mapconductor/longdo/LongdoMapViewController.kt @@ -17,7 +17,10 @@ import com.mapconductor.core.marker.MarkerTilingOptions import com.mapconductor.core.marker.OnMarkerEventHandler import com.mapconductor.core.marker.StrategyMarkerController import com.mapconductor.core.polygon.OnPolygonEventHandler +import com.mapconductor.core.polygon.POLYGON_TILE_LAYER_ID import com.mapconductor.core.polygon.PolygonCapableInterface +import com.mapconductor.core.polygon.PolygonTiler +import com.mapconductor.core.polygon.polygonTileRasterLayerState import com.mapconductor.core.polyline.OnPolylineEventHandler import com.mapconductor.core.polyline.PolylineCapableInterface import com.mapconductor.core.polyline.PolylineState @@ -104,6 +107,19 @@ class LongdoMapViewController( registerOverlayController(polygonController) registerOverlayController(groundImageController) registerOverlayController(circleController) + // Many polygons are drawn as raster tiles. Longdo has no RasterLayer + // controller, so they are mounted like the marker tiles: outside the + // app's RasterLayer composition, which therefore never removes them. + polygonController.tiler = + PolygonTiler().apply { + onTemplate = { template, tileSize -> + if (template != null) { + mountRasterLayer(polygonTileRasterLayerState(template, tileSize)) + } else { + unmountRasterLayer(POLYGON_TILE_LAYER_ID) + } + } + } // ホルダーの投影にカメラを供給する。ホルダーはコントローラより先に作られるので // ここで繋ぐ。これが無いと toScreenOffset が常に null を返し、InfoBubble と // マーカー追従が理由も出ずに落ちる。 diff --git a/src/main/java/com/mapconductor/longdo/polygon/LongdoPolygonController.kt b/src/main/java/com/mapconductor/longdo/polygon/LongdoPolygonController.kt index 55cc043..0683c06 100644 --- a/src/main/java/com/mapconductor/longdo/polygon/LongdoPolygonController.kt +++ b/src/main/java/com/mapconductor/longdo/polygon/LongdoPolygonController.kt @@ -17,6 +17,8 @@ class LongdoPolygonController( ) : PolygonController(polygonManager, renderer) { /** 既知のポリゴンを再適用する(地図 `ready` 後の復元用)。 */ fun reapply() { - renderer.reapply(polygonManager.allEntities().map { it.polygon }) + // Polygons drawn as tiles (PolygonController.tiler) have no handle. + @Suppress("USELESS_CAST") + renderer.reapply(polygonManager.allEntities().mapNotNull { it.polygon as LongdoPolygonHandle? }) } } From 2bc77c3224e29866556998dc2160d564969c9551 Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Mon, 9 Nov 2026 06:51:43 -0800 Subject: [PATCH 2/3] Stack the polygon tiles at the bottom of the polygon band With develop's OverlayStacking, a raster layer goes in the raster band, under ground images. The polygon tiles are polygons drawn as images, so they go over ground images and under circles, polylines and markers. --- .../longdo/LongdoMapViewControllerRaster.kt | 10 ++++++++-- .../com/mapconductor/longdo/LongdoOverlayStacking.kt | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/mapconductor/longdo/LongdoMapViewControllerRaster.kt b/src/main/java/com/mapconductor/longdo/LongdoMapViewControllerRaster.kt index 5940967..2429862 100644 --- a/src/main/java/com/mapconductor/longdo/LongdoMapViewControllerRaster.kt +++ b/src/main/java/com/mapconductor/longdo/LongdoMapViewControllerRaster.kt @@ -1,6 +1,7 @@ package com.mapconductor.longdo import com.mapconductor.core.controller.OverlayKind +import com.mapconductor.core.polygon.POLYGON_TILE_LAYER_ID import com.mapconductor.core.raster.RasterHeaderRuleSet import com.mapconductor.core.raster.RasterLayerSource import com.mapconductor.core.raster.RasterLayerState @@ -40,7 +41,12 @@ internal fun LongdoMapViewController.applyRaster(state: RasterLayerState) { private fun rasterAddLayerJs( layerSpec: String, state: RasterLayerState, -): String = LongdoOverlayStacking.addLayerJs(layerSpec, OverlayKind.RasterLayer, state.zIndex) +): String = + if (state.id == POLYGON_TILE_LAYER_ID) { + LongdoOverlayStacking.addPolygonTileLayerJs(layerSpec) + } else { + LongdoOverlayStacking.addLayerJs(layerSpec, OverlayKind.RasterLayer, state.zIndex) + } internal fun LongdoMapViewController.runRasterJs(js: String) { runCatching { longdoMap.run(js) {} } @@ -126,7 +132,7 @@ internal fun LongdoMapViewController.readdRastersAfterStyleSwapJs(rasters: List< if (state.id == markerTileState?.id) { LongdoOverlayStacking.addMarkerTileLayerJs(layerSpec) } else { - LongdoOverlayStacking.addLayerJs(layerSpec, OverlayKind.RasterLayer, state.zIndex) + rasterAddLayerJs(layerSpec, state) } "try{if(!m.getSource('$srcId'))m.addSource('$srcId',$spec);" + "if(!m.getLayer('$layerId'))$addLayer}catch(e){}" diff --git a/src/main/java/com/mapconductor/longdo/LongdoOverlayStacking.kt b/src/main/java/com/mapconductor/longdo/LongdoOverlayStacking.kt index 20d3f90..b561c02 100644 --- a/src/main/java/com/mapconductor/longdo/LongdoOverlayStacking.kt +++ b/src/main/java/com/mapconductor/longdo/LongdoOverlayStacking.kt @@ -30,6 +30,9 @@ internal object LongdoOverlayStacking { zIndex: Int = 0, ): String = "($FN)(m,$layerSpec,${OverlayStacking.band(kind)},$zIndex);" + /** ポリゴンのタイル: ポリゴンの帯の一番下(画像になったポリゴンであって、地図の画像ではない)。 */ + fun addPolygonTileLayerJs(layerSpec: String): String = addLayerJs(layerSpec, OverlayKind.Polygon, Int.MIN_VALUE) + /** マーカーのタイル: マーカーの帯の一番下。 */ fun addMarkerTileLayerJs(layerSpec: String): String = addLayerJs(layerSpec, OverlayKind.Marker, Int.MIN_VALUE) } From 639f94fe93fd8714311ef4eb0589a94a85f9fc7c Mon Sep 17 00:00:00 2001 From: Masashi Katsumata Date: Mon, 9 Nov 2026 06:55:03 -0800 Subject: [PATCH 3/3] Update the API baseline Additions only: the polygon tiles' stacking key, and declarations develop added without running apiDump (TILE_REFRESH_COALESCE, and on ArcGIS the marker controller's constructor that takes a boolean). --- api/android-for-longdo.api | 1 + 1 file changed, 1 insertion(+) diff --git a/api/android-for-longdo.api b/api/android-for-longdo.api index 1678d7a..bbab706 100644 --- a/api/android-for-longdo.api +++ b/api/android-for-longdo.api @@ -194,6 +194,7 @@ public final class com.mapconductor.longdo.LongdoMapViewScope extends com.mapcon public final class com.mapconductor.longdo.LongdoOverlayStacking { public static final com.mapconductor.longdo.LongdoOverlayStacking INSTANCE; public final java.lang.String addLayerJs(java.lang.String, com.mapconductor.core.controller.OverlayKind, int); + public final java.lang.String addPolygonTileLayerJs(java.lang.String); public final java.lang.String addMarkerTileLayerJs(java.lang.String); } public final class com.mapconductor.longdo.LongdoOverlayState {