
 X@                 @   s  d  d l  m Z d  d l m Z d  d l m Z d  d l m Z 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 d  d l m Z e j e e f Z Gd	 d
   d
 e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z Gd d   d e e  Z Gd d   d e  Z  Gd d   d e  Z! Gd d   d e!  Z" Gd d   d e  Z# Gd d   d e  Z$ Gd d    d  e e  Z% Gd! d"   d" e e  Z& Gd# d$   d$ e  Z' Gd% d&   d& e' e e  Z	 Gd' d(   d( e  Z( Gd) d*   d* e  Z) Gd+ d,   d, e  Z* Gd- d.   d. e e  Z+ Gd/ d0   d0 e  Z, Gd1 d2   d2 e' e e  Z- Gd3 d4   d4 e  Z. Gd5 d6   d6 e  Z/ Gd7 d8   d8 e  Z0 Gd9 d:   d: e  Z1 Gd; d<   d< e' e e  Z2 Gd= d>   d> e e  Z3 Gd? d@   d@ e  Z4 GdA dB   dB e e  Z5 GdC dD   dD e e  Z6 GdE dF   dF e e  Z7 GdG dH   dH e  Z8 GdI dJ   dJ e5  Z9 GdK dL   dL e e  Z: dM S)N    )Decimal)GeometryField)	AreaField)AreaDistance)
FieldError)BooleanField
FloatFieldIntegerField	TextField)FuncValue)sixc                   s   e  Z d  Z d Z d Z d Z   f d d   Z e d d    Z e d d    Z	   f d	 d
   Z
   f d d   Z d d d d  Z   S)GeoFuncNr   c                sE   d | k r( |  j  r( |  j    | d <n  t t |   j | |   d  S)Noutput_field)output_field_classsuperr   __init__)selfexpressionsextra)	__class__ T/home/ubuntu/projects/ifolica/build/django/django/contrib/gis/db/models/functions.pyr      s    zGeoFunc.__init__c             C   s
   |  j  j S)N)r   __name__)r   r   r   r   name   s    zGeoFunc.namec             C   sW   |  j  |  j } t | d  r& | j Sy | j j SWn t t f k
 rR d  SYn Xd  S)Nsrid)source_expressionsgeom_param_poshasattrr   fieldAttributeErrorr   )r   exprr   r   r   r      s    zGeoFunc.sridc                sC   |  j  d  k r* | j j |  j  |  _  n  t t |   j | |  S)N)functionopsspatial_function_namer   r   r   as_sql)r   compiler
connection)r   r   r   r&   (   s    zGeoFunc.as_sqlc                s   t  t |   j | |   } | j } | s9 t d   n  xp t | j d d   d d D]O \ } } t | t  rY | j | k rY t	 | |  j | |   | j | <qY qY W| S)Nz9Geometry functions can only operate on geometric content.   start)
r   r   resolve_expressionr   	TypeError	enumerater   
isinstance	GeomValue	Transform)r   argskwargsresZ	base_sridposr"   )r   r   r   r+   -   s    	,)zGeoFunc.resolve_expression c             C   sK   t  | d  sG | rG t | |  rG t d | t |  f   qG n  | S)Nr+   z2The %s parameter has the wrong type: should be %s.)r   r.   r,   str)r   valueZ
param_nameZcheck_typesr   r   r   _handle_param9   s    zGeoFunc._handle_param)r   
__module____qualname__r#   r   r   r   propertyr   r   r&   r+   r8   r   r   )r   r   r      s   
r   c                   sR   e  Z d  Z d Z e d d    Z d d   Z d d   Z   f d d	   Z   S)
r/   Fc             C   s
   |  j  j S)N)r7   r   )r   r   r   r   r   F   s    zGeomValue.sridc             C   s/   d | j  j |  j f | j  j |  j  g f S)Nz%s(%%s, %s))r$   	from_textr   Adapterr7   )r   r'   r(   r   r   r   r&   J   s    zGeomValue.as_sqlc             C   s&   d | j  j | j  j |  j  g f S)Nz%s(%%s))r$   r<   r=   r7   )r   r'   r(   r   r   r   as_mysqlM   s    zGeomValue.as_mysqlc                s^   |  j  r- | j j |  j d |  j  |  _ n | j j |  j  |  _ t t |   j | |  S)N	geography)r?   r$   r=   r7   r   r/   r&   )r   r'   r(   )r   r   r   as_postgresqlP   s    	$zGeomValue.as_postgresql)	r   r9   r:   r?   r;   r   r&   r>   r@   r   r   )r   r   r/   C   s
   r/   c                   s"   e  Z d  Z   f d d   Z   S)GeoFuncWithGeoParamc                sR   t  | d  s | j r) t d   n  t t |   j | t |  | |  d  S)Nr   z8Please provide a geometry attribute with a defined SRID.)r   r   
ValueErrorr   rA   r   r/   )r   
expressionZgeomr   r   )r   r   r   r   Y   s    zGeoFuncWithGeoParam.__init__)r   r9   r:   r   r   r   )r   r   rA   X   s   rA   c                   s(   e  Z d  Z d Z   f d d   Z   S)SQLiteDecimalToFloatMixinz
    By default, Decimal values are converted to str by the SQLite backend, which
    is not acceptable by the GIS functions expecting numeric values.
    c                sf   xJ |  j    D]< } t | d  r t | j t  r t | j  | _ q q Wt t |   j | |  S)Nr7   )	Zget_source_expressionsr   r.   r7   r   floatr   rD   r&   )r   r'   r(   r"   )r   r   r   	as_sqlited   s    !z#SQLiteDecimalToFloatMixin.as_sqlite)r   r9   r:   __doc__rF   r   r   )r   r   rD   _   s   rD   c                   s(   e  Z d  Z d Z   f d d   Z   S)OracleToleranceMixing?c                s>   |  j  j d |  j  } d | |  _ t t |   j | |  S)N	tolerancez#%%(function)s(%%(expressions)s, %s))r   getrI   templater   rH   r&   )r   r'   r(   Ztol)r   r   r   	as_oraclen   s    zOracleToleranceMixin.as_oracle)r   r9   r:   rI   rL   r   r   )r   r   rH   k   s   rH   c                   s@   e  Z d  Z e Z d Z   f d d   Z   f d d   Z   S)r   r)   c                s   | j  j r d |  j _ np |  j   } t |  r | d } | j |  r[ t d   n  | j |  } | r t	 j
 |  |  j _ q n  t t |   j | |  S)Nsq_mr   z2Area on geodetic coordinate systems not supported.)r$   r?   r   Zarea_attget_source_fieldslengeodeticNotImplementedError
units_nameAreaMeasureunit_attnamer   r   r&   )r   r'   r(   Zsource_fieldsZsource_fieldrR   )r   r   r   r&   x   s    
zArea.as_sqlc                s(   t  d  |  _ t t |   j | |  S)NrM   )r   r   r   r   rL   )r   r'   r(   )r   r   r   rL      s    zArea.as_oracle)r   r9   r:   r   r   arityr&   rL   r   r   )r   r   r   t   s   r   c                   s1   e  Z d  Z e Z d d d   f d d  Z   S)	AsGeoJSONF   c                s   | g } | d  k	 r7 | j  |  j | d t j   n  d } | rR | rR d } n | ra d } n | rp d } n  | r | j  |  n  t t |   j | |   d  S)N	precisionr      r)      )appendr8   r   integer_typesr   rV   r   )r   rC   ZbboxZcrsrX   r   r   options)r   r   r   r      s    	"			zAsGeoJSON.__init__)r   r9   r:   r   r   r   r   r   )r   r   rV      s   rV   c                   s4   e  Z d  Z d Z e Z d d   f d d  Z   S)AsGMLr)   rZ   rW   c                sW   | | g } | d  k	 r: | j  |  j | d t j   n  t t |   j | |   d  S)NrX   )r[   r8   r   r\   r   r^   r   )r   rC   versionrX   r   r   )r   r   r   r      s    "zAsGML.__init__)r   r9   r:   r   r   r   r   r   r   )r   r   r^      s   r^   c                   s"   e  Z d  Z   f d d   Z   S)AsKMLc                s)   |  j  j d  t t |   j | |  S)Nr   )r   popr   r`   r&   )r   r'   r(   )r   r   r   rF      s    zAsKML.as_sqlite)r   r9   r:   rF   r   r   )r   r   r`      s   r`   c                   s.   e  Z d  Z e Z d d   f d d  Z   S)AsSVGFrW   c                s_   t  | d  r | n	 t |  } | | |  j | d t j  g } t t |   j | |   d  S)Nr+   rX   )r   intr8   r   r\   r   rb   r   )r   rC   ZrelativerX   r   r   )r   r   r   r      s
    !zAsSVG.__init__)r   r9   r:   r   r   r   r   r   )r   r   rb      s   rb   c                   s%   e  Z d  Z d   f d d  Z   S)BoundingCircle0   c                s#   t  t |   j | | g |   d  S)N)r   rd   r   )r   rC   Znum_segr   )r   r   r   r      s    zBoundingCircle.__init__)r   r9   r:   r   r   r   )r   r   rd      s   rd   c               @   s   e  Z d  Z d Z d S)Centroidr)   N)r   r9   r:   rU   r   r   r   r   rf      s   rf   c               @   s   e  Z d  Z d Z d S)
DifferencerZ   N)r   r9   r:   rU   r   r   r   r   rg      s   rg   c               @   s(   e  Z d  Z d d   Z d d   Z d S)DistanceResultMixinc             C   s    |  j    d j o |  j d k S)Nr   i  )rN   r?   r   )r   r   r   r   source_is_geography   s    z'DistanceResultMixin.source_is_geographyc             C   s   | d  k r d  St  d |  j  } | j |  r: d } n- | j |  } | ra t j |  } n d  } | r~ t i | | 6  S| S)Nr   m)r   r   rP   rR   DistanceMeasurerT   )r   r7   rC   r(   context	geo_fieldZdist_attZunitsr   r   r   convert_value   s    	z!DistanceResultMixin.convert_valueN)r   r9   r:   ri   rn   r   r   r   r   rh      s   rh   c                   sU   e  Z d  Z e Z d Z d   f d d  Z   f d d   Z   f d d   Z   S)r   Nc                s]   | | g } | d  k	 r@ | |  _  | |  j | d t  f 7} n  t t |   j | |   d  S)Nspheroid)ro   r8   boolr   r   r   )r   expr1Zexpr2ro   r   r   )r   r   r   r      s
    	zDistance.__init__c                s   t  d |  j  } |  j   rz x t |  j |  j d d   d |  j d D]' \ } } t | t  rL d | _ qL qL WnF | j	 |  r |  j
 r d |  _ t | j  |  j d <q d |  _ n  t t |   j | |  S)Nr   r)   r*   TZST_Distance_SpheroidrZ   ZST_Distance_Sphere)r   r   ri   r-   r   r   r.   r/   r?   rP   ro   r#   r   	_spheroidr   r   r&   )r   r'   r(   rm   r4   r"   )r   r   r   r@      s    4		zDistance.as_postgresqlc                s5   |  j  r |  j j d  n  t t |   j | |  S)NrZ   )ro   r   ra   r   r   rL   )r   r'   r(   )r   r   r   rL      s    	zDistance.as_oracle)	r   r9   r:   r	   r   ro   r   r@   rL   r   r   )r   r   r      s
   r   c               @   s   e  Z d  Z d Z d S)Enveloper)   N)r   r9   r:   rU   r   r   r   r   rs     s   rs   c               @   s   e  Z d  Z d Z d S)ForceRHRr)   N)r   r9   r:   rU   r   r   r   r   rt     s   rt   c                   s+   e  Z d  Z e Z d   f d d  Z   S)GeoHashNc                sT   | g } | d  k	 r7 | j  |  j | d t j   n  t t |   j | |   d  S)NrX   )r[   r8   r   r\   r   ru   r   )r   rC   rX   r   r   )r   r   r   r     s    	"zGeoHash.__init__)r   r9   r:   r   r   r   r   r   )r   r   ru     s   ru   c               @   s   e  Z d  Z d Z d S)IntersectionrZ   N)r   r9   r:   rU   r   r   r   r   rv     s   rv   c               @   s   e  Z d  Z e Z d S)IsValidN)r   r9   r:   r   r   r   r   r   r   rw     s   rw   c                   sa   e  Z d  Z e Z d   f d d  Z   f d d   Z   f d d   Z   f d d	   Z   S)
LengthTc                s&   | |  _  t t |   j | |  d  S)N)ro   r   rx   r   )r   rq   ro   r   )r   r   r   r   !  s    	zLength.__init__c                sV   t  d |  j  } | j |  r= | j j r= t d   n  t t |   j | |  S)Nr   z6This backend doesn't support Length on geodetic fields)	r   r   rP   featuresZsupports_length_geodeticrQ   r   rx   r&   )r   r'   r(   rm   )r   r   r   r&   %  s    zLength.as_sqlc                s   t  d |  j  } |  j   r: |  j j t |  j   nq | j |  rn d |  _ |  j j t | j	   n= t
 d d   |  j   D  } | d k r | j j |  _ n  t t |   j | |  S)Nr   ZST_Length_Spheroidc             s   s   |  ] } | r | j  Vq d  S)N)dim).0fr   r   r   	<genexpr>4  s    z'Length.as_postgresql.<locals>.<genexpr>rZ   )r   r   ri   r   r[   r   ro   rP   r#   rr   minrN   r$   Zlength3dr   rx   r&   )r   r'   r(   rm   rz   )r   r   r   r@   +  s    	zLength.as_postgresqlc                s[   t  d |  j  } | j |  rB |  j r6 d |  _ qB d |  _ n  t t |   j | |  S)Nr   ZGeodesicLengthZGreatCircleLength)r   r   rP   ro   r#   r   rx   r&   )r   r'   r(   rm   )r   r   r   rF   9  s    	zLength.as_sqlite)	r   r9   r:   r	   r   r   r&   r@   rF   r   r   )r   r   rx     s
   rx   c               @   s   e  Z d  Z d S)	MakeValidN)r   r9   r:   r   r   r   r   r   C  s   r   c               @   s   e  Z d  Z e Z d Z d S)MemSizer)   N)r   r9   r:   r
   r   rU   r   r   r   r   r   G  s   r   c               @   s   e  Z d  Z e Z d Z d S)NumGeometriesr)   N)r   r9   r:   r
   r   rU   r   r   r   r   r   L  s   r   c                   s.   e  Z d  Z e Z d Z   f d d   Z   S)	NumPointsr)   c                sD   |  j  |  j j j d k r+ t d   n  t t |   j | |  S)NZ
LINESTRINGz;SpatiaLite NumPoints can only operate on LineString content)r   r   r   Z	geom_typer,   r   r   r&   )r   r'   r(   )r   r   r   rF   U  s    zNumPoints.as_sqlite)r   r9   r:   r
   r   rU   rF   r   r   )r   r   r   Q  s   r   c                   s@   e  Z d  Z e Z d Z   f d d   Z   f d d   Z   S)	Perimeterr)   c                s   t  d |  j  } | j |  r= |  j   r= t d   n  t d d   |  j   D  } | d k rz | j j |  _	 n  t
 t |   j | |  S)Nr   z<ST_Perimeter cannot use a non-projected non-geography field.c             s   s   |  ] } | j  Vq d  S)N)rz   )r{   r|   r   r   r   r}   c  s    z*Perimeter.as_postgresql.<locals>.<genexpr>rZ   )r   r   rP   ri   rQ   r~   rN   r$   Zperimeter3dr#   r   r   r&   )r   r'   r(   rm   rz   )r   r   r   r@   _  s    zPerimeter.as_postgresqlc                sI   t  d |  j  } | j |  r0 t d   n  t t |   j | |  S)Nr   z+Perimeter cannot use a non-projected field.)r   r   rP   rQ   r   r   r&   )r   r'   r(   rm   )r   r   r   rF   h  s    zPerimeter.as_sqlite)r   r9   r:   r	   r   rU   r@   rF   r   r   )r   r   r   [  s   	r   c               @   s   e  Z d  Z d Z d S)PointOnSurfacer)   N)r   r9   r:   rU   r   r   r   r   r   o  s   r   c               @   s   e  Z d  Z d Z d S)Reverser)   N)r   r9   r:   rU   r   r   r   r   r   s  s   r   c                   s%   e  Z d  Z d   f d d  Z   S)Scaleg        c                su   | |  j  | d t  |  j  | d t  g } | d k rX | j |  j  | d t   n  t t |   j | |   d  S)Nxyg        z)r8   NUMERIC_TYPESr[   r   r   r   )r   rC   r   r   r   r   r   )r   r   r   r   x  s    zScale.__init__)r   r9   r:   r   r   r   )r   r   r   w  s   r   c                   s"   e  Z d  Z   f d d   Z   S)
SnapToGridc                s   t  |  } | g } | d
 k rD | j   f d d   | D  no | d k r | j   f d d   | d d   D  | j   f d d   | d d  D  n t d	   t t    j | |   d  S)Nr)   rZ   c                s%   g  |  ] }   j  | d  t   q S)r5   )r8   r   )r{   arg)r   r   r   
<listcomp>  s   	 z'SnapToGrid.__init__.<locals>.<listcomp>   c                s%   g  |  ] }   j  | d  t   q S)r5   )r8   r   )r{   r   )r   r   r   r     s   	 c                s%   g  |  ] }   j  | d  t   q S)r5   )r8   r   )r{   r   )r   r   r   r     s   	 r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r)   rZ   )rO   extendrB   r   r   r   )r   rC   r1   r   nargsr   )r   )r   r   r     s    	$'zSnapToGrid.__init__)r   r9   r:   r   r   r   )r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)SymDifferencerZ   N)r   r9   r:   rU   r   r   r   r   r     s   r   c                   sF   e  Z d  Z   f d d   Z e d d    Z   f d d   Z   S)r0   c                s;   | |  j  | d t j  g } t t |   j | |   d  S)Nr   )r8   r   r\   r   r0   r   )r   rC   r   r   r   )r   r   r   r     s    zTransform.__init__c             C   s   |  j  |  j d j S)Nr)   )r   r   r7   )r   r   r   r   r     s    zTransform.sridc                sK   t  t |   j | | | |  } | j j rG | j rG |  j | _ n  | S)N)r   r0   rn   r$   Zpostgisr   )r   r7   rC   r(   rl   )r   r   r   rn     s    !zTransform.convert_value)r   r9   r:   r   r;   r   rn   r   r   )r   r   r0     s   r0   c                   s"   e  Z d  Z   f d d   Z   S)	Translatec                s   | j  j |  j  } | d k rO t |  j  d k  rO |  j j t d   n0 | d k r t |  j  d k r t d   n  t t	 |   j
 | |  S)NZST_Translater   r   ZShiftCoordsrY   z-This version of Spatialite doesn't support 3D)r$   r%   r   rO   r   r[   r   rB   r   r   rF   )r   r'   r(   	func_name)r   r   r   rF     s    !!zTranslate.as_sqlite)r   r9   r:   rF   r   r   )r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)UnionrZ   N)r   r9   r:   rU   r   r   r   r   r     s   r   N);decimalr   Z#django.contrib.gis.db.models.fieldsr   Z django.contrib.gis.db.models.sqlr   Zdjango.contrib.gis.measurer   rS   r   rk   Zdjango.core.exceptionsr   Zdjango.db.modelsr   r	   r
   r   Zdjango.db.models.expressionsr   r   Zdjango.utilsr   r\   rE   r   r   r/   rA   objectrD   rH   rV   r^   r`   rb   rd   rf   rg   rh   rs   rt   ru   rv   rw   rx   r   r   r   r   r   r   r   r   r   r   r0   r   r   r   r   r   r   <module>   sT   "3	#
%
