o
    <g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Distancesq_c                 C   s   | j tkr| jS | j jS N)	__class__type__name__)obj r   M/var/www/html/venv/lib/python3.10/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 )Nr4   r5   r   r
   r#   r7   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)sr5   r   r6   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;   r5   r9   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 numberr5   r   r   NUMERIC_TYPESr
   r   r   r#   r7   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>   r5   r   r@   r#   floatr7   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)sr5   r   )r   r
   r#   r@   r   r   r7   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 numberr5   rB   r+   r   r   r   __itruediv__   s   
zMeasureBase.__itruediv__c                 C   r/   r	   )boolr#   r   r   r   r   __bool__   r2   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!   )	r   itemsr   rC   r"   ALIASlowerLALIASr$   )r   r   valr   unitr   urL   r   r   r   r      s,   






zMeasureBase.default_unitsc                 C   sF   |  }|| 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: )rL   r"   rM   r$   )clsunit_strrL   r   r   r   unit_attname   s   



zMeasureBase.unit_attnamer	   )r   
__module____qualname__r   rK   r"   rM   r   r   r    propertyr#   r&   r'   r(   r-   r1   r3   r8   r:   r<   r=   rA   rD   rE   rF   rG   rI   r   classmethodrS   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@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_searsrX   mimmnmnm_ukrodsears_yd	survey_ftumyd
centimeterfootinchesrj   	kilometerrk   	kilometremetermetre
micrometerrv   
micrometre
millimeterrp   
millimetremilero   yardrw   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)rm   zLink (Sears)rn   zNautical Milerq   zNautical Mile (UK)rr   zUS survey footru   rt   )z	U.S. FootzYard (Indian)zYard (Sears)c                 C      i | ]	\}}|  |qS r   rL   .0kvr   r   r   
<dictcomp>E      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)sdistancer   )
r   r
   r   AREA_PREFIXr   r   r#   r@   r7   r   r+   r   r   r   rA   G  s$   

zDistance.__mul__N)	r   rT   rU   r   r"   rK   rJ   rM   rA   r   r   r   r   r      s    	
$	
 !"#'r   c                   @   sh   e Zd Zeej Zdd ej D ddiB Zdd ej D ddiB Zdd e D Z	dd	 Z
d
S )r   c                 C   s"   i | ]\}}d t |f |d qS )%s%s   r   r   r   r   r   r   ^  s   " zArea.<dictcomp>hai'  c                 C   s   i | ]\}}|d t |f qS )r   r   r   r   r   r   r   a  s    hectarec                 C   r   r   r   r   r   r   r   r   e  r   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 numberr5   r   r?   r+   r   r   r   rF   g  s   
zArea.__truediv__N)r   rT   rU   r   r   r   r"   rJ   rK   rM   rF   r   r   r   r   r   [  s    
r   N)__doc__decimalr   	functoolsr   __all__intrC   r@   r   r   r   r   r   r   r   r   r   r   r   <module>   s   	
 Ec