
*Pc           @   s   d  Z  d d d d g Z d d l m Z d d l m Z d d l m Z e j e	 e f Z
 d	 Z d
   Z e d e f d     Y Z d e f d     YZ d e f d     YZ e Z e Z d S(   s  
Distance and Area objects to allow for sensible and convienient calculation
and conversions.

Authors: Robert Coup, Justin Bronn, Riccardo Di Virgilio

Inspired by GeoPy (http://exogen.case.edu/projects/geopy/)
and Geoff Biggs' PhD work on dimensioned units for robotics.
t   At   Areat   Dt   Distancei(   t   Decimal(   t   total_ordering(   t   sixt   sq_c         C   s    |  j  t k r |  j S|  j  j S(   N(   t	   __class__t   typet   __name__(   t   obj(    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   pretty_name/   s    t   MeasureBasec           B   s  e  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 d   Z d   Z e d    Z  RS(   c         K   sS   |  j  |  \ } |  _ t |  |  j |  | rO t | t j  rO | |  _ n  d  S(   N(   t   default_unitst   _default_unitt   setattrt   STANDARD_UNITt
   isinstanceR   t   string_types(   t   selft   default_unitt   kwargst   value(    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __init__:   s    c         C   s   t  |  |  j  S(   N(   t   getattrR   (   R   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   _get_standard@   s    c         C   s   t  |  |  j |  d  S(   N(   R   R   (   R   R   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   _set_standardC   s    c         C   s5   | |  j  k r! |  j |  j  | St d |   d  S(   Ns   Unknown unit type: %s(   t   UNITSt   standardt   AttributeError(   R   t   name(    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __getattr__H   s    c         C   s&   d t  |   |  j t |  |  j  f S(   Ns	   %s(%s=%s)(   R   R   R   (   R   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __repr__N   s    c         C   s   d t  |  |  j  |  j f S(   Ns   %s %s(   R   R   (   R   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __str__R   s    c         C   s*   t  | |  j  r" |  j | j k St Sd  S(   N(   R   R   R   t   NotImplemented(   R   t   other(    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __eq__W   s    c         C   s*   t  | |  j  r" |  j | j k  St Sd  S(   N(   R   R   R   R#   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __lt__]   s    c         C   s]   t  | |  j  r< |  j d |  j i |  j | j |  j 6 St d i t |   d 6  d  S(   NR   s&   %(class)s must be added with %(class)st   class(   R   R   R   R   R   t	   TypeErrorR   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __add__e   s    c         C   sI   t  | |  j  r( |  j | j 7_ |  St d i t |   d 6  d  S(   Ns&   %(class)s must be added with %(class)sR'   (   R   R   R   R(   R   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __iadd__l   s    c         C   s]   t  | |  j  r< |  j d |  j i |  j | j |  j 6 St d i t |   d 6  d  S(   NR   s+   %(class)s must be subtracted from %(class)sR'   (   R   R   R   R   R   R(   R   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __sub__s   s    c         C   sI   t  | |  j  r( |  j | j 8_ |  St d i t |   d 6  d  S(   Ns+   %(class)s must be subtracted from %(class)sR'   (   R   R   R   R(   R   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __isub__z   s    c         C   sW   t  | t  r6 |  j d |  j i |  j | |  j 6 St d i t |   d 6  d  S(   NR   s(   %(class)s must be multiplied with numberR'   (   R   t   NUMERIC_TYPESR   R   R   R   R(   R   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __mul__   s    c         C   sI   t  | t  r( |  j t |  9_ |  St d i t |   d 6  d  S(   Ns(   %(class)s must be multiplied with numberR'   (   R   R-   R   t   floatR(   R   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __imul__   s    c         C   s   |  | S(   N(    (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __rmul__   s    c         C   sw   t  | |  j  r  |  j | j St  | t  rV |  j d |  j i |  j | |  j 6 St d i t |   d 6  d  S(   NR   s2   %(class)s must be divided with number or %(class)sR'   (   R   R   R   R-   R   R   R(   R   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __truediv__   s    c         C   s   t  |   j |  |  S(   N(   R	   R2   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __div__   s    c         C   sI   t  | t  r( |  j t |  :_ |  St d i t |   d 6  d  S(   Ns%   %(class)s must be divided with numberR'   (   R   R-   R   R/   R(   R   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __itruediv__   s    c         C   s   t  |   j |  |  S(   N(   R	   R4   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __idiv__   s    c         C   s   t  |  j  S(   N(   t   boolR   (   R   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __bool__   s    c         C   s   t  |   j |   S(   N(   R	   R7   (   R   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   __nonzero__   s    c         C   sA  d } |  j  } x%t j |  D]\ } } t | t  sI t |  } n  | |  j k rv | |  j | | 7} | } q | |  j k r |  j | } | |  j | | 7} | } q | j   } | |  j k r | |  j | | 7} | } q | |  j k r#|  j | } | |  j | | 7} | } q t	 d |   q W| | f S(   s|   
        Return the unit value and the default units specified
        from the given keyword arguments dictionary.
        g        s   Unknown unit type: %s(
   R   R   t	   iteritemsR   R/   R   t   ALIASt   lowert   LALIASR   (   R   R   t   valR   t   unitR   t   uR;   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyR      s,    	 				c         C   s`   | j    } | |  j k r | S| |  j k r2 | S| |  j k rL |  j | St d |   d S(   s   
        Retrieves the unit attribute name for the given unit string.
        For example, if the given unit string is 'metre', 'm' would be returned.
        An exception is raised if an attribute cannot be found.
        s2   Could not find a unit keyword associated with "%s"N(   R;   R   R<   t	   Exception(   t   clst   unit_strR;   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   unit_attname   s    N(!   R
   t
   __module__t   NoneR   R:   R   R<   R   R   R   t   propertyR   R    R!   R"   R%   R&   R)   R*   R+   R,   R.   R0   R1   R2   R3   R4   R5   R7   R8   R   t   classmethodRC   (    (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyR   3   s8   																						c           B   s/  e  Z d  Z i d d 6d d 6d d 6d d 6d	 d
 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d  6d! d" 6d# d$ 6d% d& 6d' d( 6d) d* 6d+ d  6d, d- 6d. d/ 6d0 d1 6d2 d3 6d4 d5 6d6 d7 6d8 d9 6d: d; 6d< d= 6Z i$ d d> 6d d? 6d" d@ 6d$ dA 6d$ dB 6d  dC 6d  dD 6d; dE 6d; dF 6d/ dG 6d/ dH 6d- dI 6d= dJ 6d dK 6d
 dL 6d dM 6d dN 6d dO 6d dP 6d dQ 6d dR 6d dS 6d dT 6d dU 6d dV 6d dW 6d dX 6d  dY 6d( dZ 6d* d[ 6d1 d\ 6d3 d] 6d9 d^ 6d9 d_ 6d  d` 6d7 da 6Z e g  e j   D] \ Z Z e j	   e f ^ q Z
 db   Z RS(c   t   mg=,Ԛ4@t   chaingl4@t   chain_benoitgs<G4@t   chain_searsg|1"u4@t   british_chain_benoitgᕪQ4@t   british_chain_searsg4@t   british_chain_sears_truncatedg{Gz?t   cmgGՁ?t
   british_ftglGvB?t
   british_ydg)hć?t	   clarke_ftg#Zп?t   clarke_linkgB?t   fathomgׁ?t   ftg]A ?t   german_mgäց?t   gold_coast_ftg/!B?t	   indian_ydg
F%u?t   inchg     @@t   kmg8~߿?t   linkg,ݿ?t   link_benoitgܿ?t
   link_searsg      ?gL7A`%@t   migMbP?t   mmg     @t   nmg~j@t   nm_ukg=,Ԛ@t   rodg\NtB?t   sears_ydg`jځ?t	   survey_ftgư>t   umgB?t   ydt
   centimetert   foott   inchest	   kilometert	   kilometret   metert   metret
   micrometert
   micrometret
   millimetert
   millimetret   milet   yards   British chain (Benoit 1895 B)s   British chain (Sears 1922)s$   British chain (Sears 1922 truncated)s   British foot (Sears 1922)s   British foots   British yard (Sears 1922)s   British yards   Clarke's Foots   Clarke's links   Chain (Benoit)s   Chain (Sears)s   Foot (International)s   German legal metres   Gold Coast foots   Indian yards   Link (Benoit)s   Link (Sears)s   Nautical Miles   Nautical Mile (UK)s   US survey foots	   U.S. Foots   Yard (Indian)s   Yard (Sears)c         C   s   t  | |  j  rA t d t |  j i |  j | j t |  j 6 St  | t  rw |  j d |  j i |  j | |  j 6 St d i t	 |  j  d 6  d  S(   NR   s;   %(distance)s must be multiplied with number or %(distance)st   distance(
   R   R   R   t   AREA_PREFIXR   R   R   R-   R(   R   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyR.   )  s    	(   R
   RD   R   R   R:   t   dictt   itemst   kt   vR;   R<   R.   (    (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyR      s   

7c           B   s   e  Z e e j Z e g  e j j   D]& \ Z Z	 d  e e f e	 d f ^ q&  Z e g  e j
 j   D]" \ Z Z	 e d  e e	 f f ^ qh  Z
 e g  e
 j   D] \ Z Z	 e j   e	 f ^ q  Z d   Z d   Z RS(   s   %s%si   c         C   sW   t  | t  r6 |  j d |  j i |  j | |  j 6 St d i t |   d 6  d  S(   NR   s%   %(class)s must be divided by a numberR'   (   R   R-   R   R   R   R   R(   R   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyR2   =  s    c         C   s   t  |   j |  |  S(   N(   R	   R2   (   R   R$   (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyR3   D  s    (   R
   RD   Ru   R   R   Rv   R   Rw   Rx   Ry   R:   R;   R<   R2   R3   (    (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyR   6  s   B>7	N(   t   __doc__t   __all__t   decimalR   t   django.utils.functionalR   t   django.utilsR   t   integer_typesR/   R-   Ru   R   t   objectR   R   R   R   R    (    (    (    s3   ../Django//lib/python/django/contrib/gis/measure.pyt   <module>%   s   	Z