3
(h@                 @   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G d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deeZG dd deZ G dd deZ!G dd de!Z"G dd deZ#G dd deZ$G dd  d eeZ%G d!d" d"eeZ&G d#d$ d$eZ'G d%d& d&e'eeZ	G d'd( d(eZ(G d)d* d*eZ)G d+d, d,eZ*G d-d. d.eeZ+G d/d0 d0eZ,G d1d2 d2e'eeZ-G d3d4 d4eZ.G d5d6 d6eZ/G d7d8 d8eZ0G d9d: d:eZ1G d;d< d<e'eeZ2G d=d> d>eeZ3G d?d@ d@eZ4G dAdB dBeeZ5G dCdD dDeeZ6G dEdF dFeeZ7G dGdH dHeZ8G dIdJ dJe5Z9G dKdL dLeeZ:dMS )N    )Decimal)GeometryField)	AreaField)AreaDistance)
FieldError)BooleanField
FloatFieldIntegerField	TextField)FuncValue)sixc                   sb   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Z  ZS )GeoFuncNr   c                s0   d|kr| j r| j  |d< tt| j|| d S )Noutput_field)output_field_classsuperr   __init__)selfexpressionsextra)	__class__ J/tmp/pip-install-q3hcpn_q/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   sB   | j | j }t|dr|jS y|jjS  ttfk
r<   d S X d S )Nsrid)source_expressionsgeom_param_poshasattrr   fieldAttributeErrorr   )r   exprr   r   r   r      s    
zGeoFunc.sridc                s,   | j d kr|jj| j| _ 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                sx   t t| j||}|j}|s$tdxNt|jdd  ddD ]4\}}t|tr<|j|kr<t	||j|||j|< q<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   s2   t |ds.|r.t|| r.td|t|f |S )Nr+   z2The %s parameter has the wrong type: should be %s.)r   r.   r,   str)r   value
param_nameZcheck_typesr   r   r   _handle_param9   s    
zGeoFunc._handle_param)r5   N)r   
__module____qualname__r#   r   r   r   propertyr   r   r&   r+   r9   __classcell__r   r   )r   r   r      s   
r   c                   s<   e Zd ZdZedd Zdd Zdd Z fdd	Z  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| j d| _n|jj| j| _tt| j||S )N)	geography)rA   r$   r?   r7   r   r/   r&   )r   r'   r(   )r   r   r   as_postgresqlP   s    zGeomValue.as_postgresql)
r   r:   r;   rA   r<   r   r&   r@   rB   r=   r   r   )r   r   r/   C   s
   r/   c                   s   e Zd Z fddZ  ZS )GeoFuncWithGeoParamc                s>   t |d s|j rtdtt| j|t|f|| d S )Nr   z8Please provide a geometry attribute with a defined SRID.)r   r   
ValueErrorr   rC   r   r/   )r   
expressionZgeomr   r   )r   r   r   r   Y   s    zGeoFuncWithGeoParam.__init__)r   r:   r;   r   r=   r   r   )r   r   rC   X   s   rC   c                   s    e Zd ZdZ fddZ  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   x2| j  D ]&}t|dr
t|jtr
t|j|_q
W tt| j||S )Nr7   )	Zget_source_expressionsr   r.   r7   r   floatr   rF   r&   )r   r'   r(   r"   )r   r   r   	as_sqlited   s    z#SQLiteDecimalToFloatMixin.as_sqlite)r   r:   r;   __doc__rH   r=   r   r   )r   r   rF   _   s   rF   c                   s    e Zd ZdZ fddZ  ZS )OracleToleranceMixing?c                s,   | j jd| j}d| | _tt| j||S )N	tolerancez#%%(function)s(%%(expressions)s, %s))r   getrK   templater   rJ   r&   )r   r'   r(   Ztol)r   r   r   	as_oraclen   s    
zOracleToleranceMixin.as_oracle)r   r:   r;   rK   rN   r=   r   r   )r   r   rJ   k   s   rJ   c                   s0   e Zd ZeZdZ fddZ fddZ  ZS )r   r)   c                sj   |j jrd| j_nF| j }t|rX|d }|j|r<td|j|}|rXt	j
|| j_tt| j||S )Nsq_mr   z2Area on geodetic coordinate systems not supported.)r$   rA   r   Zarea_attget_source_fieldslengeodeticNotImplementedError
units_nameAreaMeasureunit_attnamer   r   r&   )r   r'   r(   Zsource_fieldsZsource_fieldrT   )r   r   r   r&   x   s    


zArea.as_sqlc                s   t d| _tt| j||S )NrO   )r   r   r   r   rN   )r   r'   r(   )r   r   r   rN      s    
zArea.as_oracle)	r   r:   r;   r   r   arityr&   rN   r=   r   r   )r   r   r   t   s   r   c                   s"   e Zd ZeZd fdd	Z  ZS )	AsGeoJSONF   c                sl   |g}|d k	r$|j | j|dtj d}|r6|r6d}n|r@d}n|rHd}|rV|j | tt| j|| d S )N	precisionr      r)      )appendr9   r   integer_typesr   rX   r   )r   rE   ZbboxZcrsrZ   r   r   options)r   r   r   r      s    
zAsGeoJSON.__init__)FFrY   )r   r:   r;   r   r   r   r=   r   r   )r   r   rX      s   rX   c                   s&   e Zd ZdZeZd fdd	Z  ZS )AsGMLr)   r\   rY   c                s<   ||g}|d k	r&|j | j|dtj tt| j|| d S )NrZ   )r]   r9   r   r^   r   r`   r   )r   rE   versionrZ   r   r   )r   r   r   r      s    zAsGML.__init__)r\   rY   )r   r:   r;   r   r   r   r   r=   r   r   )r   r   r`      s   r`   c                   s   e Zd Z fddZ  ZS )AsKMLc                s   | j jd tt| j||S )Nr   )r   popr   rb   r&   )r   r'   r(   )r   r   r   rH      s    zAsKML.as_sqlite)r   r:   r;   rH   r=   r   r   )r   r   rb      s   rb   c                   s"   e Zd ZeZd fdd	Z  ZS )AsSVGFrY   c                sB   t |dr|nt|}||| j|dtjg}tt| j|| d S )Nr+   rZ   )r   intr9   r   r^   r   rd   r   )r   rE   ZrelativerZ   r   r   )r   r   r   r      s
    zAsSVG.__init__)FrY   )r   r:   r;   r   r   r   r=   r   r   )r   r   rd      s   rd   c                   s   e Zd Zd fdd	Z  ZS )BoundingCircle0   c                s   t t| j||g| d S )N)r   rf   r   )r   rE   Znum_segr   )r   r   r   r      s    zBoundingCircle.__init__)rg   )r   r:   r;   r   r=   r   r   )r   r   rf      s   rf   c               @   s   e Zd ZdZdS )Centroidr)   N)r   r:   r;   rW   r   r   r   r   rh      s   rh   c               @   s   e Zd ZdZdS )
Differencer\   N)r   r:   r;   rW   r   r   r   r   ri      s   ri   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  )rP   rA   r   )r   r   r   r   source_is_geography   s    z'DistanceResultMixin.source_is_geographyc             C   s\   |d krd S t | jd}|j|r(d}n|j|}|rBtj|}nd }|rXtf ||iS |S )N)r   m)r   r   rR   rT   DistanceMeasurerV   )r   r7   rE   r(   context	geo_fieldZdist_attZunitsr   r   r   convert_value   s    

z!DistanceResultMixin.convert_valueN)r   r:   r;   rk   rp   r   r   r   r   rj      s   rj   c                   s>   e Zd ZeZdZd fdd	Z fddZ fddZ  Z	S )	r   Nc                s@   ||g}|d k	r*|| _ || j|dtf7 }tt| j|| d S )Nspheroid)rq   r9   boolr   r   r   )r   expr1Zexpr2rq   r   r   )r   r   r   r      s
    zDistance.__init__c                s   t | jd}| j rVxnt| j| jd d  | jd dD ]\}}t|tr8d|_q8W n.|j	|r| j
r~d| _t|j| jd< nd| _tt| j||S )N)r   r)   )r*   TZST_Distance_Spheroidr\   ZST_Distance_Sphere)r   r   rk   r-   r   r   r.   r/   rA   rR   rq   r#   r   	_spheroidr   r   r&   )r   r'   r(   ro   r4   r"   )r   r   r   rB      s    (

zDistance.as_postgresqlc                s$   | j r| jjd tt| j||S )Nr\   )rq   r   rc   r   r   rN   )r   r'   r(   )r   r   r   rN      s    zDistance.as_oracle)N)
r   r:   r;   r	   r   rq   r   rB   rN   r=   r   r   )r   r   r      s
   r   c               @   s   e Zd ZdZdS )Enveloper)   N)r   r:   r;   rW   r   r   r   r   ru     s   ru   c               @   s   e Zd ZdZdS )ForceRHRr)   N)r   r:   r;   rW   r   r   r   r   rv     s   rv   c                   s"   e Zd ZeZd fdd	Z  ZS )GeoHashNc                s:   |g}|d k	r$|j | j|dtj tt| j|| d S )NrZ   )r]   r9   r   r^   r   rw   r   )r   rE   rZ   r   r   )r   r   r   r     s    zGeoHash.__init__)N)r   r:   r;   r   r   r   r=   r   r   )r   r   rw     s   rw   c               @   s   e Zd ZdZdS )Intersectionr\   N)r   r:   r;   rW   r   r   r   r   rx     s   rx   c               @   s   e Zd ZeZdS )IsValidN)r   r:   r;   r   r   r   r   r   r   ry     s   ry   c                   sF   e Zd ZeZd
 fdd	Z fddZ fddZ fdd	Z  Z	S )LengthTc                s   || _ tt| j|f| d S )N)rq   r   rz   r   )r   rs   rq   r   )r   r   r   r   !  s    zLength.__init__c                s:   t | jd}|j|r(|jj r(tdtt| j||S )N)r   z6This backend doesn't support Length on geodetic fields)	r   r   rR   featuresZsupports_length_geodeticrS   r   rz   r&   )r   r'   r(   ro   )r   r   r   r&   %  s    zLength.as_sqlc                s   t | jd}| j r(| jjt| j nL|j|rLd| _| jjt|j	 n(t
dd | j D }|dkrt|jj| _tt| j||S )N)r   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>r\   )r   r   rk   r   r]   r   rq   rR   r#   rt   minrP   r$   Zlength3dr   rz   r&   )r   r'   r(   ro   r|   )r   r   r   rB   +  s    

zLength.as_postgresqlc                s<   t | jd}|j|r*| jr$d| _nd| _tt| j||S )N)r   ZGeodesicLengthZGreatCircleLength)r   r   rR   rq   r#   r   rz   r&   )r   r'   r(   ro   )r   r   r   rH   9  s    
zLength.as_sqlite)T)
r   r:   r;   r	   r   r   r&   rB   rH   r=   r   r   )r   r   rz     s
   rz   c               @   s   e Zd ZdS )	MakeValidN)r   r:   r;   r   r   r   r   r   C  s   r   c               @   s   e Zd ZeZdZdS )MemSizer)   N)r   r:   r;   r
   r   rW   r   r   r   r   r   G  s   r   c               @   s   e Zd ZeZdZdS )NumGeometriesr)   N)r   r:   r;   r
   r   rW   r   r   r   r   r   L  s   r   c                   s$   e Zd ZeZdZ fddZ  ZS )	NumPointsr)   c                s.   | j | j jjdkrtd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   rH   U  s    zNumPoints.as_sqlite)r   r:   r;   r
   r   rW   rH   r=   r   r   )r   r   r   Q  s   r   c                   s0   e Zd ZeZdZ fddZ fddZ  ZS )	Perimeterr)   c                sb   t | jd}|j|r(| j  r(tdtdd | j D }|dkrP|jj| _	t
t| j||S )N)r   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   c  s    z*Perimeter.as_postgresql.<locals>.<genexpr>r\   )r   r   rR   rk   rS   r   rP   r$   Zperimeter3dr#   r   r   r&   )r   r'   r(   ro   r|   )r   r   r   rB   _  s    
zPerimeter.as_postgresqlc                s0   t | jd}|j|rtdtt| j||S )N)r   z+Perimeter cannot use a non-projected field.)r   r   rR   rS   r   r   r&   )r   r'   r(   ro   )r   r   r   rH   h  s    
zPerimeter.as_sqlite)	r   r:   r;   r	   r   rW   rB   rH   r=   r   r   )r   r   r   [  s   	r   c               @   s   e Zd ZdZdS )PointOnSurfacer)   N)r   r:   r;   rW   r   r   r   r   r   o  s   r   c               @   s   e Zd ZdZdS )Reverser)   N)r   r:   r;   rW   r   r   r   r   r   s  s   r   c                   s   e Zd Zd fdd	Z  ZS )Scale        c                sP   || j |dt| j |dtg}|dkr:|j| j |dt tt| j|| d S )Nxyg        z)r9   NUMERIC_TYPESr]   r   r   r   )r   rE   r   r   r   r   r   )r   r   r   r   x  s    zScale.__init__)r   )r   r:   r;   r   r=   r   r   )r   r   r   w  s   r   c                   s   e Zd Z fddZ  ZS )
SnapToGridc                s   t |}|g}|d
kr0|j fdd|D  nR|dkrz|j fdd|dd  D  |j fdd|dd D  ntd	tt j|| d S )Nr)   r\   c                s   g | ]} j |d tqS )r5   )r9   r   )r}   arg)r   r   r   
<listcomp>  s    z'SnapToGrid.__init__.<locals>.<listcomp>   c                s   g | ]} j |d tqS )r5   )r9   r   )r}   r   )r   r   r   r     s    c                s   g | ]} j |d tqS )r5   )r9   r   )r}   r   )r   r   r   r     s    r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r)   r\   )rQ   extendrD   r   r   r   )r   rE   r1   r   nargsr   )r   )r   r   r     s    zSnapToGrid.__init__)r   r:   r;   r   r=   r   r   )r   r   r     s   r   c               @   s   e Zd ZdZdS )SymDifferencer\   N)r   r:   r;   rW   r   r   r   r   r     s   r   c                   s4   e Zd Z fddZedd Z fddZ  ZS )r0   c                s*   || j |dtjg}tt| j|| d S )Nr   )r9   r   r^   r   r0   r   )r   rE   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                s4   t t| j||||}|jj r0|j r0| j|_|S )N)r   r0   rp   r$   Zpostgisr   )r   r7   rE   r(   rn   )r   r   r   rp     s    zTransform.convert_value)r   r:   r;   r   r<   r   rp   r=   r   r   )r   r   r0     s   r0   c                   s   e Zd Z fddZ  ZS )	Translatec                sf   |j j| j}|dkr6t| jdk r6| jjtd n|dkrTt| jdkrTtdtt	| j
||S )NZST_Translater   r   ZShiftCoordsr[   z-This version of Spatialite doesn't support 3D)r$   r%   r   rQ   r   r]   r   rD   r   r   rH   )r   r'   r(   	func_name)r   r   r   rH     s    zTranslate.as_sqlite)r   r:   r;   rH   r=   r   r   )r   r   r     s   r   c               @   s   e Zd ZdZdS )Unionr\   N)r   r:   r;   rW   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   rU   r   rm   Zdjango.core.exceptionsr   Zdjango.db.modelsr   r	   r
   r   Zdjango.db.models.expressionsr   r   Zdjango.utilsr   r^   rG   r   r   r/   rC   objectrF   rJ   rX   r`   rb   rd   rf   rh   ri   rj   ru   rv   rw   rx   ry   rz   r   r   r   r   r   r   r   r   r   r   r0   r   r   r   r   r   r   <module>   sT   3	#
%
