o
    ˷eSG                     @   s2  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 d dlmZmZmZmZmZmZ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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 Z0G d0d1 d1e Z1G d2d3 d3eZ2G d4d5 d5eZ3G d6d7 d7e"e Z4ej5G d8d9 d9e"eeZ6G d:d; d;e.e"eZ7G d<d= d=eZ8G d>d? d?e Z9G d@dA dAeZ:G dBdC dCeZ;G dDdE dEeZ<G dFdG dGe.e"eZ=G dHdI dIe"e Z>G dJdK dKeZ?G dLdM dMe!e Z@G dNdO dOe!e ZAG dPdQ dQe"e ZBG dRdS dSe ZG dTdU dUe@ZCG dVdW dWe"e ZDdXS )Y    )Decimal)BaseSpatialFieldGeometryField)	AreaFieldDistanceField)GEOSGeometry)
FieldError)NotSupportedError)BinaryFieldBooleanField
FloatFieldFuncIntegerField	TextField	Transform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|i | | jD ]P}| j| }t|tsqz|j}W n ty)   d }Y nw |j}t|t	r9|rDt|t
sDtd| j|d f |jsM|sMtd|s\t|t
|jdd| j|< q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   geom	__class__ ]/var/www/ideatree/venv/lib/python3.10/site-packages/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    9   s   zGeoFuncMixin.namec                 C   s   | j | jd  jS Nr   )r   r   fieldr.   r*   r*   r+   	geo_field=   s   zGeoFuncMixin.geo_fieldc                    s:   | j d u r|d u r|j| j}t j||fd|i|S )Nfunction)r2   opsspatial_function_namer    r   as_sql)r"   compiler
connectionr2   extra_contextr(   r*   r+   r5   A   s   zGeoFuncMixin.as_sqlc           
         s   t  j|i |}| }| jD ]}|| }t|ts*td| j|d t|j	f q|j
j}| jdd  D ]}|j| }|jj}	|	|krSt||j|i ||j|< q6|S )Nz<%s function requires a GeometryField in position %s, got %s.r   )r   resolve_expressionget_source_fieldsr   r   r   r   r    typer-   r1   r   r   r   r   )
r"   argskwargsressource_fieldsr%   r0   	base_sridr&   	expr_sridr(   r*   r+   r9   F   s8   



zGeoFuncMixin.resolve_expression c                 C   s,   t |ds|rt||std||f |S )Nr9   z2The %s parameter has the wrong type: should be %s.)hasattrr   r   )r"   r   
param_namecheck_typesr*   r*   r+   _handle_paramb   s   
zGeoFuncMixin._handle_paramr,   rB   N)r-   
__module____qualname__r2   r   r   propertyr    r   r1   r5   r9   rF   __classcell__r*   r*   r(   r+   r      s    

r   c                   @      e Zd ZdS )GeoFuncNr-   rH   rI   r*   r*   r*   r+   rM   l       rM   c                   @   s   e Zd Zedd ZdS )GeomOutputGeoFuncc                 C   s   t | jjdS )Nr   )r   r1   r   r.   r*   r*   r+   r   q   s   zGeomOutputGeoFunc.output_fieldN)r-   rH   rI   r   r   r*   r*   r*   r+   rP   p   s    rP   c                   @      e Zd ZdZdd Zd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                 K   s4   |   }|dd | D  |j||fi |S )Nc                 S   s4   g | ]}t |d rt|jtrtt|jn|qS )r   )rC   r   r   r   r   float).0r&   r*   r*   r+   
<listcomp>   s    
z7SQLiteDecimalToFloatMixin.as_sqlite.<locals>.<listcomp>)copyset_source_expressionsget_source_expressionsr5   )r"   r6   r7   r8   rV   r*   r*   r+   	as_sqlite|   s   z#SQLiteDecimalToFloatMixin.as_sqliteN)r-   rH   rI   __doc__rY   r*   r*   r*   r+   rR   v   s    rR   c                   @   rQ   )OracleToleranceMixing?c                 K   sP   t | | jd| jdt}|  }|g |  | |j	||fi |S )N	tolerance)
r   rF   r$   getr\   NUMERIC_TYPESrV   rW   rX   r5   )r"   r6   r7   r8   r\   cloner*   r*   r+   	as_oracle   s   zOracleToleranceMixin.as_oracleN)r-   rH   rI   r\   r`   r*   r*   r*   r+   r[      s    r[   c                       s4   e Zd ZdZedd Z fddZdd Z  ZS )Arear   c                 C   
   t | jS r,   )r   r1   r.   r*   r*   r+   r         
zArea.output_fieldc                    s2   |j js| j|rtdt j||fi |S )Nz2Area on geodetic coordinate systems not supported.)featuressupports_area_geodeticr1   geodeticr	   r   r5   r"   r6   r7   r8   r(   r*   r+   r5      s   zArea.as_sqlc                 K   s0   | j |rd|d< d|d< | j||fi |S )Nz+%(function)s(%(expressions)s, %(spheroid)d)templateTspheroid)r1   rf   r5   rg   r*   r*   r+   rY      s   zArea.as_sqlite)	r-   rH   rI   arityr   r   r5   rY   rK   r*   r*   r(   r+   ra      s    
	ra   c                   @      e Zd Ze ZdZdZdS )Azimuth   r   r   Nr-   rH   rI   r   r   rj   r   r*   r*   r*   r+   rl          rl   c                       s0   e Zd Ze Zd fdd	Z fddZ  ZS )	AsGeoJSONF   c                    sj   |g}|d ur| | |dt d}|r|rd}n	|rd}n|r#d}|r*| | t j|i | d S )N	precisionr      r   rm   appendrF   intr   r   )r"   
expressionbboxcrsrs   r$   r#   optionsr(   r*   r+   r      s   
zAsGeoJSON.__init__c                    s<   |   }|  }||d d  tt|j||fi |S )Nr   )rX   rV   rW   r   rq   r5   )r"   r6   r7   r8   r   r_   r(   r*   r+   r`      s   zAsGeoJSON.as_oracle)FFrr   )r-   rH   rI   r   r   r   r`   rK   r*   r*   r(   r+   rq      s    rq   c                       s4   e Zd ZdZe Zd fdd	Z fddZ  ZS )	AsGML)r   rm   rr   c                    s:   ||g}|d ur| | |dt t j|i | d S Nrs   ru   )r"   rx   versionrs   r$   r#   r(   r*   r+   r      s   zAsGML.__init__c                    sX   |   }|d }|  }||d g |jdkrdnd|d< tt|j||fi |S )Nr   r   rt   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr2   )rX   rV   rW   r   r   r|   r5   )r"   r6   r7   r8   r   r~   r_   r(   r*   r+   r`      s   
zAsGML.as_oracle)rm   rr   )	r-   rH   rI   r   r   r   r   r`   rK   r*   r*   r(   r+   r|      s
    r|   c                       s$   e Zd Ze Zd fdd	Z  ZS )AsKMLrr   c                    8   |g}|d ur| | |dt t j|i | d S r}   ru   r"   rx   rs   r$   r#   r(   r*   r+   r         zAsKML.__init__)rr   r-   rH   rI   r   r   r   rK   r*   r*   r(   r+   r          r   c                       s$   e Zd Ze Zd fdd	Z  ZS )AsSVGFrr   c                    s@   t |dr|nt|}||| |dtg}t j|i | d S )Nr9   rs   )rC   rw   rF   r   r   )r"   rx   relativers   r$   r#   r(   r*   r+   r      s   zAsSVG.__init__)Frr   r   r*   r*   r(   r+   r      r   r   c                   @      e Zd Ze ZdZdS )AsWKBr   N)r-   rH   rI   r
   r   rj   r*   r*   r*   r+   r          r   c                   @   r   )AsWKTr   N)r-   rH   rI   r   r   rj   r*   r*   r*   r+   r     r   r   c                       s*   e Zd Zd fdd	Z fddZ  ZS )BoundingCircle0   c                    s   t  j||fi | d S r,   )r   r   )r"   rx   num_segr$   r(   r*   r+   r   
  s   zBoundingCircle.__init__c                    s6   |   }||  d g tt|j||fi |S r/   )rV   rW   rX   r   r   r`   r"   r6   r7   r8   r_   r(   r*   r+   r`     s   
zBoundingCircle.as_oracle)r   )r-   rH   rI   r   r`   rK   r*   r*   r(   r+   r   	  s    r   c                   @      e Zd ZdZdS )Centroidr   Nr-   rH   rI   rj   r*   r*   r*   r+   r         r   c                   @      e Zd ZdZdZdS )
Differencerm   rn   Nr-   rH   rI   rj   r   r*   r*   r*   r+   r         r   c                   @   s    e Zd Zedd Zdd ZdS )DistanceResultMixinc                 C   rb   r,   )r   r1   r.   r*   r*   r+   r     rc   z DistanceResultMixin.output_fieldc                 C   s   | j jo	| j jdkS )Ni  )r1   	geographyr   r.   r*   r*   r+   source_is_geography#  s   z'DistanceResultMixin.source_is_geographyN)r-   rH   rI   r   r   r   r*   r*   r*   r+   r     s    
r   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 )
Distancern   Nc                    s6   ||g}|d ur|  |dt| _t j|i | d S )Nri   )rF   boolri   r   r   )r"   expr1expr2ri   r$   r#   r(   r*   r+   r   +  s   zDistance.__init__c                    s   |   }d }|jd }|  }|jj|kr-t|tr||j_nt|t|jj	|d|jd< |sQ| j
|rQ| jrK|jd}|jt| j
| n|jd}tt|j||fd|i|S )Nr   )r   r   DistanceSpheroidDistanceSpherer2   )rV   r   r   r   r   r   r   r   r   r   r1   rf   ri   r3   r4   rv   r   r   r5   )r"   r6   r7   r8   r_   r2   r   r   r(   r*   r+   as_postgresql1  s2   




zDistance.as_postgresqlc                    s<   | j |rd|d< tt| j|d< t j||fi |S )Nz8COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)rh   ri   )r1   rf   rw   r   ri   r   r5   rg   r(   r*   r+   rY   P  s   zDistance.as_sqliter,   )	r-   rH   rI   r   ri   r   r   rY   rK   r*   r*   r(   r+   r   '  s    r   c                   @   r   )Enveloper   Nr   r*   r*   r*   r+   r   Z  r   r   c                   @   r   )ForcePolygonCWr   Nr   r*   r*   r*   r+   r   ^  r   r   c                       s,   e Zd Ze Zd fdd	Zdd Z  ZS )GeoHashNc                    r   r}   ru   r   r(   r*   r+   r   e  r   zGeoHash.__init__c                 K   s:   |   }t|jdk r|jtd |j||fi |S )Nrm   d   )rV   lenr   rv   r   r5   r   r*   r*   r+   as_mysqlk  s   zGeoHash.as_mysqlr,   )r-   rH   rI   r   r   r   r   rK   r*   r*   r(   r+   r   b  s    r   c                   @   s"   e Zd Ze ZdZdZdZdZdS )GeometryDistancerm   rB   z <-> rn   N)	r-   rH   rI   r   r   rj   r2   
arg_joinerr   r*   r*   r*   r+   r   s  s    r   c                   @   r   )Intersectionrm   rn   Nr   r*   r*   r*   r+   r   {  r   r   c                       s&   e Zd ZdZe Z fddZ  ZS )IsValidisvalidc                    s&   t  j||fi |\}}d| |fS )Nz%CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END)r   r`   )r"   r6   r7   r8   sqlparamsr(   r*   r+   r`     s   zIsValid.as_oracle)r-   rH   rI   lookup_namer   r   r`   rK   r*   r*   r(   r+   r     s    r   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i | d S r,   )ri   r   r   )r"   r   ri   r$   r(   r*   r+   r     s   zLength.__init__c                    s2   | j |r|jjstdt j||fi |S )Nz6This backend doesn't support Length on geodetic fields)r1   rf   rd   supports_length_geodeticr	   r   r5   rg   r(   r*   r+   r5     s   
zLength.as_sqlc                    s   |   }d }|  r|jt| j n,| j|r-|j	d}|jt| j| nt
dd |  D }|dkr@|jj}tt|j||fd|i|S )NLengthSpheroidc                 s   s    | ]}|r|j V  qd S r,   dimrT   fr*   r*   r+   	<genexpr>  s    z'Length.as_postgresql.<locals>.<genexpr>rm   r2   )rV   r   r   rv   r   ri   r1   rf   r3   r4   minr:   length3dr   r   r5   )r"   r6   r7   r8   r_   r2   r   r(   r*   r+   r     s"   
zLength.as_postgresqlc                    s8   d }| j |r| jrdnd}t j||fd|i|S )NGeodesicLengthGreatCircleLengthr2   )r1   rf   ri   r   r5   )r"   r6   r7   r8   r2   r(   r*   r+   rY     s   zLength.as_sqlite)T)r-   rH   rI   r   r5   r   rY   rK   r*   r*   r(   r+   r     s
    
r   c                   @   rk   )LineLocatePointrm   rn   Nro   r*   r*   r*   r+   r     rp   r   c                   @   rL   )	MakeValidNrN   r*   r*   r*   r+   r     rO   r   c                   @   r   )MemSizer   Nr-   rH   rI   r   r   rj   r*   r*   r*   r+   r     r   r   c                   @   r   )NumGeometriesr   Nr   r*   r*   r*   r+   r     r   r   c                   @   r   )	NumPointsr   Nr   r*   r*   r*   r+   r     r   r   c                       s,   e Zd ZdZ fddZ fddZ  ZS )	Perimeterr   c                    s`   d }| j |r|  stdtdd |  D }|dkr#|jj}t j	||fd|i|S )Nz<ST_Perimeter cannot use a non-projected non-geography field.c                 s   s    | ]}|j V  qd S r,   r   r   r*   r*   r+   r     s    z*Perimeter.as_postgresql.<locals>.<genexpr>rm   r2   )
r1   rf   r   r	   r   r:   r3   perimeter3dr   r5   )r"   r6   r7   r8   r2   r   r(   r*   r+   r     s   zPerimeter.as_postgresqlc                    s*   | j |r
tdt j||fi |S )Nz+Perimeter cannot use a non-projected field.)r1   rf   r	   r   r5   rg   r(   r*   r+   rY     s   zPerimeter.as_sqlite)r-   rH   rI   rj   r   rY   rK   r*   r*   r(   r+   r     s    r   c                   @   r   )PointOnSurfacer   Nr   r*   r*   r*   r+   r     r   r   c                   @   r   )Reverser   Nr   r*   r*   r*   r+   r     r   r   c                       s   e Zd Zd fdd	Z  ZS )Scale        c                    sP   ||  |dt|  |dtg}|dkr||  |dt t j|i | d S )Nxyr   z)rF   r^   rv   r   r   )r"   rx   r   r   r   r$   r#   r(   r*   r+   r     s   zScale.__init__)r   r-   rH   rI   r   rK   r*   r*   r(   r+   r     s    r   c                          e Zd Z fddZ  ZS )
SnapToGridc                    s   t |}|g}|dv r| fdd|D  n'|dkr;|g  fdd|dd  D  fdd|d	d D 7 }ntd
t j|i | d S )N)r   rm   c                    s   g | ]	}  |d tqS )rB   rF   r^   rT   argr.   r*   r+   rU     s    z'SnapToGrid.__init__.<locals>.<listcomp>   c                 3       | ]
}  |d tV  qdS rG   r   r   r.   r*   r+   r         z&SnapToGrid.__init__.<locals>.<genexpr>rm   c                 3   r   rG   r   r   r.   r*   r+   r     r   r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r   extendr!   r   r   )r"   rx   r<   r$   nargsr#   r(   r.   r+   r     s   zSnapToGrid.__init__r   r*   r*   r(   r+   r         r   c                   @   r   )SymDifferencerm   rn   Nr   r*   r*   r*   r+   r     r   r   c                       r   )r   c                    s>   ||  |dtg}d|vrt|d|d< t j|i | d S )Nr   r   r   )rF   rw   r   r   r   )r"   rx   r   r$   r#   r(   r*   r+   r     s   zTransform.__init__r   r*   r*   r(   r+   r   
  r   r   c                       r   )	Translatec                    s@   |   }t| jdk r|jtd tt|j||fi |S )Nr   r   )rV   r   r   rv   r   r   r   rY   r   r(   r*   r+   rY     s   zTranslate.as_sqlite)r-   rH   rI   rY   rK   r*   r*   r(   r+   r     r   r   c                   @   r   )Unionrm   rn   Nr   r*   r*   r*   r+   r     r   r   N)Edecimalr   #django.contrib.gis.db.models.fieldsr   r    django.contrib.gis.db.models.sqlr   r   django.contrib.gis.geosr   django.core.exceptionsr   	django.dbr	   django.db.modelsr
   r   r   r   r   r   r   r   django.db.models.functionsr   django.utils.functionalr   rw   rS   r^   r   rM   rP   rR   r[   ra   rl   rq   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   register_lookupr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r*   r*   r*   r+   <module>   sd    (

T
	3	'	