U
    i                      @   s  d Z ddlZddlZddlmZ dejd< ddlZddlZ	ddl
mZ ddlZddlmZ d<dd	Zd=d
dZedkreejdk red ed ejd  Zeejdkreejd ndZed  dZede e d Zede e de d ZejZ e! s.ede  ed e! sPede  ed ede"  d ej#eddZ$ej#ede dZ%ddd d!gZ&d"d#d$d%d&d'd(gZ'd)d* e&D Z(d+d* e'D Z)ed,e(  ed-e)  e(D ]6Z*ee$e%+ e*dd.\Z,Z-ee,e-e*ee edd/d0 qe)D ]6Z*ee$e%+ e*d1d.\Z,Z-ee,e-e*ee ed1d/d0 qdZ.ede e d2 Z/e/! rz"ej#e/d3dZ.ed4e/j0  W n2 e1k
r Z2 zed5e2  W 5 dZ2[2X Y nX e.dk	rd6d* e&D Z3d7d* e'D Z4ed8e3  ed9e4  e3D ]6Z*ee.e%+ e*dd.\Z,Z-ee,e-e*ee edd:d0 qe4D ]6Z*ee.e%+ e*d1d.\Z,Z-ee,e-e*ee ed1d:d0 qPed; dS )>z
Generate heatmaps for all key OSM road attributes aggregated per grid cell.

Enhancements:
 - Aggregates attributes per grid cell (mean for numeric, mode for categorical)
 - Uses grid resolution in output filenames
 - Handles missing data gracefully
    N)Path0Z
USE_PYGEOS)	colormapsFc                 C   s   t d| d tj| |ddd}|rjdd }|d| | }|j|| d	id
d | d	}nNtj|| dd||< |d| 	  }|j|| did
d | d}|j
|d
ddd}||fS )z'Aggregate road attribute per grid cell.u   📊 Aggregating z per grid cell...innerZ
intersects)howZ	predicatec                 S   s   |   }|js|jd S tjS )Nr   )modeemptyZilocnpnan)xZmode_series r   6/data2/heatmap/scripts/visualize_all_attribute_grid.py	mode_func%   s    z'aggregate_attributes.<locals>.mode_funcZindex_right_modeT)columnsZinplaceZcoerce)errorsZ_meanleft)Z
left_indexZright_onr   )printgpdZsjoingroupbyZaggZreset_indexrenamepdZ
to_numericZmeanmerge)roadsgridattrcategoricalZjoinedr   Zgroupedattr_colr   r   r   aggregate_attributes   s    
r   c                 C   s  t jdd\}}	|jd |	d |  j}
|rZ|  d|  d| d| d}n|  d|  d| d}td| d	| d
|pd d |r| |  	 }t
|dkrd}nd}| j||	dd|ddd|tdd |D ddddd |
j|	ddd n| |  js6t| |  ddgnd\}}td  }|jdd! | j||d|	d|||d"d#d$dddd%	 |
j|	ddd |	j|d&d'd( |	d) t   || d*| d+| d, }t j|d-d.| d/ t | td0|j  d S )1N)   
   )ZfigsizeZwhiteu    — z (z, )u   
🔎 Plotting z heatmap for z grid (layer=r   z)...   Ztab20ZSet2Tr   )gRQ?   z
upper leftc                 S   s   g | ]}t |qS r   )str).0vr   r   r   
<listcomp>`   s     z*plot_attribute_heatmap.<locals>.<listcomp>)Zbbox_to_anchorZloctitleZlabelszNo Data)colorlabel)columnaxlegendr   cmap	linewidthlegend_kwdsmissing_kwdsZblackg      ?)r,   r)   r/      _   )r   r#   Zinferno)r)   g333333?g{Gz?)r*   Zshrinkpad)	r+   r.   r/   r,   r-   vminvmaxr0   r1      r    )Zfontsizer4   Zoff_Z	_heatmap_z.pngi,  Ztight)ZdpiZbbox_inchesZ	facecoloru   💾 Saved heatmap: )pltZsubplotsZpatchZset_facecolorZdissolveboundary
capitalizer   ZdropnaZuniquelenZplotsortedr   r	   Znanpercentiler   Zget_cmapcopyZset_badZ	set_titleZaxisZtight_layoutZsavefigZget_facecolorclosename)r   r   r   statesave_dir
size_labelr   
layer_nameZfigr,   Zstate_outliner(   Zunique_valsZ	cmap_namer5   r6   Zcmap_objZout_pathr   r   r   plot_attribute_heatmap;   sl    

& 0


rE   __main__   zUUsage: python -m scripts.visualize_all_attribute_grid <STATE_NAME> [CELL_SIZE_METERS]r#   i'  i  ZkmZOSM_State_Filesz_roads_projected.gpkgZ_grid_z.gpkgu   ❌ Roads file not found: u   ❌ Grid file not found: u$   📦 Loading road and grid data for z...Zroads_projected)layerZgrid_ZlaneswidthZheightzbuilding:levelsZsurfaceZmaterialZbridgeZtunnelrH   ZhighwayZbuildingc                 C   s   g | ]}|t jkr|qS r   r   r   r%   ar   r   r   r'      s     
 r'   c                 C   s   g | ]}|t jkr|qS r   rJ   rK   r   r   r   r'      s     
 u   📊 Road numeric attributes: u"   🎨 Road categorical attributes: )r   r   )r   rD   Tz_buildings_projected.gpkgZbuildings_projectedu   📦 Loaded buildings data: u'   ⚠️ Failed to load buildings layer: c                 C   s   g | ]}|t jkr|qS r   	buildingsr   rK   r   r   r   r'      s     
 c                 C   s   g | ]}|t jkr|qS r   rM   rK   r   r   r   r'      s     
 u"   📊 Building numeric attributes: u&   🎨 Building categorical attributes: rN   u>   
✅ All grid-based attribute heatmaps generated successfully!)F)FN)5__doc__sysospathlibr   environZ	geopandasr   Zpandasr   Zmatplotlib.pyplotZpyplotr9   Znumpyr	   Z
matplotlibr   r   rE   __name__r<   argvr   exitlowerrA   intZ	cell_sizerC   Zgdf_pathZ	grid_pathparentrB   existsr;   Z	read_filer   r   Znumeric_attrsZcategorical_attrsZavailable_numericZavailable_categoricalr   r>   Zgrid_aggr   rN   Zbuildings_pathr@   	ExceptioneZb_available_numericZb_available_categoricalr   r   r   r   <module>   s|   	


V

 




 
