
    dj                     l   d Z ddlZddlZddlZddlZddlmZ ddlZddl	m
Z
 edv rUej                  j                  d e ee      j!                         j"                  j"                               ddlmZmZmZ n
ddlmZmZmZ d Zd	efd
Zd	efdZd ZddddefdZd ZddZedk(  r e        yy)u  Datankäsittelyputken CLI: EPSG:3067-rasterit -> XYZ-PNG-ruudut (EPSG:3857).

Käyttö:

  # 1) Yhdistä karttalehdet virtuaalirasteriksi (ei kopioi dataa):
  python pipeline/build_tiles.py vrt --input data/dem/*.tif --out data/dem.vrt

  # 2) Korkeusruudut (Terrarium-koodaus):
  python pipeline/build_tiles.py tiles --input data/dem.vrt       --out tiles/dem --zoom 9-14

  # 3) Puustoruudut (R = keskipituus m, G = latvuspeittävyys %):
  python pipeline/build_tiles.py tiles --mode forest       --input data/mvmi_keskipituus.vrt --input-cover data/mvmi_latvus.vrt       --height-scale 0.1 --out tiles/forest --zoom 9-14

Testialueen voi rajata: --bounds minlon,minlat,maxlon,maxlat

Ulostulo on tavallinen slippy-XYZ-hakemistopuu out/{z}/{x}/{y}.png, jonka
selainprototyyppi lukee custom-ruutulähteenä.

Korkeudet ovat N2000-korkeuksia lähtöaineiston mukaisesti; putki ei tee
(eikä saa tehdä) pystymuunnoksia — ks. gdal_utils.py.
    N)Path)Image)N )
gdal_utils	terrariumtilemath   c                      t        | ddi y)ug   Oletustulostus edistymiselle; flush jotta nohup-loki päivittyy
    reaaliajassa eikä jää puskuriin.flushTN)print)argss    */home/claude/oh9ab/pipeline/build_tiles.pyprint_flushr   +   s     
4t    specc                     d| v r,| j                  dd      \  }}t        |      t        |      }}nt        |       x}}d|cxk  r|cxk  rdk  sn t        d| z        t        ||dz         S )z.'9-14' -> range(9, 15); '12' -> range(12, 13).-r	   r      u   zoom-väli %s ei kelpaa)splitint
ValueErrorrange)r   lohis      r   
parse_zoomr   1   sp    
d{C#BR#b'Bd)RrR2T9::R!Vr   c                     | j                  d      D cg c]  }t        |       }}t        |      dk7  s|d   |d   k\  s|d   |d   k\  rt        d| z        t	        |      S c c}w )z1'minlon,minlat,maxlon,maxlat' -> tuple[float, 4].,   r      r	      zbounds %s ei kelpaa)r   floatlenr   tuple)r   ppartss      r   parse_boundsr&   =   sj    #zz#/!U1X/E/
5zQ%(eAh.%(eAh2F.566< 0s   A%c                    g }| j                   D ]*  }t        t        j                  |            }||r|n|gz  }, |st        d      t	        j
                  || j                         t        d| j                  t        |      fz         y )Nu&   Yhtään syötetiedostoa ei löytynyt.u#   VRT kirjoitettu: %s (%d lähdettä))	inputsortedglob
SystemExitr   	build_vrtoutr   r"   )r   inputspatternhitss       r   cmd_vrtr1   E   s}    F:: .dii()$$WI-. ABB*	
/488S[2I
IJr   	elevation      ?c           
      L   t        |      }|0t        j                  |       } |d|d   |d   |d   |d   fz         d}t        j                         }	|D ]  }
t	        j
                  g ||
 \  }}}}||z
  dz   ||z
  dz   z  } |d|
|||||fz         d}t        j                  | |
|||||      }d}|d	k(  r(|t        d
      t        j                  ||
|||||      }t        ||dz         D ]  }t        ||dz         D ]  }t        j                  |||||      }||dk(  rt        j                  |      }nXt        j                  |||||      }|$t        j                  |t        j                        }t        j                  ||z  |      }|t!        |
      z  t!        |      z  }|j#                  dd       t%        j&                  |d      j)                  |d|z  z         |dz  }  d}d}  |d|t        j                         |	z
  |fz         |S )uq   Putken ydin, kutsuttavissa myös testeistä ilman CLI:tä.

    Palauttaa kirjoitettujen ruutujen määrän.
    Nu4   Kattavuus lähteestä: lon %.4f..%.4f lat %.4f..%.4fr   r   r	   r    z#z%d: %d ruutua (x %d..%d, y %d..%d)averageforestz forest-tila vaatii --input-coverr2   T)parentsexist_okRGBz%d.pngz,Valmis: %d ruutua kirjoitettu (%.1f s) -> %s)r   r   source_bounds_lonlattimer   
tile_rangewarped_vrt_for_zoomr   r   read_tile_windowr   encodenp	full_likenanencode_foreststrmkdirr   	fromarraysave)src_pathout_dirzoomsmode
cover_pathheight_scaleboundsprogresswrittent_startzoomx0y0x1y1n_tilesresampledsds_covertytxarrrgbcovertile_dirs                            r   generate_tilesra   P   sz    7mG~00:G1Ivay&)VAYK8 8 	9 GiikG )!,,;f;d;BB7Q;27Q;/6'2r2r:+ + 	, ++HdBB,468! !CDD!55D"b"b(<H BF# 	BBQ'  11"b"b"E;;&#**3/C&77"b8:B@E} "S"&& 9#11#2DeLC"SY.R8td;U+00X]1KL1	$ S)V ;w&?1 1 2Nr   c           	          | j                   rt        | j                         nd }t        | j                  | j                  t        | j                        | j                  | j                  | j                  |       y )N)rH   rI   rJ   rK   rL   rM   rN   )
rN   r&   ra   r(   r-   r   rR   rK   input_coverrM   )r   rN   s     r   	cmd_tilesrd      sV    *.++\$++&4F#YY##&&r   c                    t        j                  d      }|j                  dd      }|j                  dd      }|j	                  d	d
dd       |j	                  ddd       |j                  t               |j                  dd      }|j	                  d	dd       |j	                  ddd       |j	                  ddd       |j	                  ddd       |j	                  dd       |j	                  dt        d d!"       |j	                  d#d$       |j                  t               |j                  |       }|j                  |       y )%Nz4MML/Luke-rasterit -> XYZ-PNG-ruudut selainta varten.)descriptioncmdT)destrequiredvrtu   yhdistä karttalehdet VRT:ksi)helpz--input+z,tiedostot tai glob-kuviot (esim. data/*.tif))nargsri   rk   z--outzulostulo-VRT)ri   rk   )functilesztuota XYZ-PNG-ruudutu*   lähderasteri (VRT tai GeoTIFF, EPSG:3067)zruutuhakemiston juuriz--zoomz9-14zesim. 9-14 tai 12)defaultrk   z--mode)r2   r6   r2   )choicesrp   z--input-coveru-   latvuspeittävyysrasteri (vain --mode forest)z--height-scaler3   uC   kerroin lähteen korkeusyksiköstä metreihin (MVMI: dm -> m = 0.1))typerp   rk   z--boundsz+rajaus: minlon,minlat,maxlon,maxlat (WGS84))argparseArgumentParseradd_subparsers
add_parseradd_argumentset_defaultsr1   r!   rd   
parse_argsrn   )argvapsubap_vrtap_tr   s         r   mainr      ss   		 	 J
LB




6C^^E(G^HF
	tK  M
$^D
W%>>'(>>?Di$G  Ig3JKh5HIh(?)  +oJ  L&UC3  4 	jH  J9%==DIIdOr   __main__)N)__doc__rs   r*   sysr;   pathlibr   numpyr@   PILr   __package__pathinsertrD   __file__resolveparentpipeliner   r   r   r   r   r   r&   r1   ra   rd   r   __name__ r   r   <module>r      s   2   
     *HHOOAs4>113::AABC8811	S 	s K 3>"T'<~
> zF r   