B
    ¥0H[ˆ?  ã               @   sú  d dl mZ d dlmZ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mZmZmZ d dlmZmZ d dlmZ d d	lmZ eeefZG d
d„ dƒZG dd„ deeƒZG dd„ deƒZG dd„ dƒZG dd„ dƒ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 eƒZ)G d&d'„ d'ƒ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 d0d1„ d1e eƒZ/ej0G d2d3„ d3e eeƒƒZ1G d4d5„ d5e*e eƒZ2G d6d7„ d7eƒZ3G d8d9„ d9eƒZ4G d:d;„ d;eƒZ5G d<d=„ d=eƒZ6G d>d?„ d?eƒZ7G d@dA„ dAe*e eƒZ8G dBdC„ dCe eƒZ9G dDdE„ dEeƒZ:G dFdG„ dGeeƒZ;G dHdI„ dIeeƒZ<G dJdK„ dKe eƒZ=G dLdM„ dMeƒZG dNdO„ dOe;ƒZ>G dPdQ„ dQe eƒZ?dRS )Sé    )ÚDecimal)ÚBaseSpatialFieldÚGeometryField)Ú	AreaFieldÚDistanceField)ÚGEOSGeometry)Ú
FieldError)ÚBooleanFieldÚ
FloatFieldÚIntegerFieldÚ	TextFieldÚ	Transform)ÚFuncÚValue)ÚCast)Úcached_propertyc                   s`   e Zd ZdZdZ‡ fdd„Zedd„ ƒZedd„ ƒZ	d‡ fd	d
„	Z
‡ fdd„Zddd„Z‡  ZS )ÚGeoFuncMixinN)r   c          	      sÀ   t ƒ j||Ž x¬| jD ]¢}| j| }t|tƒs0qy
|j}W n tk
rR   d }Y nX |j}t|t	ƒrr|rˆt|t
ƒsˆtd| j|d f ƒ‚|jsš|sštdƒ‚|st|t
|jd�d�| j|< qW d S )Nz9%s function requires a geometric argument in position %d.é   z$SRID is required for all geometries.)Úsrid)Úoutput_field)ÚsuperÚ__init__Úgeom_param_posÚsource_expressionsÚ
isinstancer   r   r   Úvaluer   r   Ú	TypeErrorÚnamer   Ú
ValueError)ÚselfÚexpressionsÚextraÚposÚexprr   Zgeom)Ú	__class__© újC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\contrib\gis\db\models\functions.pyr      s     




zGeoFuncMixin.__init__c             C   s   | j jS )N)r$   Ú__name__)r   r%   r%   r&   r   )   s    zGeoFuncMixin.namec             C   s   | j | jd  jS )Nr   )r   r   Úfield)r   r%   r%   r&   Ú	geo_field-   s    zGeoFuncMixin.geo_fieldc                s2   | j s|s|j | j¡}tƒ j||fd|i|—ŽS )NÚfunction)r*   ÚopsÚspatial_function_namer   r   Úas_sql)r   ÚcompilerÚ
connectionr*   Úextra_context)r$   r%   r&   r-   1   s    
zGeoFuncMixin.as_sqlc       
         s¬   t ƒ j||Ž}| ¡ }x>| jD ]4}|| }t|tƒstd| j|d t|ƒj	f ƒ‚qW |j
j}xH| jdd … D ]6}|j| }|jj}	|	|krnt||ƒj||Ž|j|< qnW |S )Nz<%s function requires a GeometryField in position %s, got %s.r   )r   Úresolve_expressionÚget_source_fieldsr   r   r   r   r   Útyper'   r)   r   r   r   r   )
r   ÚargsÚkwargsÚresZsource_fieldsr"   r(   Z	base_sridr#   Z	expr_srid)r$   r%   r&   r1   6   s    

zGeoFuncMixin.resolve_expressionÚ c             C   s,   t |dƒs(|r(t||ƒs(td||f ƒ‚|S )Nr1   z2The %s parameter has the wrong type: should be %s.)Úhasattrr   r   )r   r   Ú
param_nameZcheck_typesr%   r%   r&   Ú_handle_paramM   s    
zGeoFuncMixin._handle_param)N)r7   N)r'   Ú
__module__Ú__qualname__r*   r   r   Úpropertyr   r   r)   r-   r1   r:   Ú__classcell__r%   r%   )r$   r&   r      s   r   c               @   s   e Zd ZdS )ÚGeoFuncN)r'   r;   r<   r%   r%   r%   r&   r?   W   s   r?   c               @   s   e Zd Zedd„ ƒZdS )ÚGeomOutputGeoFuncc             C   s   t | jjd�S )N)r   )r   r)   r   )r   r%   r%   r&   r   \   s    zGeomOutputGeoFunc.output_fieldN)r'   r;   r<   r   r   r%   r%   r%   r&   r@   [   s   r@   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                sB   x2|   ¡ D ]&}t|dƒr
t|jtƒr
t|jƒ|_q
W tƒ  ||¡S )Nr   )Úget_source_expressionsr8   r   r   r   Úfloatr   r-   )r   r.   r/   r#   )r$   r%   r&   Ú	as_sqlitef   s    z#SQLiteDecimalToFloatMixin.as_sqlite)r'   r;   r<   Ú__doc__rD   r>   r%   r%   )r$   r&   rA   a   s   rA   c               @   s   e Zd ZdZdd„ ZdS )ÚOracleToleranceMixingš™™™™™©?c             C   s$   | j  d| j¡}| j||d| d�S )NÚ	tolerancez#%%(function)s(%%(expressions)s, %s))Útemplate)r!   ÚgetrG   r-   )r   r.   r/   Ztolr%   r%   r&   Ú	as_oraclep   s    zOracleToleranceMixin.as_oracleN)r'   r;   r<   rG   rJ   r%   r%   r%   r&   rF   m   s   rF   c                   s4   e Zd ZdZedd„ ƒZ‡ fdd„Zdd„ Z‡  ZS )ÚArear   c             C   s
   t | jƒS )N)r   r)   )r   r%   r%   r&   r   x   s    zArea.output_fieldc                s.   |j js| j |¡rtdƒ‚tƒ j||f|ŽS )Nz2Area on geodetic coordinate systems not supported.)ÚfeaturesZsupports_area_geodeticr)   ÚgeodeticÚNotImplementedErrorr   r-   )r   r.   r/   r0   )r$   r%   r&   r-   |   s    zArea.as_sqlc             K   s,   | j  |¡rd|d< d|d< | j||f|ŽS )Nz+%(function)s(%(expressions)s, %(spheroid)d)rH   TÚspheroid)r)   rM   r-   )r   r.   r/   r0   r%   r%   r&   rD   �   s    zArea.as_sqlite)	r'   r;   r<   Úarityr   r   r-   rD   r>   r%   r%   )r$   r&   rK   u   s   rK   c               @   s   e Zd Zeƒ ZdZdZdS )ÚAzimuthé   )r   r   N)r'   r;   r<   r
   r   rP   r   r%   r%   r%   r&   rQ   ˆ   s   rQ   c                   s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )Ú	AsGeoJSONFé   c                sf   |g}|d k	r"|  |  |dt¡¡ d}|r4|r4d}n|r>d}n|rFd}|rT|  |¡ tƒ j||Ž d S )NÚ	precisionr   é   r   rR   )Úappendr:   Úintr   r   )r   Ú
expressionZbboxZcrsrU   r!   r    Úoptions)r$   r%   r&   r   ‘   s    
zAsGeoJSON.__init__)FFrT   )r'   r;   r<   r   r   r   r>   r%   r%   )r$   r&   rS   Ž   s   rS   c                   s4   e Zd ZdZeƒ Zd‡ fdd„	Z‡ fdd„Z‡  ZS )	ÚAsGML)r   rR   rT   c                s6   ||g}|d k	r$|  |  |dt¡¡ tƒ j||Ž d S )NrU   )rW   r:   rX   r   r   )r   rY   ÚversionrU   r!   r    )r$   r%   r&   r   ¥   s    zAsGML.__init__c                sT   |   ¡ }|d }|  ¡ }| |d g¡ |jdkr6dnd|d< tt|ƒj||f|ŽS )Nr   r   rV   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr*   )rB   ÚcopyÚset_source_expressionsr   r   r[   r-   )r   r.   r/   r0   r   r\   Úclone)r$   r%   r&   rJ   «   s    zAsGML.as_oracle)rR   rT   )	r'   r;   r<   r   r   r   r   rJ   r>   r%   r%   )r$   r&   r[   ¡   s   r[   c               @   s   e Zd Zdd„ ZdS )ÚAsKMLc             C   s*   |   ¡ }| |  ¡ dd … ¡ | ||¡S )Nr   )r]   r^   rB   r-   )r   r.   r/   r_   r%   r%   r&   rD   µ   s    zAsKML.as_sqliteN)r'   r;   r<   rD   r%   r%   r%   r&   r`   ´   s   r`   c                   s$   e Zd Zeƒ Zd‡ fdd„	Z‡  ZS )ÚAsSVGFrT   c                s<   t |dƒr|nt|ƒ}|||  |dt¡g}tƒ j||Ž d S )Nr1   rU   )r8   rX   r:   r   r   )r   rY   ZrelativerU   r!   r    )r$   r%   r&   r   ¿   s
    zAsSVG.__init__)FrT   )r'   r;   r<   r   r   r   r>   r%   r%   )r$   r&   ra   ¼   s   ra   c                   s*   e Zd Zd‡ fdd„	Z‡ fdd„Z‡  ZS )ÚBoundingCircleé0   c                s   t ƒ j||f|Ž d S )N)r   r   )r   rY   Znum_segr!   )r$   r%   r&   r   Ê   s    zBoundingCircle.__init__c                s.   |   ¡ }| |  ¡ d g¡ tt|ƒ ||¡S )Nr   )r]   r^   rB   r   rb   rJ   )r   r.   r/   r_   )r$   r%   r&   rJ   Í   s    zBoundingCircle.as_oracle)rc   )r'   r;   r<   r   rJ   r>   r%   r%   )r$   r&   rb   É   s   rb   c               @   s   e Zd ZdZdS )ÚCentroidr   N)r'   r;   r<   rP   r%   r%   r%   r&   rd   Ó   s   rd   c               @   s   e Zd ZdZdZdS )Ú
DifferencerR   )r   r   N)r'   r;   r<   rP   r   r%   r%   r%   r&   re   ×   s   re   c               @   s    e Zd Zedd„ ƒZdd„ ZdS )ÚDistanceResultMixinc             C   s
   t | jƒS )N)r   r)   )r   r%   r%   r&   r   Ý   s    z DistanceResultMixin.output_fieldc             C   s   | j jo| j jdkS )Niæ  )r)   Ú	geographyr   )r   r%   r%   r&   Úsource_is_geographyá   s    z'DistanceResultMixin.source_is_geographyN)r'   r;   r<   r   r   rh   r%   r%   r%   r&   rf   Ü   s   rf   c                   s>   e Zd ZdZdZd	‡ fdd„	Z‡ fdd„Z‡ fdd„Z‡  ZS )
ÚDistance)r   r   Nc                s2   ||g}|d k	r |   |dt¡| _tƒ j||Ž d S )NrO   )r:   ÚboolrO   r   r   )r   Úexpr1Úexpr2rO   r!   r    )r$   r%   r&   r   é   s    zDistance.__init__c                s¸   |   ¡ }d }|jd }|  ¡ }|jj|krZt|tƒr>||j_nt|t|jj	|d�ƒ|jd< |s¢| j
 |¡r¢| jr–|j d¡}|j t| j
 |¡ƒ¡ n|j d¡}tt|ƒj|||d�S )Nr   )r   rg   ZDistanceSpheroidZDistanceSphere)r*   )r]   r   rh   r   rg   r   r   r   r   r   r)   rM   rO   r+   r,   rW   r   ri   r-   )r   r.   r/   r_   r*   rl   rg   )r$   r%   r&   Úas_postgresqlï   s     


zDistance.as_postgresqlc                s8   | j  |¡r&d|d< tt| jƒƒ|d< tƒ j||f|ŽS )Nz8COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)rH   rO   )r)   rM   rX   rj   rO   r   r-   )r   r.   r/   r0   )r$   r%   r&   rD     s    zDistance.as_sqlite)N)	r'   r;   r<   r   rO   r   rm   rD   r>   r%   r%   )r$   r&   ri   å   s
   ri   c               @   s   e Zd ZdZdS )ÚEnveloper   N)r'   r;   r<   rP   r%   r%   r%   r&   rn     s   rn   c               @   s   e Zd ZdZdS )ÚForceRHRr   N)r'   r;   r<   rP   r%   r%   r%   r&   ro     s   ro   c                   s,   e Zd Zeƒ Zd‡ fdd„	Zdd„ Z‡  ZS )ÚGeoHashNc                s4   |g}|d k	r"|  |  |dt¡¡ tƒ j||Ž d S )NrU   )rW   r:   rX   r   r   )r   rY   rU   r!   r    )r$   r%   r&   r     s    zGeoHash.__init__c             C   s2   |   ¡ }t|jƒdk r&|j tdƒ¡ | ||¡S )NrR   éd   )r]   Úlenr   rW   r   r-   )r   r.   r/   r_   r%   r%   r&   Úas_mysql!  s    zGeoHash.as_mysql)N)r'   r;   r<   r   r   r   rs   r>   r%   r%   )r$   r&   rp     s   rp   c               @   s   e Zd ZdZdZdS )ÚIntersectionrR   )r   r   N)r'   r;   r<   rP   r   r%   r%   r%   r&   rt   )  s   rt   c                   s&   e Zd ZdZeƒ Z‡ fdd„Z‡  ZS )ÚIsValidZisvalidc                s"   t ƒ j||f|Ž\}}d| |fS )Nz%CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END)r   rJ   )r   r.   r/   r0   ZsqlÚparams)r$   r%   r&   rJ   3  s    zIsValid.as_oracle)r'   r;   r<   Úlookup_namer	   r   rJ   r>   r%   r%   )r$   r&   ru   .  s   ru   c                   sB   e Zd Zd
‡ fdd„	Z‡ fdd„Z‡ fdd„Z‡ fdd	„Z‡  ZS )ÚLengthTc                s   || _ tƒ j|f|Ž d S )N)rO   r   r   )r   rk   rO   r!   )r$   r%   r&   r   9  s    zLength.__init__c                s.   | j  |¡r|jjstdƒ‚tƒ j||f|ŽS )Nz6This backend doesn't support Length on geodetic fields)r)   rM   rL   Zsupports_length_geodeticrN   r   r-   )r   r.   r/   r0   )r$   r%   r&   r-   =  s    zLength.as_sqlc                s–   |   ¡ }d }|  ¡ r(|j t| jƒ¡ nX| j |¡rZ|j 	d¡}|j t| j |¡ƒ¡ n&t
dd„ |  ¡ D ƒƒ}|dkr€|jj}tt|ƒj|||d�S )NZLengthSpheroidc             s   s   | ]}|r|j V  qd S )N)Údim)Ú.0Úfr%   r%   r&   ú	<genexpr>L  s    z'Length.as_postgresql.<locals>.<genexpr>rR   )r*   )r]   rh   r   rW   r   rO   r)   rM   r+   r,   Úminr2   Zlength3dr   rx   r-   )r   r.   r/   r_   r*   ry   )r$   r%   r&   rm   B  s    zLength.as_postgresqlc                s0   d }| j  |¡r| jrdnd}tƒ j|||d�S )NZGeodesicLengthZGreatCircleLength)r*   )r)   rM   rO   r   r-   )r   r.   r/   r*   )r$   r%   r&   rD   Q  s    zLength.as_sqlite)T)r'   r;   r<   r   r-   rm   rD   r>   r%   r%   )r$   r&   rx   8  s   rx   c               @   s   e Zd Zeƒ ZdZdZdS )ÚLineLocatePointrR   )r   r   N)r'   r;   r<   r
   r   rP   r   r%   r%   r%   r&   r~   X  s   r~   c               @   s   e Zd ZdS )Ú	MakeValidN)r'   r;   r<   r%   r%   r%   r&   r   ^  s   r   c               @   s   e Zd Zeƒ ZdZdS )ÚMemSizer   N)r'   r;   r<   r   r   rP   r%   r%   r%   r&   r€   b  s   r€   c               @   s   e Zd Zeƒ ZdZdS )ÚNumGeometriesr   N)r'   r;   r<   r   r   rP   r%   r%   r%   r&   r�   g  s   r�   c               @   s   e Zd Zeƒ ZdZdS )Ú	NumPointsr   N)r'   r;   r<   r   r   rP   r%   r%   r%   r&   r‚   l  s   r‚   c                   s,   e Zd ZdZ‡ fdd„Z‡ fdd„Z‡  ZS )Ú	Perimeterr   c                sX   d }| j  |¡r |  ¡ s tdƒ‚tdd„ |  ¡ D ƒƒ}|dkrF|jj}tƒ j	|||d�S )Nz<ST_Perimeter cannot use a non-projected non-geography field.c             s   s   | ]}|j V  qd S )N)ry   )rz   r{   r%   r%   r&   r|   x  s    z*Perimeter.as_postgresql.<locals>.<genexpr>rR   )r*   )
r)   rM   rh   rN   r}   r2   r+   Zperimeter3dr   r-   )r   r.   r/   r*   ry   )r$   r%   r&   rm   t  s    zPerimeter.as_postgresqlc                s"   | j  |¡rtdƒ‚tƒ  ||¡S )Nz+Perimeter cannot use a non-projected field.)r)   rM   rN   r   r-   )r   r.   r/   )r$   r%   r&   rD   }  s    zPerimeter.as_sqlite)r'   r;   r<   rP   rm   rD   r>   r%   r%   )r$   r&   rƒ   q  s   	rƒ   c               @   s   e Zd ZdZdS )ÚPointOnSurfacer   N)r'   r;   r<   rP   r%   r%   r%   r&   r„   ƒ  s   r„   c               @   s   e Zd ZdZdS )ÚReverser   N)r'   r;   r<   rP   r%   r%   r%   r&   r…   ‡  s   r…   c                   s   e Zd Zd‡ fdd„	Z‡  ZS )ÚScaleç        c                sL   ||   |dt¡|   |dt¡g}|dkr:| |   |dt¡¡ tƒ j||Ž d S )NÚxÚyg        Úz)r:   ÚNUMERIC_TYPESrW   r   r   )r   rY   rˆ   r‰   rŠ   r!   r    )r$   r%   r&   r   Œ  s    zScale.__init__)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 )Ú
SnapToGridc                s”   t |ƒ}|g}|dkr0| ‡ fdd„|D ƒ¡ nR|dkrz| ‡ fdd„|dd … D ƒ¡ | ‡ fdd„|dd… D ƒ¡ ntd	ƒ‚tƒ j||Ž d S )
N)r   rR   c                s   g | ]}ˆ   |d t¡‘qS )r7   )r:   r‹   )rz   Úarg)r   r%   r&   ú
<listcomp>�  s    z'SnapToGrid.__init__.<locals>.<listcomp>é   c                s   g | ]}ˆ   |d t¡‘qS )r7   )r:   r‹   )rz   r�   )r   r%   r&   rŽ   ¢  s    rR   c                s   g | ]}ˆ   |d t¡‘qS )r7   )r:   r‹   )rz   r�   )r   r%   r&   rŽ   ¥  s    r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)rr   Úextendr   r   r   )r   rY   r4   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ZdS )ÚSymDifferencerR   )r   r   N)r'   r;   r<   rP   r   r%   r%   r%   r&   r’   ¬  s   r’   c                   s   e Zd Z‡ fdd„Z‡  ZS )r   c                s:   ||   |dt¡g}d|kr(t|d�|d< tƒ j||Ž d S )Nr   r   )r   )r:   rX   r   r   r   )r   rY   r   r!   r    )r$   r%   r&   r   ²  s
    zTransform.__init__)r'   r;   r<   r   r>   r%   r%   )r$   r&   r   ±  s   r   c                   s   e Zd Z‡ fdd„Z‡  ZS )Ú	Translatec                s8   |   ¡ }t| jƒdk r&|j tdƒ¡ tt|ƒ ||¡S )Nr�   r   )r]   rr   r   rW   r   r   r“   rD   )r   r.   r/   r_   )r$   r%   r&   rD   ½  s    zTranslate.as_sqlite)r'   r;   r<   rD   r>   r%   r%   )r$   r&   r“   ¼  s   r“   c               @   s   e Zd ZdZdZdS )ÚUnionrR   )r   r   N)r'   r;   r<   rP   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   r   Zdjango.contrib.gis.geosr   Zdjango.core.exceptionsr   Zdjango.db.modelsr	   r
   r   r   r   Zdjango.db.models.expressionsr   r   Zdjango.db.models.functionsr   Zdjango.utils.functionalr   rX   rC   r‹   r   r?   r@   rA   rF   rK   rQ   rS   r[   r`   ra   rb   rd   re   rf   ri   rn   ro   rp   rt   Zregister_lookupru   rx   r~   r   r€   r�   r‚   rƒ   r„   r…   r†   rŒ   r’   r“   r”   r%   r%   r%   r&   Ú<module>   s\   
F
	+	 	