
    dj!                     v   d Z ddlZddlmc mZ ddlZddl	Z	 e	j                  dd      ZddlmZmZ ddlmZ ddlmZmZmZ dd	lmZ  ej,                          d
\  ZZZd\  ZZdZdZeeez  dz  z   eeez  dz  z
  cZZd Z d Z!d Z" e	jF                  d      d        Z$d Z%ddZ&d Z'd Z(ddZ)d Z*d Z+y)u  Päästä päähän -testi synteettisellä aineistolla: pieni EPSG:3067-GeoTIFF
-> XYZ-ruudut -> puretut korkeudet vastaavat lähtöpintaa.

Ohitetaan automaattisesti, jos GDAL:ia ei ole asennettu.

Testipisteiden lon/lat-koordinaatit lasketaan aina osr-muunnoksella
EPSG:3067-koordinaateista — ei käsin arvattuja arvoja, jotta testi ei
riipu siitä missä päin Suomea synteettinen alue sijaitsee.
    Nosgeoz GDAL:n Python-sidokset puuttuvat)reason)gdalosr)Image)
gdal_utils	terrariumtilemath)generate_tiles)      Y@gMbp?gMb`)g     #Ag    ޶ZAi  g       @c                 R    t         t        | t        z
  z  z   t        |t        z
  z  z   S N)ABE0CN0)ens     6/home/claude/oh9ab/pipeline/tests/test_pipeline_e2e.pyplaner   %   s"    qAF|a1r6l**    c                 >   t        j                         }|j                  |        t        j                         }|j                  |       |j                  t         j                         |j                  t         j                         t        j
                  ||      S r   )r   SpatialReferenceImportFromEPSGSetAxisMappingStrategyOAMS_TRADITIONAL_GIS_ORDERCoordinateTransformation)src_epsgdst_epsgsrcdsts       r   
_transformr#   )   su    



 Cx 



 Cx s==>s==>''S11r   c                 J    t        dd      j                  | |      \  }}}||fS )N  i  )r#   TransformPoint)r   r   lonlat_s        r   	to_lonlatr*   3   s*    T4(771=KCa8Or   module)scopec                 N   t        | j                  d      dz        }t        t        j                  t
              dz   t        z  z   }t        t        j                  t
              dz   t        z  z
  }t        j                  ||      \  }}t        ||      j                  t        j                        }t        j                  d      }|j                  |t
        t
        dt        j                        }|j!                  t        t        dt        dt         f       t#        j$                         }	|	j'                  d       |j)                  |	j+                                |j-                  d      }
|
j/                  d       |
j1                  |       |j3                          d }|S )	Ndemzsynth3067.tif      ?GTiff   r   r%   g    )strmktempr   nparangeSIZERESr   meshgridr   astypefloat32r   GetDriverByNameCreateGDT_Float32SetGeoTransformr   r   r   SetProjectionExportToWktGetRasterBandSetNoDataValue
WriteArray
FlushCache)tmp_path_factorypathcolsrowseenndatadrvdssrsbands              r   synthetic_demrP   8   s:   &&u-?@D43&#--D43&#--D[[t$FBR=

+D


w
'C	D$a)9)9	:BCBC401



 CtS__&'AD OODMMO	BKr   c                     t        j                  | ||      \  }}}}t        j                  |      }||dz   |z  z   ||dz   |z  z
  fS )Nr/   )r
   tile_bounds_3857
resolution)	txtyzoomijminxr)   maxyress	            r   _pixel_center_3857r\   N   sT    00R>D!Q


d
#C1s7c/!41s7c/#999r   c                     t         |z   | cxk  xr t         t        t        z  z   |z
  k  nc xr, t        t        t        z  z
  |z   |cxk  xr t        |z
  k  S c S r   )r   r6   r7   r   )r   r   margins      r   _inside_interiorr_   T   sP    K!6b4#:o66 ;TCZ&(1:rF{:<:<r   c                 |	   d}t        t        t              \  }}t        j                  |||      \  }}t        j                  | |||||      }t        j                  |||||      }d}||u}	|	st        j                  d|	fd||f      dt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }
dd|
iz  }t        t        j                  |            dx}	}t        j                   |||      \  }}}}t        j"                  |      }t        j$                  ||      \  }}t'        ||z
  |z        }t'        ||z
  |z        }t)        |||||      \  }}t+        d	d
      j-                  ||      \  }}}t/        ||      }|sddt        j                         v st        j                  t.              rt        j                  t.              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      dz  }t        t        j                  |            d}|||f   }t0        j2                  }t5        ||      }d} |||      }||k(  }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j                  t0              rt        j                  t0              ndt        j                  |      dt        j                         v st        j                  t4              rt        j                  t4              nddt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d	z  }dd|iz  } t        t        j                  |             dx}x}x}x}x}}y)u   N2000-varmistus: warp 3067->3857 ei saa muuttaa korkeusarvoja
    (ei pystymuunnosta). Verrataan warpatun rasterin pikseliarvoa samassa
    maastopisteessä laskettuun tasoon.   N)is not)z%(py0)s is not %(py3)sarrpy0py3assert %(py5)spy5  r%   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}r_   r   r   )re   py1py2py4皙?abs==z%(py1)s == %(py14)s
{%(py14)s = %(py5)s
{%(py5)s = %(py3)s.approx
}(%(py10)s
{%(py10)s = %(py6)s(%(py7)s, %(py8)s)
}, abs=%(py12)s)
}pytestr   	rj   rf   rh   py6py7py8py10py12py14assert %(py16)spy16)r*   ECNCr
   lonlat_to_tiler   warped_vrt_for_zoomread_tile_window
@pytest_ar_call_reprcompare@py_builtinslocals_should_repr_global_name	_safereprAssertionError_format_explanationrR   rS   lonlat_to_3857intr\   r#   r&   r_   rs   approxr   )!rP   rV   r'   r(   rT   rU   rM   rc   @py_assert2@py_assert1@py_format4@py_format6rY   r)   rZ   r[   mxcmycrX   rW   mxmyr   r   @py_assert3@py_format5@py_assert0@py_assert4@py_assert9@py_assert11@py_assert13@py_format15@py_format17s!                                    r   test_heights_survive_warpr   Y   sm    DR HC$$S#t4FB		'	'tRR	LB

%
%b"b"b
9C  00R>D!Q


d
#C&&sC0HCS4Z3ATCZ3ABa3FBt$33B;GAq!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! =<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<r   c                  	   |dz  }t        | |dgd       }d}||k\  }|st        j                  d|fd||f      dt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            d x}}t        dd      }d}	t        |j                  d            D ]   }
t        |
j                  j                        }t        |
j                        }t!        j"                  t%        j&                  |
      j)                  d            }t+        j,                  |      }t/        dt0        j2                  d      D ]^  }t/        dt0        j2                  d      D ]<  }t5        ||d||      \  }}|j7                  ||      \  }}}t9        ||      s9|||f   }t:        j<                  }t?        ||      }d} |||      }||k(  }|st        j                  d|fd||f      t        j                  |      dt        j                         v st        j
                  t:              rt        j                  t:              ndt        j                  |      dt        j                         v st        j
                  t>              rt        j                  t>              nddt        j                         v st        j
                  |      rt        j                  |      nddt        j                         v st        j
                  |      rt        j                  |      ndt        j                  |      t        j                  |      t        j                  |      d	z  }dd|iz  }t        t        j                  |            d x}x}x}x}x}}|	dz  }	? a  d}|	|k\  }|st        j                  d|fd|	|f      dt        j                         v st        j
                  |	      rt        j                  |	      ndt        j                  |      d	z  }d
d|iz  }t        t        j                  |            d x}}y ) Ntiles   c                       y r    as    r   <lambda>z0test_generate_tiles_end_to_end.<locals>.<lambda>v       r   zoomsprogressr1   )>=)z%(py0)s >= %(py3)swrittenrd   rg   rh   ri   r%   r   z
13/*/*.pngRGB      rm   rn   rp   rr   rs   r   r   r   rt   r{   r|   
   checked) r   r   r   r   r   r   r   r   r   r#   sortedglobr   parentnamestemr4   asarrayr   openconvertr	   decoderanger
   	TILE_SIZEr\   r&   r_   rs   r   r   )rP   tmp_pathoutr   r   r   r   r   trr   pngrT   rU   rgbhrW   rX   r   r   r   r   r)   r   r   r   r   r   r   r   s                                r   test_generate_tiles_end_to_endr   s   sa   
W
C]Ct&57G 
D$	BGchh|,- !]jjC0078S!q(,,b1 	A1h00"5 +BB1=B++B31a'1-FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1	 r   c                    t        j                  d      }|j                  t        |       |j                  d   |j                  d   dt         j
                        }|j                  t        ddt        ddf       t        j                         }|j                  d       |j                  |j                                |j                  d      }|j                  |       |j!                  |       |j#                          t        |       S )un   Kirjoita UInt16-rasteri samaan 3067-ruudukkoon kuin synthetic_dem,
    mutta 16 m pikselillä (MVMI:n tapaan).r0   r1   r   g      0@g      0r%   )r   r;   r<   r2   shape
GDT_UInt16r>   r   r   r   r   r   r?   r@   rA   rB   rC   rD   )rF   rK   nodatarL   rM   rN   rO   s          r   _write_uint16r      s     

w
'C	CItzz!}djjmQOO
%BD!RE23



 CtS__&'ADOODMMOt9r   c           
      :	   d}t        j                  ||fdt         j                        }t        j                  ||fdt         j                        }d||dz  dd|dz  f<   d||dz  dd|dz  f<   t        | dz  |      }t        | d	z  |      }| d
z  }t	        ||dgd|dd       }t        j                  g t        j                  |      d \  }}	}
}|
|z
  dz   ||	z
  dz   z  }d}||k  }||k  }|r|st        j                  d||fd|||f      t        j                  |      dt        j                         v st        j                  |      rt        j                  |      nddt        j                         v st        j                  |      rt        j                  |      nddz  }dd|iz  }t        t        j                   |            dx}x}}t#        dd      }d}|j%                  d      D ]4  }t'        |j(                  j*                        t'        |j,                        }}t        j.                  t1        j2                  |      j5                  d            }t7        dt
        j8                  d      D ]  }t7        dt
        j8                  d      D ]  }t;        ||d||      \  }}|j=                  ||      \  }}}t>        dz   |cxk  rt>        |d z  dz  z   dz
  k  sOn Rt@        |d z  z
  dz   |cxk  rt@        |d z  dz  z
  dz
  k  s{n ~|||d!f   }d}||k(  }|slt        j                  d"|fd#||f      t        j                  |      t        j                  |      d$z  }d%d&|iz  } t        t        j                   |             dx}x}}|||df   }d}||k(  }|slt        j                  d"|fd#||f      t        j                  |      t        j                  |      d$z  }d%d&|iz  } t        t        j                   |             dx}x}}d'}  7 |sed(d)d*t        j                         v st        j                  |      rt        j                  |      nd*iz  }!t        t        j                   |!            y)+u   Regressio: UInt16-lähteellä (MVMI) dstNodata=-32768 ei mahdu
    arvoalueeseen. Ennen korjausta GDAL leikkasi sen nollaksi, jolloin
    nodata sekoittui arvoon 0 eikä yhtään ruutua ohitettu tyhjänä.}     )dtype      N<   zkp.tifzlp.tifr      forestg?c                       y r   r   r   s    r   r   z+test_forest_uint16_nodata.<locals>.<lambda>   r   r   )r   mode
cover_pathheight_scaler   r1   <=<z%(py1)s <= %(py4)sz%(py4)s < %(py5)sr   
candidatesrj   rl   rh   assert %(py7)srv   ri   r%   Fz
15/*/*.pngr      r   d   r   r   rp   )z%(py1)s == %(py4)s)rj   rl   zassert %(py6)sru   Tzassert %(py0)sre   found)!r4   fulluint16r   r   r
   
tile_ranger   source_bounds_lonlatr   r   r   r   r   r   r   r   r#   r   r   r   r   r   r   r   r   r   r   r   r\   r&   r   r   )"r   r   	height_dmcoverkplpr   r   x0y0x1y1r   r   r   r   r   @py_format8r   r   r   rT   rU   r   rW   rX   r   r   r   nposr)   r   @py_format7@py_format1s"                                     r   test_forest_uint16_nodatar      s    	AARYY7IGGQFE3E"%Ia1fgwQw E!q&'7AF7
	x(*I	6B	x(*E	2B
W
CRRDx(*&57G
 (( 2		(	(	,2.02NBBr'A+"r'A+.J$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 
D$	BExx% !SZZ__%s388}BjjC0078q(,,a0 		!A1h00!4 !+BB1=B..r26
4Hq82B
?S#88RK#-LrAFQJ7LL---------------------------------- E!		!! LLLLLLLLLLLLr   c                    t        t        dz
  t        dz
        \  }}t        t        dz   t        dz         \  }}t        ||      t        ||      t	        ||      t	        ||      f}|dz  }|dz  }t        | |dgd       }	t        | |dg|d       }
d	}||
k  }|
|	k  }|r|st        j                  d
||fd||
|	f      t        j                  |      dt        j                         v st        j                  |
      rt        j                  |
      nddt        j                         v st        j                  |	      rt        j                  |	      nddz  }dd|iz  }t        t        j                  |            d x}x}}y )N   allboxr   c                       y r   r   r   s    r   r   z.test_bounds_limit_tile_count.<locals>.<lambda>   r   r   r   c                       y r   r   r   s    r   r   z.test_bounds_limit_tile_count.<locals>.<lambda>   r   r   )r   boundsr   r1   r   r   n_boxn_allr   r   rv   )r*   r}   r~   minmaxr   r   r   r   r   r   r   r   r   )rP   r   lon0lat0lon1lat1r   out_allout_boxr   r   r   r   r   r   r   s                   r   test_bounds_limit_tile_countr     s     28R#X.JD$28R#X.JD$$os4$os40FGG='"$35E='""(?DEr   )r   )r   ),__doc__builtinsr   _pytest.assertion.rewrite	assertionrewriter   numpyr4   rs   importorskipr   r   r   PILr   pipeliner   r	   r
   pipeline.build_tilesr   UseExceptionsr   r   r   r   r   r6   r7   r}   r~   r   r#   r*   fixturerP   r\   r_   r   r   r   r   r  r   r   r   <module>r     s       G,NO   4 4 /    
 1a 
B		dSj3	TCZ#%5 5B+2
 h  *:<
=46"(Vr   