o
    ÓŸŽi1  ã                   @   sx   d Z ddlmZ ddlmZ g d¢ZeeefZdZ	dd„ Z
eG dd	„ d	ƒƒZG d
d„ deƒZG dd„ deƒZeZeZdS )a  
Distance and Area objects to allow for sensible and convenient calculation
and conversions.

Authors: Robert Coup, Justin Bronn, Riccardo Di Virgilio

Inspired by GeoPy (https://github.com/geopy/geopy)
and Geoff Biggs' PhD work on dimensioned units for robotics.
é    )ÚDecimal)Útotal_ordering)ÚAÚAreaÚDÚDistanceZsq_c                 C   s   | j tkr| jS | j jS ©N)Ú	__class__ÚtypeÚ__name__)Úobj© r   údC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\django/contrib/gis/measure.pyÚpretty_name/   s   r   c                   @   sÔ   e Zd ZdZi Zi Zi Zd,dd„Zdd„ Zdd„ Z	e
ee	ƒZdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zed*d+„ ƒZdS )-ÚMeasureBaseNc                 K   s>   |   |¡\}| _t| | j|ƒ |rt|tƒr|| _d S d S d S r   )Údefault_unitsÚ_default_unitÚsetattrÚSTANDARD_UNITÚ
isinstanceÚstr)ÚselfÚdefault_unitÚkwargsÚvaluer   r   r   Ú__init__:   s
   
ÿzMeasureBase.__init__c                 C   s   t | | jƒS r   )Úgetattrr   ©r   r   r   r   Ú_get_standard@   s   zMeasureBase._get_standardc                 C   s   t | | j|ƒ d S r   )r   r   )r   r   r   r   r   Ú_set_standardC   s   zMeasureBase._set_standardc                 C   s&   || j v r| j| j |  S td| ƒ‚)NúUnknown unit type: %s)ÚUNITSÚstandardÚAttributeError)r   Únamer   r   r   Ú__getattr__H   s   
zMeasureBase.__getattr__c                 C   s   dt | ƒ| jt| | jƒf S )Nz	%s(%s=%s))r   r   r   r   r   r   r   Ú__repr__N   s
   
ýzMeasureBase.__repr__c                 C   s   dt | | jƒ| jf S )Nz%s %s)r   r   r   r   r   r   Ú__str__U   s   zMeasureBase.__str__c                 C   s   t || jƒr| j|jkS tS r   ©r   r	   r"   ÚNotImplemented©r   Úotherr   r   r   Ú__eq__Z   ó   zMeasureBase.__eq__c                 C   ó
   t | jƒS r   )Úhashr"   r   r   r   r   Ú__hash__`   ó   
zMeasureBase.__hash__c                 C   s   t || jƒr| j|jk S tS r   r(   r*   r   r   r   Ú__lt__c   r-   zMeasureBase.__lt__c                 C   sD   t || jƒr| jdd| ji| j| j|j i¤ŽS tddt| ƒi ƒ‚)Nr   ú&%(class)s must be added with %(class)sÚclassr   ©r   r	   r   r   r"   Ú	TypeErrorr   r*   r   r   r   Ú__add__k   s   ÿþÿzMeasureBase.__add__c                 C   s4   t || jƒr|  j|j7  _| S tddt| ƒi ƒ‚)Nr3   r4   ©r   r	   r"   r6   r   r*   r   r   r   Ú__iadd__v   s   ÿzMeasureBase.__iadd__c                 C   sD   t || jƒr| jdd| ji| j| j|j i¤ŽS tddt| ƒi ƒ‚)Nr   ú+%(class)s must be subtracted from %(class)sr4   r   r5   r*   r   r   r   Ú__sub__   s   ÿþ
ÿÿzMeasureBase.__sub__c                 C   s4   t || jƒr|  j|j8  _| S tddt| ƒi ƒ‚)Nr:   r4   r8   r*   r   r   r   Ú__isub__‹   s   
ÿÿzMeasureBase.__isub__c                 C   s@   t |tƒr| jdd| ji| j| j| i¤ŽS tddt| ƒi ƒ‚)Nr   ú(%(class)s must be multiplied with numberr4   r   ©r   ÚNUMERIC_TYPESr	   r   r   r"   r6   r   r*   r   r   r   Ú__mul__•   s   
ÿþ
ÿÿzMeasureBase.__mul__c                 C   s4   t |tƒr|  jt|ƒ9  _| S tddt| ƒi ƒ‚)Nr=   r4   ©r   r?   r"   Úfloatr6   r   r*   r   r   r   Ú__imul__¡   s   

ÿÿzMeasureBase.__imul__c                 C   s   | | S r   r   r*   r   r   r   Ú__rmul__«   s   zMeasureBase.__rmul__c                 C   sX   t || jƒr| j|j S t |tƒr"| jdd| ji| j| j| i¤ŽS tddt| ƒi ƒ‚)Nr   z2%(class)s must be divided with number or %(class)sr4   r   )r   r	   r"   r?   r   r   r6   r   r*   r   r   r   Ú__truediv__®   s   
ÿþ
ÿÿzMeasureBase.__truediv__c                 C   s4   t |tƒr|  jt|ƒ  _| S tddt| ƒi ƒ‚)Nz%%(class)s must be divided with numberr4   rA   r*   r   r   r   Ú__itruediv__¼   s   
ÿzMeasureBase.__itruediv__c                 C   r.   r   )Úboolr"   r   r   r   r   Ú__bool__Å   r1   zMeasureBase.__bool__c                 C   sä   d}| j }| ¡ D ]d\}}t|tƒst|ƒ}|| jv r'|| j| | 7 }|}q	|| jv r=| j| }|| j| | 7 }|}q	| ¡ }|| jv rR|| j| | 7 }|}q	|| jv rh| j| }|| j| | 7 }|}q	td| ƒ‚||fS )z|
        Return the unit value and the default units specified
        from the given keyword arguments dictionary.
        g        r    N)	r   Úitemsr   rB   r!   ÚALIASÚlowerÚLALIASr#   )r   r   Úvalr   Úunitr   ÚurK   r   r   r   r   È   s,   






zMeasureBase.default_unitsc                 C   sD   |  ¡ }|| jv r|S || jv r|S || jv r| j| S td| ƒ‚)zÏ
        Retrieve the unit attribute name for the given unit string.
        For example, if the given unit string is 'metre', return 'm'.
        Raise an exception if an attribute cannot be found.
        z2Could not find a unit keyword associated with "%s"N)rK   r!   rL   Ú	Exception)ÚclsZunit_strrK   r   r   r   Úunit_attnameæ   s   



ÿzMeasureBase.unit_attnamer   )r   Ú
__module__Ú__qualname__r   rJ   r!   rL   r   r   r   Úpropertyr"   r%   r&   r'   r,   r0   r2   r7   r9   r;   r<   r@   rC   rD   rE   rF   rH   r   ÚclassmethodrR   r   r   r   r   r   3   s8    

	

	r   c                   @   s˜  e Zd ZdZi dd“dd“dd“dd	“d
d“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d!“d"d#“d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3œ¥Zi d4d“d5d“d6d7“d8d9“d:d9“d;d“d<d“d=d>“d?d>“d@dA“dBdA“dCdD“dEdF“dGd“dHd
“dId“dJd“i dKd“dLd“dMd“dNd“dOd“dPd“dQd“dRd“dSd“dTd“dUd “dVd"“dWdX“dYdZ“d[d\“d]d^“d_d`“¥d`d"dadbœ¥Zdcdd„ e ¡ D ƒZdedf„ ZdgS )hr   ÚmÚchaing=,Ôšæ4@Zchain_benoitgðÂÖlå4@Zchain_searsgsÕ<Gä4@Zbritish_chain_benoitg|1"uå4@Zbritish_chain_searsgá•ªQä4@Zbritish_chain_sears_truncatedg�œ¡¸ã4@Úcmg{®Gáz„?Z
british_ftgG†¤Õ�Ó?Z
british_ydglGÉvÀBí?Z	clarke_ftg)h³cÌ�Ó?Zclarke_linkg#¥ZÐ¿É?ZfathomgûËîÉÃBý?Úftgý‡ôÛ×�Ó?ZfurlonggL7‰A`%i@Zgerman_mgŽ]ÈA ð?Zgold_coast_ftgªÔÃ¤Ö�Ó?Z	indian_ydg/Ê!µÀBí?g¦
F%uš?g     @�@g 8€~ß¿É?g¸,ôûÝ¿É?g³¯áŽÜ¿É?g      ð?gL7‰A`%™@gü©ñÒMbP?g     ðœ@gÛù~j¼ôœ@g=,Ôšæ@g\ÜNtÀBí?gÏ`‚jÚ�Ó?g�íµ ÷Æ°>gûËîÉÃBí?)ÚinchÚkmÚlinkÚlink_benoitÚ
link_searsrW   ÚmiÚmmÚnmÚnm_ukZrodÚsears_ydÚ	survey_ftÚumÚydZ
centimeterZfootZinchesr[   Z	kilometerr\   Z	kilometreZmeterZmetreZ
micrometerrf   Z
micrometreZ
millimeterra   Z
millimetreZmiler`   Zyardrg   zBritish chain (Benoit 1895 B)zBritish chain (Sears 1922)z$British chain (Sears 1922 truncated)zBritish foot (Sears 1922)zBritish footzBritish yard (Sears 1922)zBritish yardzClarke's FootzClarke's linkzChain (Benoit)zChain (Sears)zFoot (International)zFurrow LongzGerman legal metrezGold Coast footzIndian yardzLink (Benoit)r^   zLink (Sears)r_   zNautical Milerb   zNautical Mile (UK)rc   zUS survey footre   rd   )z	U.S. FootzYard (Indian)zYard (Sears)c                 C   ó   i | ]	\}}|  ¡ |“qS r   ©rK   ©Ú.0ÚkÚvr   r   r   Ú
<dictcomp>G  ó    zDistance.<dictcomp>c                 C   sx   t || jƒrtddt| j it| j | j|j i¤ŽS t |tƒr1| jdd| ji| j| j| i¤ŽS tddt	| jƒi ƒ‚)Nr   z;%(distance)s must be multiplied with number or %(distance)sZdistancer   )
r   r	   r   ÚAREA_PREFIXr   r   r"   r?   r6   r   r*   r   r   r   r@   I  s$   ÿþ
ÿþ
ÿÿÿzDistance.__mul__N)	r   rS   rT   r   r!   rJ   rI   rL   r@   r   r   r   r   r   ú   s    ÿþýüûúùø	÷
öõôóòñðïà$ÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Û'r   c                   @   sX   e Zd Zeej Zdd„ ej ¡ D ƒZdd„ ej ¡ D ƒZdd„ e ¡ D ƒZ	dd„ Z
dS )r   c                 C   s"   i | ]\}}d t |f |d “qS )ú%s%sé   ©rp   rj   r   r   r   rn   `  s   " zArea.<dictcomp>c                 C   s   i | ]\}}|d t |f “qS )rq   rs   rj   r   r   r   rn   a  s    c                 C   rh   r   ri   rj   r   r   r   rn   b  ro   c                 C   s@   t |tƒr| jdd| ji| j| j| i¤ŽS tddt| ƒi ƒ‚)Nr   z%%(class)s must be divided by a numberr4   r   r>   r*   r   r   r   rE   d  s   
ÿþÿzArea.__truediv__N)r   rS   rT   rp   r   r   r!   rI   rJ   rL   rE   r   r   r   r   r   ]  s    
r   N)Ú__doc__Údecimalr   Ú	functoolsr   Ú__all__ÚintrB   r?   rp   r   r   r   r   r   r   r   r   r   r   Ú<module>   s   	
 Gc