a
    Df6                     @   s   d dl mZ d dlZd dlmZ d dlmZ d dlm	Z	 zd dl
Z
W n eyZ   dZ
Y n0 G dd deZG dd	 d	eZd
d Zdd Zdd ZdS )    )memoizeN)_build_map_onto_pixel_for_line)_GeometryLikengjitc                   @   s$   e Zd Zedd Zedd ZdS )GeopandasPolygonGeomc                 C   s   ddl m} |fS )Nr   )GeometryDtype)Zgeopandas.arrayr   )selfr    r
   f/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/datashader/glyphs/polygon.pygeom_dtypes   s    z GeopandasPolygonGeom.geom_dtypesc                    sJ   |  |}t||}t|||||}	t|	|| j d fdd	}
|
S )NTc              
      sb   |\}}}}|\}	}
}}| || d j d d  }|  j}|||||	|
|||g	|R   d S Nr      shapearrayZaggsZdfZvtZboundsZ
plot_startsxtxsytyxminxmaxyminymaxaggs_and_colsZ
geom_arrayZ	geom_nameinfoZperform_extend_cpur
   r   extend"   s    
z2GeopandasPolygonGeom._build_extend.<locals>.extend)T)expand_aggs_and_colsr   _build_draw_polygon(_build_extend_geopandas_polygon_geometrygeometryr	   x_mappery_mapperr   appendZ_antialias_stage_2Z_antialias_stage_2_funcsr   map_onto_pixeldraw_polygonr   r
   r   r   _build_extend   s    


z"GeopandasPolygonGeom._build_extendN__name__
__module____qualname__propertyr   r   r)   r
   r
   r
   r   r      s   
r   c                   @   s$   e Zd Zedd Zedd ZdS )PolygonGeomc                 C   s   ddl m}m} ||fS )Nr   )PolygonDtypeMultiPolygonDtype)Zspatialpandas.geometryr0   r1   )r	   r0   r1   r
   r
   r   r   4   s    zPolygonGeom.geom_dtypesc                    sJ   |  |}t||}t|||||}	t|	|| j d fdd	}
|
S )NTc              
      sb   |\}}}}|\}	}
}}| || d j d d  }|  j}|||||	|
|||g	|R   d S r   r   r   r   r
   r   r   G   s    
z)PolygonGeom._build_extend.<locals>.extend)T)r   r   r    _build_extend_polygon_geometryr"   r#   r
   r   r   r)   9   s    


zPolygonGeom._build_extendNr*   r
   r
   r
   r   r/   1   s   
r/   c                    s   t | fdd}|S )Nc           1         s  | tj | tj | d | d |
|	d  }|
|	d  }t|||d }t||d |d }t|||d }t||d |d }||k s||ks||k s||krdS ||||||||t||t||
\}}||||||||t||t||
\}}|d7 }|d7 }|| dkrX|| dkrX | ||g|R   dS || dkrtt||d t||D ]} | ||g|R   qdS || dkrtt||d t||D ]} | ||g|R   qdS d}tt|	d D ]L}|
|	|  }|
|	|d   } t|| d dD ]}!||! }"||!d  }#||!d  }$||!d  }%|"| | d }&|#| | d }'|$| | d }(|%| | d })|)|'kr|&||df< |'||df< |(||df< |)||df< d||< nH|)|'k r.|&||df< |'||df< |(||df< |)||df< d||< nq.|d7 }q.q|}*t||D ]X}| d t||D ]:}d}+t|*D ]}|| dkrq||df }&||df }(||df }'||df })|'|ks|)|k s|&|k r|(|k rd||< q||&kr$||(kr$|+|| 7 }+nh|&| },|'| }-|(| }.|)| }/|.|- |/|,  }0|0dk sr|0dkr|| r|+|| 7 }+nd||< qq|+dkrt | ||g|R   qtqZdS )zBDraw a polygon using a winding-number scan-line algorithm
        r      r   N   g      ?)fillnpnanminmaxrangelen)1ir   r   r   r   r   r   r   r   offsetsZoffset_multipliervaluesxsysyincreasingeligibler   start_index
stop_indexZ	poly_xminZ	poly_yminZ	poly_xmaxZ	poly_ymaxZstartxiZstartyiZstopxiZstopyiyixieijstartstopkZx0Zy0x1y1Zx0cZy0cZx1cZy1cZ	num_edgesZwinding_numberaxZaybxZbyZbxar&   r'   r$   r%   r
   r   r(   W   s    








z)_build_draw_polygon.<locals>.draw_polygonr   )r&   r'   r$   r%   r   r(   r
   rQ   r   r    V   s
     r    c                    s.   dd l fdd}t| fdd|S )Nr   c	                    s    |}
|
d }|jjjjfvr8tdt| |
d  }|jjkr`|
d \}}}n|
d \}}tt	|} | |||||||||||g|	R   d S )Nr   zSCanvas.polygons supports GeoPandas geometry types of POLYGON and MULTIPOLYGON, not r3   r   )
Zto_ragged_arrayZGeometryTypeZPOLYGONZMULTIPOLYGON
ValueErrorreprZravelr7   aranger<   )r   r   r   r   r   r   r   r   r"   r   ZraggedZgeometry_typecoordsoffsets0offsets1offsets2)extend_cpu_numbashapelyr
   r   
extend_cpu   s&    
z<_build_extend_geopandas_polygon_geometry.<locals>.extend_cpuc                    sb  d}t |d }t|D ]d}|
|| ||d  d  }tt |d D ]2}|	||  }|	||d   }t||| d }qHqtj|dftjtjd}tj|dftjtjd}tj|tjd}tj	|tjd}t|D ]}|
|| ||d  d  }tt |d D ]T}|| }||d  } || ||||||||	||d  d|||||g|R   qqd S Nr   r3   r   Zdtype
r<   r;   r:   r7   fullr8   float32zerosZint8Zones)r   r   r   r   r   r   r   r   rU   rV   rW   rX   r   	max_edgesZn_multipolygonsr=   polygon_indsrI   rJ   rK   r@   rA   rB   rC   r(   r
   r   rY     s.    
zB_build_extend_geopandas_polygon_geometry.<locals>.extend_cpu_numba)rZ   r   r(   r   r[   r
   )r(   rY   rZ   r   r!      s    r!   c                    s$   fdd}t | fdd|S )Nc	                    s   |j }
| }|j}|jd ur4|j||||f}ntjdt|dd}t|dkr`|\}}}n|\}}tt|} | ||||||||
|||||g|	R   d S )Nr   Zuint32r]   r5   )	Zbuffer_valuesZisnaZbuffer_offsetsZ_sindexZsindexZ
intersectsr7   rT   r<   )r   r   r   r   r   r   r   r   r"   r   r?   missingr>   eligible_indsrV   rW   rX   )rY   r
   r   r[   0  s     
z2_build_extend_polygon_geometry.<locals>.extend_cpuc                    sr  d}t |
dkr|D ]r}|	| r"q||
| |
|d  d  }tt |d D ]6}|||  }|||d   }t||| d d }qNqtj|dftjtjd}tj|dftjtjd}tj|tjd}tj	|tjd}|D ]}|	| rq||
| |
|d  d  }tt |d D ]T}|| }||d  } || ||||||||||d  d|||||g|R   qqd S r\   r^   )r   r   r   r   r   r   r   r   r?   rf   rV   rW   rX   rg   r   rb   r=   rc   rI   rJ   rK   r@   rA   rB   rC   rd   r
   r   rY   L  s6    z8_build_extend_polygon_geometry.<locals>.extend_cpu_numbar   re   r
   )r(   rY   r   r2   -  s
    &r2   )Ztoolzr   numpyr7   Zdatashader.glyphs.liner   Zdatashader.glyphs.pointsr   Zdatashader.utilsr   Zspatialpandas	Exceptionr   r/   r    r!   r2   r
   r
   r
   r   <module>   s   
#% =