
    k"g1                         d Z ddlmZ ddlmZ g dZeeefZdZ	d Z
e G d d             Z G d	 d
e      Z G d de      ZeZeZy)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Distancesq_c                 l    | j                   t        k(  r| j                  S | j                   j                  S N)	__class__type__name__)objs    S/var/www/html/djangosite/lib/python3.12/site-packages/django/contrib/gis/measure.pypretty_namer   /   s&    ==D03<<Lcmm6L6LL    c                       e Zd ZdZi Zi Zi ZddZd Zd Z	 e
ee	      Zd Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zed        Zy)MeasureBaseNc                     | j                  |      \  }| _        t        | | j                  |       |rt	        |t
              r|| _        y y y r   )default_units_default_unitsetattrSTANDARD_UNIT
isinstancestr)selfdefault_unitkwargsvalues       r   __init__zMeasureBase.__init__:   sG    $($6$6v$>!t!d((%0J|S9!-D :<r   c                 .    t        | | j                        S r   )getattrr   r   s    r   _get_standardzMeasureBase._get_standard@   s    tT//00r   c                 2    t        | | j                  |       y r   )r   r   )r   r   s     r   _set_standardzMeasureBase._set_standardC   s    d((%0r   c                 r    || j                   v r| j                  | j                   |   z  S t        d|z        )NUnknown unit type: %s)UNITSstandardAttributeError)r   names     r   __getattr__zMeasureBase.__getattr__H   s7    4::==4::d#333 !84!?@@r   c                 f    t        |       d| j                  dt        | | j                        dS )N(=))r   r   r"   r#   s    r   __repr__zMeasureBase.__repr__N   s-    D$,,-
 	
r   c                 L    t        | | j                        d| j                  S )N )r"   r   r#   s    r   __str__zMeasureBase.__str__U   s     !$(:(:;T=O=OPPr   c                 l    t        || j                        r| j                  |j                  k(  S t        S r   r   r   r*   NotImplementedr   others     r   __eq__zMeasureBase.__eq__Z   s)    eT^^,==ENN22!!r   c                 ,    t        | j                        S r   )hashr*   r#   s    r   __hash__zMeasureBase.__hash__`       DMM""r   c                 l    t        || j                        r| j                  |j                  k  S t        S r   r7   r9   s     r   __lt__zMeasureBase.__lt__c   s)    eT^^,==5>>11!!r   c                     t        || j                        rA | j                  dd| j                  i| j                  | j                  |j                  z   iS t        ddt        |       iz        )Nr   &%(class)s must be added with %(class)sclass r   r   r   r   r*   	TypeErrorr   r9   s     r   __add__zMeasureBase.__add__k   ss    eT^^,!4>> !//%%(FH 
 8G[QUEV;WW r   c                     t        || j                        r!| xj                  |j                  z  c_        | S t        ddt	        |       iz        )NrC   rD   r   r   r*   rG   r   r9   s     r   __iadd__zMeasureBase.__iadd__v   sG    eT^^,MMU^^+MK8G[QUEV;WW r   c                     t        || j                        rA | j                  dd| j                  i| j                  | j                  |j                  z
  iS t        ddt        |       iz        )Nr   +%(class)s must be subtracted from %(class)srD   rE   rF   r9   s     r   __sub__zMeasureBase.__sub__   su    eT^^,!4>> !//%%(FH 
 =K-./ r   c                     t        || j                        r!| xj                  |j                  z  c_        | S t        ddt	        |       iz        )NrM   rD   rJ   r9   s     r   __isub__zMeasureBase.__isub__   sI    eT^^,MMU^^+MK=K-./ r   c                     t        |t              r7 | j                  dd| j                  i| j                  | j
                  |z  iS t        ddt        |       iz        )Nr   (%(class)s must be multiplied with numberrD   rE   r   NUMERIC_TYPESr   r   r   r*   rG   r   r9   s     r   __mul__zMeasureBase.__mul__   sm    e]+!4>> !//%%(=? 
 :K-./ r   c                     t        |t              r | xj                  t        |      z  c_        | S t	        ddt        |       iz        )NrR   rD   r   rT   r*   floatrG   r   r9   s     r   __imul__zMeasureBase.__imul__   sE    e]+MMU5\)MK:K-./ r   c                     | |z  S r   rE   r9   s     r   __rmul__zMeasureBase.__rmul__   s    e|r   c                     t        || j                        r| j                  |j                  z  S t        |t              r7 | j                  dd| j                  i| j
                  | j                  |z  iS t        ddt        |       iz        )Nr   z2%(class)s must be divided with number or %(class)srD   rE   )r   r   r*   rT   r   r   rG   r   r9   s     r   __truediv__zMeasureBase.__truediv__   s    eT^^,==5>>11e]+!4>> !//%%(=? 
 DK-./ r   c                     t        |t              r | xj                  t        |      z  c_        | S t	        ddt        |       iz        )Nz%%(class)s must be divided with numberrD   rW   r9   s     r   __itruediv__zMeasureBase.__itruediv__   sC    e]+MMU5\)MK77KPTDU:VV r   c                 ,    t        | j                        S r   )boolr*   r#   s    r   __bool__zMeasureBase.__bool__   r?   r   c                 2   d}| j                   }|j                         D ]  \  }}t        |t              st        |      }|| j                  v r|| j                  |   |z  z  }|}G|| j
                  v r'| j
                  |   }|| j                  |   |z  z  }|}||j                         }|| j                  v r|| j                  |   |z  z  }|}|| j                  v r'| j                  |   }|| j                  |   |z  z  }|}t        d|z         ||fS )z|
        Return the unit value and the default units specified
        from the given keyword arguments dictionary.
        g        r(   )	r   itemsr   rX   r)   ALIASlowerLALIASr+   )r   r   valr   unitr   urf   s           r   r   zMeasureBase.default_units   s)   
 ))!<<> 	IKD%eU+etzz!tzz$'%//##JJt$tzz!}u,, 

DJJ&4::e,u44C#(Ldkk)E*A4::a=500C#$L()@4)GHH)	I* L  r   c                     |j                         }|| 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 AttributeError if an attribute cannot be found.
        zUnknown unit type: )rf   r)   rg   r+   )clsunit_strrf   s      r   unit_attnamezMeasureBase.unit_attname   s`      syy OciiLcjj ::e$$ #6xj!ABBr   r   )r   
__module____qualname__r   re   r)   rg   r    r$   r&   propertyr*   r-   r2   r5   r;   r>   rA   rH   rK   rN   rP   rU   rY   r[   r]   r_   rb   r   classmethodrn   rE   r   r   r   r   3   s    MEEF.11 }5HA
Q
"#"	

#!< C Cr   r   c                      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ej                         D  ci c]  \  }}|j                         | c}}} Zdc Z	ydc c}}} w )er   mchaing=,Ԛ4@chain_benoitgl4@chain_searsgs<G4@british_chain_benoitg|1"u4@british_chain_searsgᕪQ4@british_chain_sears_truncatedg4@cmg{Gz?
british_ftgGՁ?
british_ydglGvB?	clarke_ftg)hć?clarke_linkg#Zп?fathomgB?ftgׁ?furlonggL7A`%i@german_mg]A ?gold_coast_ftgäց?	indian_ydg/!B?g
F%u?g     @@g8~߿?g,ݿ?gܿ?g      ?gL7A`%@gMbP?g     @g~j@g=,Ԛ@g\NtB?g`jځ?gư>gB?)inchkmlinklink_benoit
link_searsrt   mimmnmnm_ukrodsears_yd	survey_ftumyd
centimeterfootinchesr   	kilometerr   	kilometremetermetre
micrometerr   
micrometre
millimeterr   
millimetremiler   yardr   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 Miler   zNautical Mile (UK)r   zUS survey footr   r   )z	U.S. FootzYard (Indian)zYard (Sears)c                    t        || j                        rHt        ddt        | j                  z   it        | j
                  z   | j                  |j                  z  iS t        |t              r7 | j                  dd| j                  i| j
                  | j                  |z  iS t        ddt        | j                        iz        )Nr   z;%(distance)s must be multiplied with number or %(distance)sdistancerE   )
r   r   r   AREA_PREFIXr   r   r*   rT   rG   r   r9   s     r   rU   zDistance.__mul__G  s    eT^^, (4+=+==!3!33dmmenn6TV  }-!4>> !//%%(=? 
 MDNN ; r   N)
r   ro   rp   r   r)   re   rd   rf   rg   rU   ).0kvs   000r   r   r      s   M!!	! 	z! 		!
 	}! 	(! 	d! 	n! 	n! 	\! 	~! 	&! 	f! 	7! 	L!  	*!!" 	^#!$ ! #A!EH&d&& 	&& 	T	&
 	T& 	& 	& 	d& 	d& 	d& 	d& 	& 	& 	()?& 	%&;&  	/0O!&" 	$\#&$ 	%&& 	$\'&( 	)&* 	+&, 	-&. 	./&0 	1&2 	3&4 	y5&6 	j7&8 	?9&: 	{;&< 	=&> 	?&@ 	A&B 	gC&D 	+E&F !$"K&EN (-{{}55tq!aggil5F 6s   C6r   c            	          e Zd Zeej
                  z   Zej                  j                         D  ci c]  \  }}t        ||dz   c}}}} ddiz  Zej                  j                         D  ci c]  \  }}|t        | c}}}} ddiz  Zej                         D  ci c]  \  }}|j                         | c}}} Z
d Zyc c}}}} w c c}}}} w c c}}} w )r      hai'  hectarec                     t        |t              r7 | j                  dd| j                  i| j                  | j
                  |z  iS t        ddt        |       iz        )Nr   z%%(class)s must be divided by a numberrD   rE   rS   r9   s     r   r]   zArea.__truediv__g  sk    e]+!4>> !//%%(=? 
 77KPTDU:VV r   N)r   ro   rp   r   r   r   r)   rd   re   rf   rg   r]   )r   r   r   r   s   0000r   r   r   [  s    ("8"88M9A9M9M9OPPA{A&1,PeT E 7?nn6J6J6LMMdaQ+q))M4Q E (-{{}55tq!aggil5F	 Q N 6s   C
5C
)Cr   N)__doc__decimalr   	functoolsr   __all__intrX   rT   r   r   r   r   r   r   r   rE   r   r   <module>r      su   :  $
(eW%M AC AC ACH`{ `F; 2 r   