@@ -405,19 +405,44 @@ def _detect_geometry_type(
405405 )
406406 return "unknown"
407407
408+ @staticmethod
409+ def _has_anchor_layer (pmtiles_path : "Path" ) -> bool :
410+ """Check if a PMTiles file already contains a default_anchor layer."""
411+ try :
412+ from pmtiles .reader import MmapSource
413+ from pmtiles .reader import Reader as PMTilesReader
414+
415+ with open (pmtiles_path , "rb" ) as f :
416+ reader = PMTilesReader (MmapSource (f ))
417+ meta = reader .metadata ()
418+ layers = [l ["id" ] for l in meta .get ("vector_layers" , [])]
419+ return "default_anchor" in layers
420+ except Exception :
421+ return False
422+
408423 def _process_layer (
409424 self : Self ,
410425 layer : LayerInfo ,
411426 force : bool = False ,
412427 dry_run : bool = False ,
413428 show_progress : bool = True ,
429+ skip_existing_anchors : bool = False ,
414430 ) -> SyncResult :
415431 """Process a single layer - generate PMTiles if needed."""
416432 generator = self ._get_generator ()
417433
418434 try :
419435 pmtiles_path = generator .get_pmtiles_path (layer .user_id , layer .layer_id )
420436
437+ # Skip if already has anchor layer (for resumable polygon migration)
438+ if skip_existing_anchors and pmtiles_path .exists ():
439+ if self ._has_anchor_layer (pmtiles_path ):
440+ return SyncResult (
441+ layer_id = layer .layer_id ,
442+ status = "skipped" ,
443+ message = "Already has anchor layer" ,
444+ )
445+
421446 # Check if regeneration is needed
422447 if pmtiles_path .exists () and not force :
423448 if generator .is_pmtiles_in_sync (pmtiles_path , layer .snapshot_id ):
@@ -613,6 +638,7 @@ def run(
613638 force = params .force ,
614639 dry_run = params .dry_run ,
615640 show_progress = params .show_progress ,
641+ skip_existing_anchors = params .geometry_type_filter == "polygon" ,
616642 )
617643
618644 if result .status == "generated" :
0 commit comments