
^Q\H                 @   s  d  d l  m Z d  d l m Z 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" 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. Gd0 d1   d1 e" e  Z/ Gd2 d3   d3 e* e" e  Z0 Gd4 d5   d5 e  Z1 Gd6 d7   d7 e  Z2 Gd8 d9   d9 e  Z3 Gd: d;   d; e  Z4 Gd< d=   d= e* e" e  Z5 Gd> d?   d? e" e  Z6 Gd@ dA   dA e  Z7 GdB dC   dC e! e  Z8 GdD dE   dE e! e  Z9 GdF dG   dG e" e  Z: GdH dI   dI e  Z; GdJ dK   dK e8  Z< GdL dM   dM e" e  Z= dN S)O    )Decimal)GeometryFieldRasterField)	AreaField)Geometry)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	 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__ L/var/www/dbchiro/venv/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             C   s   |  j  r t d |  j   Sd  S)Nr   )r   r   )r   r   r   r   	geo_field)   s    zGeoFunc.geo_fieldc                st   |  j  d  k r* | j j |  j  |  _  n  t d d   |  j   D  rX t d   n  t t |   j	 | | |  S)Nc             s   s   |  ] } t  | t  Vq d  S)N)
isinstancer   ).0r"   r   r   r   	<genexpr>0   s    z!GeoFunc.as_sql.<locals>.<genexpr>z3Geometry functions not supported for raster fields.)
functionopsspatial_function_namer   anyget_source_fields	TypeErrorr   r   as_sql)r   compiler
connectionextra_context)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   r.   	enumerater   r&   	GeomValue	Transform)r   argskwargsresZ	base_sridposr$   )r   r   r   r5   4   s    	,)zGeoFunc.resolve_expression c             C   sK   t  | d  sG | rG t | |  rG t d | t |  f   qG n  | S)Nr5   z2The %s parameter has the wrong type: should be %s.)r!   r&   r.   str)r   valueZ
param_nameZcheck_typesr   r   r   _handle_param@   s    zGeoFunc._handle_param)r   
__module____qualname__r)   r   r    r   propertyr   r   r%   r/   r5   r@   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)
r7   Fc             C   s
   |  j  j S)N)r?   r   )r   r   r   r   r   M   s    zGeomValue.sridc             C   s/   d | j  j |  j f | j  j |  j  g f S)Nz%s(%%s, %s))r*   	from_textr   Adapterr?   )r   r0   r1   r   r   r   r/   Q   s    zGeomValue.as_sqlc             C   s&   d | j  j | j  j |  j  g f S)Nz%s(%%s))r*   rD   rE   r?   )r   r0   r1   r   r   r   as_mysqlT   s    zGeomValue.as_mysqlc                s^   |  j  r- | j j |  j d |  j  |  _ n | j j |  j  |  _ t t |   j | |  S)N	geography)rG   r*   rE   r?   r   r7   r/   )r   r0   r1   )r   r   r   as_postgresqlW   s    	$zGeomValue.as_postgresql)	r   rA   rB   rG   rC   r   r/   rF   rH   r   r   )r   r   r7   J   s
   r7   c                   s"   e  Z d  Z   f d d   Z   S)GeoFuncWithGeoParamc                sp   t  | t  s t d   n  t | d  s8 | j rG t d   n  t t |   j | t	 |  | |  d  S)Nz!Please provide a geometry object.r   z8Please provide a geometry attribute with a defined SRID.)
r&   r   r.   r!   r   
ValueErrorr   rI   r   r7   )r   
expressionZgeomr   r   )r   r   r   r   `   s
    zGeoFuncWithGeoParam.__init__)r   rA   rB   r   r   r   )r   r   rI   _   s   rI   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)Nr?   )	get_source_expressionsr!   r&   r?   r   floatr   rL   r/   )r   r0   r1   r$   )r   r   r   	as_sqlitem   s    !z#SQLiteDecimalToFloatMixin.as_sqlite)r   rA   rB   __doc__rO   r   r   )r   r   rL   h   s   rL   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   getrR   templater   rQ   r/   )r   r0   r1   Ztol)r   r   r   	as_oraclew   s    zOracleToleranceMixin.as_oracle)r   rA   rB   rR   rU   r   r   )r   r   rQ   t   s   rQ   c                   sL   e  Z d  Z e Z d Z   f d d   Z   f d d   Z d d   Z   S)r   r3   c                s   | j  j r d |  j _ no |  j } | j |  r] | j j rN d |  j _ q t d   n- | j	 |  } | r t
 j |  |  j _ n  t t |   j | | |  S)Nsq_mz2Area on geodetic coordinate systems not supported.)r*   rG   r   Zarea_attr%   geodeticfeaturesZsupports_area_geodeticNotImplementedError
units_nameAreaMeasureunit_attnamer   r   r/   )r   r0   r1   r2   r%   rZ   )r   r   r   r/      s    	zArea.as_sqlc                s(   t  d  |  _ t t |   j | |  S)NrV   )r   r   r   r   rU   )r   r0   r1   )r   r   r   rU      s    zArea.as_oraclec             K   s<   |  j  j |  r) d | d <d | d <n  |  j | | |  S)Nz+%(function)s(%(expressions)s, %(spheroid)d)rT   Tspheroid)r%   rW   r/   )r   r0   r1   r2   r   r   r   rO      s    
zArea.as_sqlite)	r   rA   rB   r   r   arityr/   rU   rO   r   r   )r   r   r   }   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      r3      )appendr@   r   integer_typesr   r_   r   )r   rK   ZbboxZcrsra   r   r   options)r   r   r   r      s    	"			zAsGeoJSON.__init__)r   rA   rB   r   r   r   r   r   )r   r   r_      s   r_   c                   sF   e  Z d  Z d Z e Z d d   f d d  Z   f d d   Z   S)AsGMLr3   rc   r`   c                sW   | | g } | d  k	 r: | j  |  j | d t j   n  t t |   j | |   d  S)Nra   )rd   r@   r   re   r   rg   r   )r   rK   versionra   r   r   )r   r   r   r      s    "zAsGML.__init__c                sq   |  j    } | d } |  j   } | j | d g  | j d k rK d n d | d <t t |  j | | |  S)Nr   r3   rb   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr)   )rM   copyset_source_expressionsr?   r   rg   r/   )r   r0   r1   r2   r   rh   clone)r   r   r   rU      s    
zAsGML.as_oracle)r   rA   rB   r    r   r   r   rU   r   r   )r   r   rg      s   rg   c               @   s   e  Z d  Z d d   Z d S)AsKMLc             C   s9   |  j    } | j |  j   d d    | j | |  S)Nr3   )ri   rj   rM   r/   )r   r0   r1   rk   r   r   r   rO      s    zAsKML.as_sqliteN)r   rA   rB   rO   r   r   r   r   rl      s   rl   c                   s.   e  Z d  Z e Z d d   f d d  Z   S)AsSVGFr`   c                s_   t  | d  r | n	 t |  } | | |  j | d t j  g } t t |   j | |   d  S)Nr5   ra   )r!   intr@   r   re   r   rm   r   )r   rK   Zrelativera   r   r   )r   r   r   r      s
    !zAsSVG.__init__)r   rA   rB   r   r   r   r   r   )r   r   rm      s   rm   c                   s7   e  Z d  Z d   f d d  Z   f d d   Z   S)BoundingCircle0   c                s#   t  t |   j | | g |   d  S)N)r   ro   r   )r   rK   Znum_segr   )r   r   r   r      s    zBoundingCircle.__init__c                s?   |  j    } | j |  j   d g  t t |  j | |  S)Nr   )ri   rj   rM   r   ro   rU   )r   r0   r1   rk   )r   r   r   rU      s    zBoundingCircle.as_oracle)r   rA   rB   r   rU   r   r   )r   r   ro      s   ro   c               @   s   e  Z d  Z d Z d S)Centroidr3   N)r   rA   rB   r^   r   r   r   r   rq      s   rq   c               @   s   e  Z d  Z d Z d S)
Differencerc   N)r   rA   rB   r^   r   r   r   r   rr      s   rr   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  )r-   rG   r   )r   r   r   r   source_is_geography   s    z'DistanceResultMixin.source_is_geographyc             C   sy   | d  k r d  S|  j  } | j |  r1 d } n- | j |  } | rX t j |  } n d  } | ru t i | | 6  S| S)Nm)r%   rW   rZ   DistanceMeasurer\   )r   r?   rK   r1   contextr%   Zdist_attZunitsr   r   r   convert_value   s    		z!DistanceResultMixin.convert_valueN)r   rA   rB   rt   rx   r   r   r   r   rs      s   rs   c                   sg   e  Z d  Z e Z d Z d   f d d  Z   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)Nr]   )r]   r@   boolr   r   r   )r   expr1Zexpr2r]   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 Wn^ | j	 |  r |  j
 r | j j d  |  _ t | j  |  j d <q | j j d  |  _ n  t t |   j | |  S)Nr   r3   r4   TZDistanceSpheroidrc   ZDistanceSphere)r   r   rt   r6   r   r    r&   r7   rG   rW   r]   r*   r+   r)   r   	_spheroidr   r   r/   )r   r0   r1   r%   r<   r$   )r   r   r   rH     s    4	zDistance.as_postgresqlc                s5   |  j  r |  j j d  n  t t |   j | |  S)Nrc   )r]   r   popr   r   rU   )r   r0   r1   )r   r   r   rU     s    	zDistance.as_oraclec                sp   |  j  r |  j j d  n  |  j j |  rT d | d <t t |  j    | d <n  t t |   j	 | | |  S)Nrc   z8COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)rT   r]   )
r]   r   r|   r%   rW   rn   ry   r   r   r/   )r   r0   r1   r2   )r   r   r   rO   #  s    	
zDistance.as_sqlite)
r   rA   rB   r   r   r]   r   rH   rU   rO   r   r   )r   r   r      s   r   c               @   s   e  Z d  Z d Z d S)Enveloper3   N)r   rA   rB   r^   r   r   r   r   r}   -  s   r}   c               @   s   e  Z d  Z d Z d S)ForceRHRr3   N)r   rA   rB   r^   r   r   r   r   r~   1  s   r~   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)Nra   )rd   r@   r   re   r   r   r   )r   rK   ra   r   r   )r   r   r   r   8  s    	"zGeoHash.__init__)r   rA   rB   r   r   r   r   r   )r   r   r   5  s   r   c               @   s   e  Z d  Z d Z d S)Intersectionrc   N)r   rA   rB   r^   r   r   r   r   r   ?  s   r   c                   s(   e  Z d  Z e Z   f d d   Z   S)IsValidc                s2   t  t |   j | | |  \ } } d | | f S)Nz%CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END)r   r   rU   )r   r0   r1   r2   Zsqlparams)r   r   r   rU   F  s    $zIsValid.as_oracle)r   rA   rB   r
   r   rU   r   r   )r   r   r   C  s   r   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)r]   r   r   r   )r   rz   r]   r   )r   r   r   r   N  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   rW   rX   Zsupports_length_geodeticrY   r   r   r/   )r   r0   r1   r%   )r   r   r   r/   R  s    zLength.as_sqlc                s   t  d |  j  } |  j   r: |  j j t |  j   n} | j |  rz | j j	 d  |  _
 |  j j t | j   n= t d d   |  j   D  } | d k r | j j |  _
 n  t t |   j | |  S)Nr   ZLengthSpheroidc             s   s   |  ] } | r | j  Vq d  S)N)dim)r'   fr   r   r   r(   a  s    z'Length.as_postgresql.<locals>.<genexpr>rc   )r   r   rt   r   rd   r   r]   rW   r*   r+   r)   r{   minr-   Zlength3dr   r   r/   )r   r0   r1   r%   r   )r   r   r   rH   X  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   rW   r]   r)   r   r   r/   )r   r0   r1   r%   )r   r   r   rO   f  s    	zLength.as_sqlite)	r   rA   rB   r   r   r   r/   rH   rO   r   r   )r   r   r   K  s
   r   c               @   s   e  Z d  Z d S)	MakeValidN)r   rA   rB   r   r   r   r   r   p  s   r   c               @   s   e  Z d  Z e Z d Z d S)MemSizer3   N)r   rA   rB   r   r   r^   r   r   r   r   r   t  s   r   c               @   s   e  Z d  Z e Z d Z d S)NumGeometriesr3   N)r   rA   rB   r   r   r^   r   r   r   r   r   y  s   r   c                   s.   e  Z d  Z e Z d Z   f d d   Z   S)	NumPointsr3   c                sS   |  j  |  j j j d k r: | j j s: t d   q: n  t t |   j	 | |  S)NZ
LINESTRINGzBNumPoints can only operate on LineString content on this database.)
r   r    r   Z	geom_typerX   Zsupports_num_points_polyr.   r   r   r/   )r   r0   r1   )r   r   r   r/     s    zNumPoints.as_sql)r   rA   rB   r   r   r^   r/   r   r   )r   r   r   ~  s   r   c                   s@   e  Z d  Z e Z d Z   f d d   Z   f d d   Z   S)	Perimeterr3   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)r   )r'   r   r   r   r   r(     s    z*Perimeter.as_postgresql.<locals>.<genexpr>rc   )r   r   rW   rt   rY   r   r-   r*   Zperimeter3dr)   r   r   r/   )r   r0   r1   r%   r   )r   r   r   rH     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   rW   rY   r   r   r/   )r   r0   r1   r%   )r   r   r   rO     s    zPerimeter.as_sqlite)r   rA   rB   r   r   r^   rH   rO   r   r   )r   r   r     s   	r   c               @   s   e  Z d  Z d Z d S)PointOnSurfacer3   N)r   rA   rB   r^   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)Reverser3   N)r   rA   rB   r^   r   r   r   r   r     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)r@   NUMERIC_TYPESrd   r   r   r   )r   rK   r   r   r   r   r   )r   r   r   r     s    zScale.__init__)r   rA   rB   r   r   r   )r   r   r     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)Nr3   rc   c                s%   g  |  ] }   j  | d  t   q S)r=   )r@   r   )r'   arg)r   r   r   
<listcomp>  s   	 z'SnapToGrid.__init__.<locals>.<listcomp>   c                s%   g  |  ] }   j  | d  t   q S)r=   )r@   r   )r'   r   )r   r   r   r     s   	 c                s%   g  |  ] }   j  | d  t   q S)r=   )r@   r   )r'   r   )r   r   r   r     s   	 r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r3   rc   )lenextendrJ   r   r   r   )r   rK   r9   r   nargsr   )r   )r   r   r     s    	$'zSnapToGrid.__init__)r   rA   rB   r   r   r   )r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)SymDifferencerc   N)r   rA   rB   r^   r   r   r   r   r     s   r   c                   s4   e  Z d  Z   f d d   Z e d d    Z   S)r8   c                s]   | |  j  | d t j  g } d | k r@ t d |  | d <n  t t |   j | |   d  S)Nr   r   )r@   r   re   r   r   r8   r   )r   rK   r   r   r   )r   r   r   r     s
    zTransform.__init__c             C   s   |  j  |  j d j S)Nr3   )r   r    r?   )r   r   r   r   r     s    zTransform.srid)r   rA   rB   r   rC   r   r   r   )r   r   r8     s   	r8   c                   s"   e  Z d  Z   f d d   Z   S)	Translatec                sG   t  |  j  d k  r. |  j j t d   n  t t |   j | |  S)Nr   r   )r   r   rd   r   r   r   rO   )r   r0   r1   )r   r   r   rO     s    zTranslate.as_sqlite)r   rA   rB   rO   r   r   )r   r   r     s   r   c               @   s   e  Z d  Z d Z d S)Unionrc   N)r   rA   rB   r^   r   r   r   r   r     s   r   N)>decimalr   Z#django.contrib.gis.db.models.fieldsr   r   Z django.contrib.gis.db.models.sqlr   Z#django.contrib.gis.geometry.backendr   Zdjango.contrib.gis.measurer   r[   r   rv   Zdjango.core.exceptionsr	   Zdjango.db.modelsr
   r   r   r   Zdjango.db.models.expressionsr   r   Zdjango.utilsr   re   rN   r   r   r7   rI   objectrL   rQ   r_   rg   rl   rm   ro   rq   rr   rs   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   r   r   r   r   r   r   <module>   sV   "9		!
-
%