

_V=                 @   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 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& e e  Z+ Gd1 d2   d2 e  Z, Gd3 d4   d4 e  Z- Gd5 d6   d6 e  Z. Gd7 d8   d8 e& e e  Z/ Gd9 d:   d: e e  Z0 Gd; d<   d< e  Z1 Gd= d>   d> e e  Z2 Gd? d@   d@ e e  Z3 GdA dB   dB e e  Z4 GdC dD   dD e  Z5 GdE dF   dF e2  Z6 GdG dH   dH e e  Z7 dI S)J    )Decimal)GeometryField)	AreaField)AreaDistance)
FieldError)
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__ H/tmp/pip-build-ghmbqnp_/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*   r7   r   r   )r   r   r      s   
r   c                   s^   e  Z d  Z d Z e d d    Z   f d d   Z d d   Z d d	   Z d
 d   Z	   S)r.   Fc             C   s
   |  j  j S)N)r6   r   )r   r   r   r   r   F   s    zGeomValue.sridc                s^   |  j  r- | j j |  j d |  j  |  _ n | j j |  j  |  _ t t |   j | |  S)N	geography)r;   r#   Adapterr6   r   r.   r%   )r   r&   r'   )r   r   r   r%   J   s    	$zGeomValue.as_sqlc             C   s#   d |  j  | j j |  j  g f S)NzGeomFromText(%%s, %s))r   r#   r<   r6   )r   r&   r'   r   r   r   as_mysqlQ   s    zGeomValue.as_mysqlc             C   s#   d |  j  | j j |  j  g f S)NzGeomFromText(%%s, %s))r   r#   r<   r6   )r   r&   r'   r   r   r   	as_sqliteT   s    zGeomValue.as_sqlitec             C   s#   d |  j  | j j |  j  g f S)NzSDO_GEOMETRY(%%s, %s))r   r#   r<   r6   )r   r&   r'   r   r   r   	as_oracleW   s    zGeomValue.as_oracle)
r   r8   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   r@   r   r.   )r   
expressionZgeomr   r   )r   r   r   r   \   s    zGeoFuncWithGeoParam.__init__)r   r8   r9   r   r   r   )r   r   r@   [   s   r@   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)Nr6   )	Zget_source_expressionsr   r-   r6   r   floatr   rC   r%   )r   r&   r'   r!   )r   r   r   r>   g   s    !z#SQLiteDecimalToFloatMixin.as_sqlite)r   r8   r9   __doc__r>   r   r   )r   r   rC   b   s   rC   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   getrG   templater   rF   r%   )r   r&   r'   Ztol)r   r   r   r?   q   s    zOracleToleranceMixin.as_oracle)r   r8   r9   rG   r?   r   r   )r   r   rF   n   s   rF   c                   s4   e  Z d  Z   f d d   Z   f d d   Z   S)r   c                s   | j  j r t d  |  _ nl |  j j |  s~ |  j j |  } | ro t t j |  j j |    |  _ q t   |  _ n t	 d   t
 t |   j | |  S)Nsq_mz2Area on geodetic coordinate systems not supported.)r#   r;   r   r   geodetic
units_nameAreaMeasureunit_attnamer   NotImplementedErrorr   r   r%   )r   r&   r'   units)r   r   r   r%   x   s    $zArea.as_sqlc                s(   t  d  |  _ t t |   j | |  S)NrJ   )r   r   r   r   r?   )r   r&   r'   )r   r   r   r?      s    zArea.as_oracle)r   r8   r9   r%   r?   r   r   )r   r   r   w   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(      )appendr7   r   integer_typesr   rQ   r   )r   rB   ZbboxZcrsrS   r   r   options)r   r   r   r      s    	"			zAsGeoJSON.__init__)r   r8   r9   r
   r   r   r   r   )r   r   rQ      s   rQ   c                   s4   e  Z d  Z d Z e Z d d   f d d  Z   S)AsGMLr(   rU   rR   c                sW   | | g } | d  k	 r: | j  |  j | d t j   n  t t |   j | |   d  S)NrS   )rV   r7   r   rW   r   rY   r   )r   rB   versionrS   r   r   )r   r   r   r      s    "zAsGML.__init__)r   r8   r9   r   r
   r   r   r   r   )r   r   rY      s   rY   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   r>      s    zAsKML.as_sqlite)r   r8   r9   r>   r   r   )r   r   r[      s   r[   c                   s.   e  Z d  Z e Z d d   f d d  Z   S)AsSVGFrR   c                s_   t  | d  r | n	 t |  } | | |  j | d t j  g } t t |   j | |   d  S)Nr*   rS   )r   intr7   r   rW   r   r]   r   )r   rB   ZrelativerS   r   r   )r   r   r   r      s
    !zAsSVG.__init__)r   r8   r9   r
   r   r   r   r   )r   r   r]      s   r]   c                   s%   e  Z d  Z d   f d d  Z   S)BoundingCircle0   c                s#   t  t |   j | | g |   d  S)N)r   r_   r   )r   rB   Znum_segr   )r   r   r   r      s    zBoundingCircle.__init__)r   r8   r9   r   r   r   )r   r   r_      s   r_   c               @   s   e  Z d  Z d S)CentroidN)r   r8   r9   r   r   r   r   ra      s   ra   c               @   s   e  Z d  Z d S)
DifferenceN)r   r8   r9   r   r   r   r   rb      s   rb   c               @   s   e  Z d  Z d d   Z d S)DistanceResultMixinc             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   rK   rL   DistanceMeasurerN   )r   r6   rB   r'   context	geo_fieldZdist_attrP   r   r   r   convert_value   s    	z!DistanceResultMixin.convert_valueN)r   r8   r9   rh   r   r   r   r   rc      s   rc   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)ri   r7   boolr   r   r   )r   expr1Zexpr2ri   r   r   )r   r   r   r      s
    	zDistance.__init__c                s   t  d |  j  } |  j   d } | j o7 |  j d k } | r x t |  j |  j d d   d |  j d D]' \ } } t | t  rn d | _ qn qn WnF | j	 |  r |  j
 r d |  _ t | j  |  j d <q d	 |  _ n  t t |   j | |  S)
Nr   r   i  r(   r)   TZST_Distance_SpheroidrU   ZST_Distance_Sphere)r   r   get_source_fieldsr;   r,   r   r   r-   r.   rK   ri   r"   r   	_spheroidr   r   r%   )r   r&   r'   rg   	src_fieldr;   r3   r!   )r   r   r   as_postgresql   s    4		zDistance.as_postgresqlc                s5   |  j  r |  j j d  n  t t |   j | |  S)NrU   )ri   r   r\   r   r   r?   )r   r&   r'   )r   r   r   r?      s    	zDistance.as_oracle)	r   r8   r9   r   r   ri   r   ro   r?   r   r   )r   r   r      s
   r   c               @   s   e  Z d  Z d S)EnvelopeN)r   r8   r9   r   r   r   r   rp     s   rp   c               @   s   e  Z d  Z d S)ForceRHRN)r   r8   r9   r   r   r   r   rq   	  s   rq   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)NrS   )rV   r7   r   rW   r   rr   r   )r   rB   rS   r   r   )r   r   r   r     s    	"zGeoHash.__init__)r   r8   r9   r
   r   r   r   r   )r   r   rr     s   rr   c               @   s   e  Z d  Z d S)IntersectionN)r   r8   r9   r   r   r   r   rs     s   rs   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)ri   r   rt   r   )r   rk   ri   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   rK   featuresZsupports_length_geodeticrO   r   rt   r%   )r   r&   r'   rg   )r   r   r   r%   "  s    zLength.as_sqlc                s   t  d |  j  } |  j   d } | j o7 |  j d k } | r\ |  j j t |  j   nq | j |  r d |  _	 |  j j t | j
   n= t d d   |  j   D  } | d k r | j j |  _	 n  t t |   j | |  S)Nr   r   i  ZST_Length_Spheroidc             s   s   |  ] } | r | j  Vq d  S)N)dim).0fr   r   r   	<genexpr>3  s    z'Length.as_postgresql.<locals>.<genexpr>rU   )r   r   rl   r;   r   rV   r   ri   rK   r"   rm   minr#   Zlength3dr   rt   r%   )r   r&   r'   rg   rn   r;   rv   )r   r   r   ro   (  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   rK   ri   r"   r   rt   r%   )r   r&   r'   rg   )r   r   r   r>   8  s    	zLength.as_sqlite)	r   r8   r9   r   r   r   r%   ro   r>   r   r   )r   r   rt     s
   rt   c               @   s   e  Z d  Z e Z d S)MemSizeN)r   r8   r9   r	   r   r   r   r   r   r{   B  s   r{   c               @   s   e  Z d  Z e Z d S)NumGeometriesN)r   r8   r9   r	   r   r   r   r   r   r|   F  s   r|   c                   s(   e  Z d  Z e Z   f d d   Z   S)	NumPointsc                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   r>   M  s    zNumPoints.as_sqlite)r   r8   r9   r	   r   r>   r   r   )r   r   r}   J  s   r}   c                   s(   e  Z d  Z e Z   f d d   Z   S)	Perimeterc                sV   t  d d   |  j   D  } | d k r= | j j |  _ n  t t |   j | |  S)Nc             s   s   |  ] } | j  Vq d  S)N)rv   )rw   rx   r   r   r   ry   W  s    z*Perimeter.as_postgresql.<locals>.<genexpr>rU   )rz   rl   r#   Zperimeter3dr"   r   r~   r%   )r   r&   r'   rv   )r   r   r   ro   V  s    zPerimeter.as_postgresql)r   r8   r9   r   r   ro   r   r   )r   r   r~   S  s   r~   c               @   s   e  Z d  Z d S)PointOnSurfaceN)r   r8   r9   r   r   r   r   r   ]  s   r   c               @   s   e  Z d  Z d S)ReverseN)r   r8   r9   r   r   r   r   r   a  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)r7   NUMERIC_TYPESrV   r   r   r   )r   rB   r   r   r   r   r   )r   r   r   r   f  s    zScale.__init__)r   r8   r9   r   r   r   )r   r   r   e  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(   rU   c                s%   g  |  ] }   j  | d  t   q S)r4   )r7   r   )rw   arg)r   r   r   
<listcomp>w  s   	 z'SnapToGrid.__init__.<locals>.<listcomp>   c                s%   g  |  ] }   j  | d  t   q S)r4   )r7   r   )rw   r   )r   r   r   r   |  s   	 c                s%   g  |  ] }   j  | d  t   q S)r4   )r7   r   )rw   r   )r   r   r   r     s   	 r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r(   rU   )lenextendrA   r   r   r   )r   rB   r0   r   nargsr   )r   )r   r   r   r  s    	$'zSnapToGrid.__init__)r   r8   r9   r   r   r   )r   r   r   q  s   r   c               @   s   e  Z d  Z d S)SymDifferenceN)r   r8   r9   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)r/   c                s;   | |  j  | d t j  g } t t |   j | |   d  S)Nr   )r7   r   rW   r   r/   r   )r   rB   r   r   r   )r   r   r   r     s    zTransform.__init__c             C   s   |  j  |  j d j S)Nr(   )r   r   r6   )r   r   r   r   r     s    zTransform.sridc                sK   t  t |   j | | | |  } | j j rG | j rG |  j | _ n  | S)N)r   r/   rh   r#   Zpostgisr   )r   r6   rB   r'   rf   )r   r   r   rh     s    !zTransform.convert_value)r   r8   r9   r   r:   r   rh   r   r   )r   r   r/     s   r/   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ShiftCoordsrT   z-This version of Spatialite doesn't support 3D)r#   r$   r   r   r   rV   r   rA   r   r   r>   )r   r&   r'   	func_name)r   r   r   r>     s    !!zTranslate.as_sqlite)r   r8   r9   r>   r   r   )r   r   r     s   r   c               @   s   e  Z d  Z d S)UnionN)r   r8   r9   r   r   r   r   r     s   r   N)8decimalr   Z#django.contrib.gis.db.models.fieldsr   Z django.contrib.gis.db.models.sqlr   Zdjango.contrib.gis.measurer   rM   r   re   Zdjango.core.exceptionsr   Zdjango.db.modelsr   r	   r
   Zdjango.db.models.expressionsr   r   Zdjango.utilsr   rW   rD   r   r   r.   r@   objectrC   rF   rQ   rY   r[   r]   r_   ra   rb   rc   rp   rq   rr   rs   rt   r{   r|   r}   r~   r   r   r   r   r   r/   r   r   r   r   r   r   <module>   sP   3	%
'	
