
    dj                     B    d Z ddlZddlmZ dZd Zd Zd Z	 dd	Z	d
 Z
y)u`  Ohuet kääreet GDAL-kutsuille.

Kaikki GDAL-riippuvuus on tässä moduulissa, jotta terrarium.py ja
tilemath.py pysyvät testattavina ilman GDAL-asennusta.

KORKEUSJÄRJESTELMÄ (tärkeä):
MML:n korkeusmalli on N2000-korkeuksia. EPSG:3067 on 2D-koordinaatisto,
joten gdal.Warp muuntaa vain tasokoordinaatit (3067 -> 3857) eikä PROJ
yritä pystymuunnosta — pikseliarvot (korkeudet) kulkevat läpi
koskemattomina. Tämä on varmistettu testillä
tests/test_pipeline_e2e.py::test_heights_survive_warp.
Jos lähtöaineistoon joskus ilmestyy 3D-CRS (compound CRS), tämä oletus
pitää tarkistaa uudelleen.
    N   )tilemathg      c                  v    	 ddl m} m} | j                          | |fS # t        $ r}t	        d      |d}~ww xY w)u=   Palauttaa (gdal, osr) tai kaatuu selkeällä asennusohjeella.r   )gdalosrzGDAL:n Python-sidokset puuttuvat.
Asenna esim.:  pip install gdal   (viralliset wheelit, GDAL >= 3.9)
tai conda-forge:  conda install -c conda-forge gdalN)osgeor   r   ImportError
SystemExitUseExceptions)r   r   es      )/home/claude/oh9ab/pipeline/gdal_utils.pyimport_gdalr      sL    # 	9  B
 		s    	838c           	          t               \  }}|j                  t        |      | D cg c]  }t        |       c}      }|t        d|z        |j	                          |S c c}w )us   gdalbuildvrt: yhdistä karttalehdet virtuaalirasteriksi (ei mosaikoi
    fyysisesti — VRT on vain viittauslista).u   gdal.BuildVRT epäonnistui: %s)r   BuildVRTstrRuntimeError
FlushCache)inputsout_pathr   _pvrts         r   	build_vrtr   '   s]     mGD!
--H'?1A'?
@C
{;hFGGNNO	 (@s   A"
c           	         t               \  }}|j                  t        |             }|j                         }|j                  |j
                  }}|j                  |j                               }|j                         }|j                  d       |j                  |j                         |j                  |j                         |j                  ||      }	g }
d}t        |dz         D ]6  }||z  }|
||z  df||z  t        |      fd||z  ft        |      ||z  fgz  }
8 |
D cg c]3  \  }}|d   ||d   z  z   ||d   z  z   |d   ||d   z  z   ||d	   z  z   f5 }}}|D cg c]  \  }}|	j                  ||      d
d  }}}|D cg c]  }|d   	 }}|D cg c]  }|d   	 }}t        |      t        |      t!        |      t!        |      fS c c}}w c c}}w c c}w c c}w )u   Lähderasterin kattavuus WGS84 lon/lat -laatikkona
    (minlon, minlat, maxlon, maxlat).

    Muunnetaan rasterin reunojen pisteistö (ei vain kulmat), koska
    projektiomuunnoksessa laatikon ääriarvot voivat osua reunan
    keskelle.
    i     r           r               N)r   Openr   GetGeoTransformRasterXSizeRasterYSizeSpatialReferenceGetProjectionImportFromEPSGSetAxisMappingStrategyOAMS_TRADITIONAL_GIS_ORDERCoordinateTransformationrangefloatTransformPointminmax)src_pathr   r   dsgtwhsrcdsttredgenitcrptsxyllr   lonslatss                          r   source_bounds_lonlatrD   2   s    ID#	3x=	!B				B>>2>>qA


r//1
2C



 Cts==>s==>		%	%c3	/BD
A1q5\ SE!a%AuQx03A,q1q5@QRRS q! qEA1IBqE	)2a51r!u9+<q2a5y+HI C 25	6$!Q"

Aq
!"1
%	6B	6QAaDDQAaDDt9c$iTCI55	6s   (8G(GG$ G)c                 L   t               \  }}t        j                  |||      \  }	}}}
t        j                  |||      \  }}}}t        j                  |      }|j	                  dt        |       dd|	|||
f|||t        |j                  d      }|t        d| |fz        |S )uh  Luo muistinvarainen warpattu VRT, joka kattaa ruudut
    [x0..x1] x [y0..y1] zoom-tasolla ja on tasattu täsmälleen
    ruutuhilaan (256 px / ruutu).

    Kaikki saman zoomin ruudut luetaan tästä samasta datasetistä
    ikkunoituna, joten naapuriruutujen resamplaus on identtinen eikä
    saumakohtiin tule artefakteja. VRT on laiska: pikselit lasketaan
    vasta ReadAsArray-kutsussa, joten koko aluetta ei materialisoida.

    resample: 'bilinear' korkeusmallille, 'average' puustolle
    (alaspäin skaalattaessa keskiarvo säilyttää metsän tilastollisen
    peittävyyden paremmin kuin pisteotanta).
     VRTz	EPSG:3857r   )	formatdstSRSoutputBoundsxResyResresampleAlg	dstNodata
outputTypeerrorThresholdu   gdal.Warp epäonnistui: %s z%d)	r   r   tile_bounds_3857
resolutionWarpr   NODATAGDT_Float32r   )r0   zoomtile_x0tile_y0tile_x1tile_y1resampler   r   minxmaxyminymaxxresr   s                  r   warped_vrt_for_zoomra   T   s     mGD!00'4HD!Q00'4HAtT1


d
#C
))
CMD$-s ##  C {;x>NNOOJ    c                 *   t         j                  }||z
  |z  }||z
  |z  }| j                  d      j                  ||||      }|j	                  t
        j                        }|t        dz   k  }	|	j                         ryt
        j                  ||	<   |S )u   Lue yhden ruudun 256x256-ikkuna warpatusta VRT:stä.

    Palauttaa float64-taulukon, jossa nodata on NaN, tai None jos ruutu
    on kokonaan nodataa (jätetään kirjoittamatta).
    r   g      ?N)
r   	TILE_SIZEGetRasterBandReadAsArrayastypenpfloat64rT   allnan)
	warped_dstile_xtile_yrW   rX   tscolrowarrmasks
             r   read_tile_windowrt   z   s     
		BGr
!CGr
!C

!
!!
$
0
0c2r
BC
**RZZ
 C&3,DxxzCIJrb   )bilinear)__doc__numpyrh   rF   r   rT   r   r   rD   ra   rt    rb   r   <module>ry      s9      
6F ",#Lrb   