o
    hD                     @   s   d dl Zd dlZd dlmZ d dlmZ d dlmZ	 d dl
mZ d dlmZ d dlmZ d dlmZmZmZmZ d dlmZmZmZ G dd	 d	eZG d
d deZG dd deZG dd deZG dd deZG dd deZdS )    N)_api)AxesCircle)Path)	FormatterNullLocatorFixedLocatorNullFormatter)Affine2DBboxTransformTo	Transformc                       s  e Zd ZdZG dd deZdZdd Z fddZd	d
 Z	dd Z
d8ddZdd Zdd Zd8ddZdd Zdd Zdd Zdd Zdd ZeZd d! ZeZeZeZd"d# ZeZd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Z d0d1 Z!d2d3 Z"d4d5 Z#d6d7 Z$  Z%S )9GeoAxesz2An abstract base class for geographic projections.c                   @   s$   e Zd ZdZdddZd	ddZdS )
zGeoAxes.ThetaFormatterz
        Used to format the theta tick labels.  Converts the native
        unit of radians into degrees and adds a degree symbol.
              ?c                 C   s
   || _ d S N)	_round_to)selfround_to r   n/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/matplotlib/projections/geo.py__init__      
zGeoAxes.ThetaFormatter.__init__Nc                 C   s&   t t|| j | j }|ddS )Nz0.0f   °)roundnprad2degr   )r   xposdegreesr   r   r   __call__   s   zGeoAxes.ThetaFormatter.__call__)r   r   )__name__
__module____qualname____doc__r   r   r   r   r   r   ThetaFormatter   s    
r$   K   c                 C   s6   t j| dd| _t j| dd| _| jd | j d S )NF)cleargeo)maxisXAxisxaxisYAxisyaxisspinesregister_axisr   r   r   r   
_init_axis    s   zGeoAxes._init_axisc                    s   t    | d | d | d | jt  | jt  | j	d | j	d | jj
dd | tjd  t| tj tj t| tj d tjd  d S )	N      r%   noneT)label1Onz	axes.grid       @)superr&   set_longitude_gridset_latitude_gridset_longitude_grid_endsr*   set_minor_locatorr   r,   set_ticks_positionset_tick_paramsgridmplrcParamsr   set_xlimr   piset_ylimr/   	__class__r   r   r&   %   s   



 zGeoAxes.clearc                 C   s0  |  | j| _|  | _t| j| _| j| j | j | _t	 
d| jd d| j | _| j| j | _t	 
dd| j t	 dd | _t	 
dd| j t	 dd | _t	 
tjd dtj d}t	 
dd}|| j | _|| j || j | j  }|t	 dd | _|t	 dd | _d S )	N      r      g?i   )_get_core_transform
RESOLUTIONtransProjection_get_affine_transformtransAffiner   bbox	transAxes	transDatar   scale_longitude_cap	translate_xaxis_pretransform_xaxis_transform_xaxis_text1_transform_xaxis_text2_transformr   rA   _yaxis_transform_yaxis_text1_transform_yaxis_text2_transform)r   yaxis_stretchyaxis_spaceyaxis_text_baser   r   r   _set_lim_and_transforms9   sj   
 zGeoAxes._set_lim_and_transformsc                 C   sT   |  d}|tjdf\}}|dtjd f\}}t d| d| ddS )NrE   r   rF         ?)rJ   	transformr   rA   r   rR   rT   )r   ra   xscale_yscaler   r   r   rM   l   s   
zGeoAxes._get_affine_transformr=   c                 C      t jg d|d | jS N)tick1tick2r=   )which)r   check_in_listrV   r   ri   r   r   r   get_xaxis_transformt      zGeoAxes.get_xaxis_transformc                 C      | j ddfS )Nbottomcenter)rW   r   padr   r   r   get_xaxis_text1_transformx      z!GeoAxes.get_xaxis_text1_transformc                 C   rn   )Ntoprp   )rX   rq   r   r   r   get_xaxis_text2_transform{   rt   z!GeoAxes.get_xaxis_text2_transformc                 C   re   rf   )r   rj   rY   rk   r   r   r   get_yaxis_transform~   rm   zGeoAxes.get_yaxis_transformc                 C   rn   )Nrp   right)rZ   rq   r   r   r   get_yaxis_text1_transform   rt   z!GeoAxes.get_yaxis_text1_transformc                 C   rn   )Nrp   left)r[   rq   r   r   r   get_yaxis_text2_transform   rt   z!GeoAxes.get_yaxis_text2_transformc                 C   s
   t ddS )Nr`   r`   r`   r   r/   r   r   r   _gen_axes_patch   r   zGeoAxes._gen_axes_patchc                 C   s   dt j| ddiS )Nr'   r|   r`   )mspinesSpinecircular_spiner/   r   r   r   _gen_axes_spines   s   zGeoAxes._gen_axes_spinesc                 O   s   |d dkrt d S )Nr   linear)NotImplementedErrorr   argskwargsr   r   r   
set_yscale   s   zGeoAxes.set_yscalec                 O      t dz-Not supported. Please consider using Cartopy.zaChanging axes limits of a geographic projection is not supported.  Please consider using Cartopy.	TypeErrorr   r   r   r   r@         zGeoAxes.set_xlimc                 C   r   r   r   r/   r   r   r   invert_xaxis   r   zGeoAxes.invert_xaxisc                 C   sJ   t ||g\}}|dkrdnd}|dkrdnd}dt||t||f S )z1Return a format string formatting the coordinate.        NSEWu   %f°%s, %f°%s)r   r   abs)r   lonlatnsewr   r   r   format_coord   s   zGeoAxes.format_coordc                 C   >   t d| d|}| jtt | | j| | dS )zH
        Set the number of degrees between each longitude grid.
        iL   N)r   aranger*   set_major_locatorr	   deg2radset_major_formatterr$   r   r   r=   r   r   r   r7         zGeoAxes.set_longitude_gridc                 C   r   )zG
        Set the number of degrees between each latitude grid.
        iZ   N)r   r   r,   r   r	   r   r   r$   r   r   r   r   r8      r   zGeoAxes.set_latitude_gridc                 C   s4   t || _| j d| jd d| j  dS )zS
        Set the latitude(s) at which to stop drawing the longitude grids.
        r   r5   r   N)r   r   rS   rU   r&   rR   rT   )r   r   r   r   r   r9      s
   zGeoAxes.set_longitude_grid_endsc                 C      dS )z+Return the aspect ratio of the data itself.r   r   r/   r   r   r   get_data_ratio   s   zGeoAxes.get_data_ratioc                 C   r   )z
        Return whether this Axes supports the zoom box button functionality.

        This Axes object does not support interactive zoom box.
        Fr   r/   r   r   r   can_zoom      zGeoAxes.can_zoomc                 C   r   )z
        Return whether this Axes supports the pan/zoom button functionality.

        This Axes object does not support interactive pan/zoom.
        Fr   r/   r   r   r   can_pan   r   zGeoAxes.can_panc                 C      d S r   r   )r   r   ybuttonr   r   r   	start_pan      zGeoAxes.start_panc                 C   r   r   r   r/   r   r   r   end_pan   r   zGeoAxes.end_panc                 C   r   r   r   )r   r   keyr   r   r   r   r   drag_pan   r   zGeoAxes.drag_pan)r=   )&r    r!   r"   r#   r   r$   rK   r0   r&   r_   rM   rl   rs   rv   rw   ry   r{   r}   r   r   
set_xscaler@   rB   
set_xbound
set_yboundr   invert_yaxisr   r7   r8   r9   r   r   r   r   r   r   __classcell__r   r   rC   r   r      sD    3

		
r   c                       s4   e Zd Zd ZZ fddZdd Zdd Z  ZS )_GeoTransformrF   c                    s   t    || _dS )z
        Create a new geographical transform.

        Resolution is the number of steps to interpolate between each input
        line segment to approximate its path in curved space.
        N)r6   r   _resolutionr   
resolutionrC   r   r   r      s   

z_GeoTransform.__init__c                 C   s   t | j d| j dS )N())typer    r   r/   r   r   r   __str__   s   z_GeoTransform.__str__c                 C   s    | | j}t| |j|jS r   )interpolatedr   r   ra   verticescodes)r   pathipathr   r   r   transform_path_non_affine   s   z'_GeoTransform.transform_path_non_affine)	r    r!   r"   
input_dimsoutput_dimsr   r   r   r   r   r   rC   r   r      s
    
r   c                       H   e Zd ZdZG dd deZG dd deZ fddZdd	 Z  Z	S )

AitoffAxesaitoffc                   @       e Zd ZdZdd Zdd ZdS )zAitoffAxes.AitoffTransformzThe base Aitoff transform.c           
      C   sn   |j \}}|d }t|}t|t| }t|tj }|t| | }t|| }	t||	gS )Nr5   )Tr   cosarccossincrA   sincolumn_stack)
r   values	longitudelatitude	half_longcos_latitudealpha
sinc_alphar   r   r   r   r   transform_non_affine  s   

z/AitoffAxes.AitoffTransform.transform_non_affinec                 C      t | jS r   )r   InvertedAitoffTransformr   r/   r   r   r   inverted     z#AitoffAxes.AitoffTransform.invertedNr    r!   r"   r#   r   r   r   r   r   r   AitoffTransform  s    r   c                   @      e Zd Zdd Zdd ZdS )z"AitoffAxes.InvertedAitoffTransformc                 C   s   t |t jS r   )r   	full_likenan)r   r   r   r   r   r     s   z7AitoffAxes.InvertedAitoffTransform.transform_non_affinec                 C   r   r   )r   r   r   r/   r   r   r   r     r   z+AitoffAxes.InvertedAitoffTransform.invertedNr    r!   r"   r   r   r   r   r   r   r     s    r   c                    :   t jd | _t j|i | | jdddd |   d S Nr5   r`   boxC
adjustableanchorr   rA   rS   r6   r   
set_aspectr&   r   rC   r   r   r   #     zAitoffAxes.__init__c                 C   
   |  |S r   )r   r   r   r   r   rJ   )  r   zAitoffAxes._get_core_transform)
r    r!   r"   namer   r   r   r   rJ   r   r   r   rC   r   r      s    r   c                       r   )

HammerAxeshammerc                   @   r   )zHammerAxes.HammerTransformzThe base Hammer transform.c           
      C   sx   |j \}}|d }t|}td}td|t|  }d| |t|  | }|t| | }	t||	gS )Nr5   r   )r   r   r   sqrtr   r   )
r   r   r   r   r   r   sqrt2r   r   r   r   r   r   r   3  s   


z/HammerAxes.HammerTransform.transform_non_affinec                 C   r   r   )r   InvertedHammerTransformr   r/   r   r   r   r   >  r   z#HammerAxes.HammerTransform.invertedNr   r   r   r   r   HammerTransform0  s    r   c                   @   r   )z"HammerAxes.InvertedHammerTransformc                 C   sn   |j \}}td|d d  |d d  }dt|| dd|d  d    }t|| }t||gS )NrE   rG   rF   )r   r   r   arctanarcsinr   )r   r   r   r   zr   r   r   r   r   r   D  s
   
"&z7HammerAxes.InvertedHammerTransform.transform_non_affinec                 C   r   r   )r   r   r   r/   r   r   r   r   L  r   z+HammerAxes.InvertedHammerTransform.invertedNr   r   r   r   r   r   B  s    r   c                    r   r   r   r   rC   r   r   r   P  r   zHammerAxes.__init__c                 C   r   r   )r   r   r   r   r   rJ   V  r   zHammerAxes._get_core_transform)
r    r!   r"   r   r   r   r   r   rJ   r   r   r   rC   r   r   -  s    r   c                       r   )
MollweideAxes	mollweidec                   @   r   )z MollweideAxes.MollweideTransformzThe base Mollweide transform.c                    sh   fdd}|j \}}tjd t| }|dk }| }tj|jtd}| r^tjt||   d||  }	||	\}
}t|rX|	|  |
| 7  < ||	\}
}t|sC|	d ||< | r|| }ddtj |d  d	  }tjd | t	||  ||< tj|jtd}dt
d tj | t| |d d d
f< t
dt| |d d df< |S )Nc                    s4   | t |     dt |   }|t |dkfS )NrE   gMbP?)r   r   r   r   )thetadeltapi_sin_lr   r   db  s   z@MollweideAxes.MollweideTransform.transform_non_affine.<locals>.drF   gʡE?)dtyper5   r`      gUUUUUU?r   rE   )r   r   rA   r   emptyshapefloatanyr   signr   r   )r   r   r   r   r   clatihighilowauxr   r   large_deltaexyr   r   r   r   `  s.   


 . z5MollweideAxes.MollweideTransform.transform_non_affinec                 C   r   r   )r   InvertedMollweideTransformr   r/   r   r   r   r     r   z)MollweideAxes.MollweideTransform.invertedNr   r   r   r   r   MollweideTransform]  s    "r  c                   @   r   )z(MollweideAxes.InvertedMollweideTransformc                 C   sp   |j \}}t|td }tjdtd  | t| }td| td|  tj }t||gS )NrF   )r   r   r   r   rA   r   r   r   )r   r   r   r   r   r   r   r   r   r   r     s
   
""z=MollweideAxes.InvertedMollweideTransform.transform_non_affinec                 C   r   r   )r   r  r   r/   r   r   r   r     r   z1MollweideAxes.InvertedMollweideTransform.invertedNr   r   r   r   r   r
    s    
r
  c                    r   r   r   r   rC   r   r   r     r   zMollweideAxes.__init__c                 C   r   r   )r  r   r   r   r   rJ     r   z!MollweideAxes._get_core_transform)
r    r!   r"   r   r   r  r
  r   rJ   r   r   r   rC   r   r   Z  s    )r   c                       sd   e Zd ZdZG dd deZG dd deZddd fdd	
Z fd
dZdd Z	dd Z
  ZS )LambertAxeslambertc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	zLambertAxes.LambertTransformzThe base Lambert transform.c                 C   s   t | | || _|| _dS )z
            Create a new Lambert transform.  Resolution is the number of steps
            to interpolate between each input line segment to approximate its
            path in curved Lambert space.
            Nr   r   _center_longitude_center_latituder   center_longitudecenter_latituder   r   r   r   r     s   
z%LambertAxes.LambertTransform.__init__c                 C   s   |j \}}| j}| j}t|}t|}|| }t|}	tdt||  t|| |	  d}
td|
 }|| t| }|t|| t|| |	   }t||gS )NrE   gV瞯<rF   )	r   r  r  r   r   r   maximumr   r   )r   r   r   r   clongr  cos_latsin_lat	diff_longcos_diff_longinner_kkr   r   r   r   r   r     s   



"$z1LambertAxes.LambertTransform.transform_non_affinec                 C      t | j| j| jS r   )r  InvertedLambertTransformr  r  r   r/   r   r   r   r     
   z%LambertAxes.LambertTransform.invertedN)r    r!   r"   r#   r   r   r   r   r   r   r   LambertTransform  s
    
r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )z$LambertAxes.InvertedLambertTransformc                 C   s   t | | || _|| _d S r   r  r  r   r   r   r     s   
z-LambertAxes.InvertedLambertTransform.__init__c              	   C   s   |j \}}| j}| j}tt||d}dtd|  }t|}t|}	t|	t| || t| |  }
|t	|| |t| |	 |t| |    }t
||
gS )Ng&.>rF   r`   )r   r  r  r   r  hypotr   r   r   r   r   )r   r   r   r   r  r  pcsin_ccos_cr   r   r   r   r   r     s   


*z9LambertAxes.InvertedLambertTransform.transform_non_affinec                 C   r  r   )r  r  r  r  r   r/   r   r   r   r     r  z-LambertAxes.InvertedLambertTransform.invertedN)r    r!   r"   r   r   r   r   r   r   r   r    s    r  r   )r  r  c                   sF   t jd | _|| _|| _t j|i | | jdddd |   d S )NrF   equalr   r   r   )	r   rA   rS   r  r  r6   r   r   r&   )r   r  r  r   r   rC   r   r   r     s   zLambertAxes.__init__c                    s   t    | jt  d S r   )r6   r&   r,   r   r
   r/   rC   r   r   r&     s   
zLambertAxes.clearc                 C   s   |  | j| j|S r   )r  r  r  r   r   r   r   rJ     s
   zLambertAxes._get_core_transformc                 C   s   t  dddS )Ng      ?r`   )r   rR   rT   r/   r   r   r   rM     s   z!LambertAxes._get_affine_transform)r    r!   r"   r   r   r  r  r   r&   rJ   rM   r   r   r   rC   r   r    s    'r  ) numpyr   
matplotlibr>   r   matplotlib.axesr   matplotlib.axisaxisr(   matplotlib.patchesr   matplotlib.pathr   matplotlib.spinesr-   r~   matplotlib.tickerr   r   r	   r
   matplotlib.transformsr   r   r   r   r   r   r   r   r  r   r   r   r   <module>   s"     Z.-F