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 { diff --git a/src/main/java/com/mapconductor/longdo/LongdoMapViewController.kt b/src/main/java/com/mapconductor/longdo/LongdoMapViewController.kt index cdf631e..594159d 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/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) } 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? }) } }