
    L!.i}                        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 ddlZddlZddlmZ ddlmZ dZd Zd+d
Zd,dZedk(  rj ej0                  d      Zej5                  dd       ej5                  ddde d       ej7                         Zej:                  j=                         Z	  eej>                        Zedz   dZ$ ed      ez  Z%e%e de$ dz  Z&e&jO                         s e"de&         ejF                  d        e"de&jP                           ejR                  e&d e$ !      Z*e*jV                  r e"d"        ejF                  d       ejY                          d#e$ d$Z-e%e de$ d%z  Z.e%e de$ d&z  Z/ ee*dd	e-e.'       	  ee*ee/d(        e"d)e/        yy# e $ r(Z! e"de!         ejF                  d       Y dZ![!dZ![!ww xY w# e $ rZ! e"d*e!        Y dZ![!ydZ![!ww xY w)-u   
Visualize road density heatmap for a given state.

✅ Features:
 - Loads {state}_road_density_<size>.gpkg
 - Automatically chooses column & color map
 - Supports multiple grid resolutions (2km, 5km, etc.)
 - Saves optional PNG output for reporting
    N)Path)	rasterize)from_originGRID_CELL_SIZE_METERSc                     | xs t        j                  t              }|t        dt         d      	 t	        |      S # t        $ r}t        d| dt         d      |d}~ww xY w)z8Resolve cell size from CLI args or environment variable.Nz8Cell size must be passed as an argument or provided via .zInvalid cell size 'z'. Provide an integer or set )osgetenvCELL_SIZE_ENV_VAR
ValueErrorint)explicit_value	raw_valueexcs      +/data2/heatmap/scripts/visualize_heatmap.pyresolve_cell_sizer      s}    >")),=">IFGXFYYZ[
 	
9~ !),IJ[I\\]^
	s   
? 	A$AA$length_mhotc                 j   t        j                  d      \  }}| j                  |||ddddddd	
      }|j                  |xs d| ddd       |j	                  d       t        j
                          |r't        j                  |dd       t        d|        yt        j                          y)z$Plot density heatmap from grid data.)      )figsizeTr   zTotal Road Length (meters)g333333?g{Gz?vertical)labelshrinkpadorientation)columncmapaxlegend	linewidthlegend_kwdszRoad Density ()   r   )fontsizer   offi,  tight)dpibbox_inchesu   💾 Saved heatmap to: N)	pltsubplotsplot	set_titleaxistight_layoutsavefigprintshow)gridr   r   title	save_pathfigr    	grid_plots           r   plot_heatmapr9   +   s    ll7+GC		1%	
  I LL4N6(!4rrLJGGENI3G<'	{34
    c                 h   || j                   vrt        d| d      | j                  t        d      | j                  \  }}}}t	        t        j                  ||z
  |z              }t	        t        j                  ||z
  |z              }	|dk  s|	dk  rt        d      t        ||||      }
g }t        | j                  | |         D ]I  \  }}|%t        |t              rt        j                  |      r.|j                  |t        |      f       K t        ||	|f|
t        j                   d      }t#        j$                  |d	d
|	|dd| j                  j'                         |
t        j                   
      5 }|j)                  |j+                  d      d       ddd       y# 1 sw Y   yxY w)z/Rasterize the density grid and save as GeoTIFF.zColumn 'z' not found in grid.Nz-Grid CRS is undefined; cannot export GeoTIFF.r   z5Invalid grid bounds; cannot derive raster dimensions.float32)shapes	out_shape	transformfilldtypewGTiff   )driverheightwidthcountrA   crsr?   nodata)columnsr   rI   total_boundsr   mathceilr   zipgeometry
isinstancefloatisnanappendr   npnanrasterioopento_wktwriteastype)r4   	cell_sizeout_pathr   minxminymaxxmaxyrG   rF   r?   r=   geomvaluerasterdsts                   r   save_density_geotiffrf   G   s   T\\!8F8+?@AAxxHII!..D$d		4$;)345ED4K9456FzVq[PQQD$	9=IF4==$v,7e=Zu5$**U:KtU5\*+ 8
 5/VVF 
HHOOvv
 
		&--	*A.
 
 
s   ="F((F1__main__z4Visualize road density using grid GeoPackage output.)descriptionstatezState name (e.g., alabama).)helpr\   ?z.Grid cell size in meters. Defaults to env var z
 if unset.)nargsrj   u   ❌ rD   i  kmOSM_State_Files_road_density_z.gpkgu   ❌ File not found: u   📦 Loading density data from road_density_)layeru!   ⚠️ No features found to plot.z Road Density (z grid)z.pngz.tif)r   r   r5   r6   )r   u"   🗺️ Saved GeoTIFF heatmap to: u   ⚠️ Could not save GeoTIFF: )r   r   NN)r   )0__doc__argparserM   r	   syspathlibr   	geopandasgpdmatplotlib.pyplotpyplotr+   numpyrU   rW   rasterio.featuresr   rasterio.transformr   r   r   r9   rf   __name__ArgumentParserparseradd_argument
parse_argsargsri   lowerr\   r   errr2   exitgrid_size_labelbase_dir
input_pathexistsname	read_filer4   empty
capitalizer5   
output_png
output_tif r:   r   <module>r      sb     	 
      ' *+ 8)/V z$X$$JF &CD
%%6$7zC   DJJE%dnn5	 #D),O%&.Hug^O3DEJJJ$ZL12	+JOO+<
=>3==]?:K+LMDzz12!"//1B&IEug^O3DDIIJug^O3DDIIJjuEZX7T9jL2:,?@U    SEl6  7/u5667s0   3F5 G% 5G":GG"%G?*G::G?