o
    `Zh%I                     @   sz  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 Z-G d*d+ d+e"e Z.G d,d- d-Z/G d.d/ d/e/e"eZ0G d0d1 d1e Z1G d2d3 d3e Z2G d4d5 d5eZ3G d6d7 d7eZ4G d8d9 d9eZ5G d:d; d;eZ6G d<d= d=e"e Z7ej8G d>d? d?eeZ9ej8G d@dA dAe"eeZ:G dBdC dCe/e"eZ;G dDdE dEeZ<G dFdG dGe Z=G dHdI dIeZ>G dJdK dKeZ?G dLdM dMeZ@G dNdO dOe/e"eZAG dPdQ dQe"e ZBG dRdS dSeZCG dTdU dUe!e ZDG dVdW dWe!e ZEG dXdY dYe"e ZFG dZd[ d[e ZG d\d] d]eDZGG d^d_ d_e"e ZHd`S )a    )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   Zgeom	__class__ ]/var/www/html/lang_env/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)r1   opsspatial_function_namer    r   as_sql)r"   compiler
connectionr1   extra_contextr'   r)   r*   r4   A   s   zGeoFuncMixin.as_sqlc           
         s   t  j|i |}| js|S | }| jD ]}|| }t|ts/td| j|d t|j	f q|j
j}| jdd  D ]}|j| }|jj}	|	|krXt||j|i ||j|< q;|S )Nz<%s function requires a GeometryField in position %s, got %s.r   )r   resolve_expressionr   get_source_fieldsr   r   r   r    typer,   r0   r   r   r   r   )
r"   argskwargsresZsource_fieldsr%   r/   Z	base_sridr&   Z	expr_sridr'   r)   r*   r8   F   s<   



zGeoFuncMixin.resolve_expression c                 C   s,   t |ds|rt||std||f |S )Nr8   z2The %s parameter has the wrong type: should be %s.)hasattrr   r   )r"   r   
param_nameZcheck_typesr)   r)   r*   _handle_paramd   s   
zGeoFuncMixin._handle_paramr+   r>   N)r,   
__module____qualname__r1   r   r   propertyr    r   r0   r4   r8   rA   __classcell__r)   r)   r'   r*   r      s    

r   c                   @      e Zd ZdS )GeoFuncNr,   rC   rD   r)   r)   r)   r*   rH   n       rH   c                   @   s   e Zd Zedd ZdS )GeomOutputGeoFuncc                 C   s   t | jjdS )Nr   )r   r0   r   r-   r)   r)   r*   r   s   s   zGeomOutputGeoFunc.output_fieldN)r,   rC   rD   r   r   r)   r)   r)   r*   rK   r   s    rK   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   )r?   r   r   r   r   float).0r&   r)   r)   r*   
<listcomp>   s    
z7SQLiteDecimalToFloatMixin.as_sqlite.<locals>.<listcomp>)copyset_source_expressionsget_source_expressionsr4   )r"   r5   r6   r7   rQ   r)   r)   r*   	as_sqlite~   s   z#SQLiteDecimalToFloatMixin.as_sqliteN)r,   rC   rD   __doc__rT   r)   r)   r)   r*   rM   x   s    rM   c                   @   rL   )OracleToleranceMixing?c                 K   sP   t | | jd| jdt}|  }|g |  | |j	||fi |S )N	tolerance)
r   rA   r$   getrW   NUMERIC_TYPESrQ   rR   rS   r4   )r"   r5   r6   r7   rW   cloner)   r)   r*   	as_oracle   s   zOracleToleranceMixin.as_oracleN)r,   rC   rD   rW   r[   r)   r)   r)   r*   rV      s    rV   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   r0   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.)featuresZsupports_area_geodeticr0   geodeticr	   r   r4   r"   r5   r6   r7   r'   r)   r*   r4      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)r0   r`   r4   ra   r)   r)   r*   rT      s   zArea.as_sqlite)	r,   rC   rD   arityr   r   r4   rT   rF   r)   r)   r'   r*   r\      s    
	r\   c                   @      e Zd Ze ZdZdZdS )Azimuth   r   r   Nr,   rC   rD   r   r   rd   r   r)   r)   r)   r*   rf          rf   c                       s0   e Zd Ze Zd fdd	Z fddZ  ZS )	AsGeoJSONF   c                    sf   |g}|d ur| | |dt d}|r|rd}n	|rd}n|r#d}| | t j|i | d S )N	precisionr      r   rg   appendrA   intr   r   )r"   
expressionZbboxZcrsrm   r$   r#   optionsr'   r)   r*   r      s   
zAsGeoJSON.__init__c                    s<   |   }|  }||d d  tt|j||fi |S )Nr   )rS   rQ   rR   r   rk   r4   )r"   r5   r6   r7   r   rZ   r'   r)   r*   r[      s   zAsGeoJSON.as_oracle)FFrl   )r,   rC   rD   r   r   r   r[   rF   r)   r)   r'   r*   rk      s    rk   c                       s4   e Zd ZdZe Zd fdd	Z fddZ  ZS )	AsGML)r   rg   rl   c                    s:   ||g}|d ur| | |dt t j|i | d S Nrm   ro   )r"   rr   versionrm   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   rn   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr1   )rS   rQ   rR   r   r   rt   r4   )r"   r5   r6   r7   r   rv   rZ   r'   r)   r*   r[      s   
zAsGML.as_oracle)rg   rl   )	r,   rC   rD   r   r   r   r   r[   rF   r)   r)   r'   r*   rt      s
    rt   c                       s$   e Zd Ze Zd fdd	Z  ZS )AsKMLrl   c                    8   |g}|d ur| | |dt t j|i | d S ru   ro   r"   rr   rm   r$   r#   r'   r)   r*   r         zAsKML.__init__)rl   r,   rC   rD   r   r   r   rF   r)   r)   r'   r*   rw          rw   c                       s$   e Zd Ze Zd fdd	Z  ZS )AsSVGFrl   c                    s@   t |dr|nt|}||| |dtg}t j|i | d S )Nr8   rm   )r?   rq   rA   r   r   )r"   rr   Zrelativerm   r$   r#   r'   r)   r*   r      s   zAsSVG.__init__)Frl   r{   r)   r)   r'   r*   r}      r|   r}   c                   @      e Zd Ze ZdZdS )AsWKBr   N)r,   rC   rD   r
   r   rd   r)   r)   r)   r*   r          r   c                   @   r~   )AsWKTr   N)r,   rC   rD   r   r   rd   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"   rr   Znum_segr$   r'   r)   r*   r     s   zBoundingCircle.__init__c                    s6   |   }||  d g tt|j||fi |S r.   )rQ   rR   rS   r   r   r[   r"   r5   r6   r7   rZ   r'   r)   r*   r[     s   
zBoundingCircle.as_oracle)r   )r,   rC   rD   r   r[   rF   r)   r)   r'   r*   r   
  s    r   c                   @      e Zd ZdZdS )Centroidr   Nr,   rC   rD   rd   r)   r)   r)   r*   r         r   c                   @      e Zd ZdZdZdS )ClosestPointrg   rh   Nr,   rC   rD   rd   r   r)   r)   r)   r*   r         r   c                   @   r   )
Differencerg   rh   Nr   r)   r)   r)   r*   r     r   r   c                   @   s    e Zd Zedd Zdd ZdS )DistanceResultMixinc                 C   r]   r+   )r   r0   r-   r)   r)   r*   r   %  r^   z DistanceResultMixin.output_fieldc                 C   s   | j jo	| j jdkS )Ni  )r0   	geographyr   r-   r)   r)   r*   source_is_geography)  s   z'DistanceResultMixin.source_is_geographyN)r,   rC   rD   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 )
Distancerh   Nc                    s6   ||g}|d ur|  |dt| _t j|i | d S )Nrc   )rA   boolrc   r   r   )r"   expr1expr2rc   r$   r#   r'   r)   r*   r   1  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   ZDistanceSpheroidZDistanceSpherer1   )rQ   r   r   r   r   r   r   r   r   r   r0   r`   rc   r2   r3   rp   r   r   r4   )r"   r5   r6   r7   rZ   r1   r   r   r'   r)   r*   as_postgresql7  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)rb   rc   )r0   r`   rq   r   rc   r   r4   ra   r'   r)   r*   rT   V  s   zDistance.as_sqliter+   )	r,   rC   rD   r   rc   r   r   rT   rF   r)   r)   r'   r*   r   -  s    r   c                   @   r   )Enveloper   Nr   r)   r)   r)   r*   r   `  r   r   c                   @   r   )ForcePolygonCWr   Nr   r)   r)   r)   r*   r   d  r   r   c                   @      e Zd ZeddZdZdZdS )FromWKBr   r   r   r)   Nr,   rC   rD   r   r   rd   r   r)   r)   r)   r*   r   h      
r   c                   @   r   )FromWKTr   r   r   r)   Nr   r)   r)   r)   r*   r   n  r   r   c                       s,   e Zd Ze Zd fdd	Zdd Z  ZS )GeoHashNc                    rx   ru   ro   ry   r'   r)   r*   r   w  rz   zGeoHash.__init__c                 K   s:   |   }t|jdk r|jtd |j||fi |S )Nrg   d   )rQ   lenr   rp   r   r4   r   r)   r)   r*   as_mysql}  s   zGeoHash.as_mysqlr+   )r,   rC   rD   r   r   r   r   rF   r)   r)   r'   r*   r   t  s    r   c                   @   s"   e Zd Ze ZdZdZdZdZdS )GeometryDistancerg   r>   z <-> rh   N)	r,   rC   rD   r   r   rd   r1   Z
arg_joinerr   r)   r)   r)   r*   r     s    r   c                   @   r   )Intersectionrg   rh   Nr   r)   r)   r)   r*   r     r   r   c                   @   s   e Zd ZdZe ZdS )IsEmptyZisemptyN)r,   rC   rD   lookup_namer   r   r)   r)   r)   r*   r     s    
r   c                       s&   e Zd ZdZe Z fddZ  ZS )IsValidZisvalidc                    s&   t  j||fi |\}}d| |fS )Nz%CASE %s WHEN 'TRUE' THEN 1 ELSE 0 END)r   r[   )r"   r5   r6   r7   sqlparamsr'   r)   r*   r[     s   zIsValid.as_oracle)r,   rC   rD   r   r   r   r[   rF   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+   )rc   r   r   )r"   r   rc   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)r0   r`   r_   Zsupports_length_geodeticr	   r   r4   ra   r'   r)   r*   r4     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 )NZLengthSpheroidc                 s   s    | ]}|r|j V  qd S r+   dimrO   fr)   r)   r*   	<genexpr>  s    z'Length.as_postgresql.<locals>.<genexpr>rg   r1   )rQ   r   r   rp   r   rc   r0   r`   r2   r3   minr9   Zlength3dr   r   r4   )r"   r5   r6   r7   rZ   r1   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 )NZGeodesicLengthZGreatCircleLengthr1   )r0   r`   rc   r   r4   )r"   r5   r6   r7   r1   r'   r)   r*   rT     s   zLength.as_sqlite)T)r,   rC   rD   r   r4   r   rT   rF   r)   r)   r'   r*   r     s
    
r   c                   @   re   )LineLocatePointrg   rh   Nri   r)   r)   r)   r*   r     rj   r   c                   @   rG   )	MakeValidNrI   r)   r)   r)   r*   r     rJ   r   c                   @   r~   )MemSizer   Nr,   rC   rD   r   r   rd   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>rg   r1   )
r0   r`   r   r	   r   r9   r2   Zperimeter3dr   r4   )r"   r5   r6   r7   r1   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.)r0   r`   r	   r   r4   ra   r'   r)   r*   rT     s   zPerimeter.as_sqlite)r,   rC   rD   rd   r   rT   rF   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)rA   rY   rp   r   r   )r"   rr   r   r   r   r$   r#   r'   r)   r*   r     s   zScale.__init__)r   r,   rC   rD   r   rF   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   rg   c                    s   g | ]	}  |d tqS )r>   rA   rY   rO   argr-   r)   r*   rP     s    z'SnapToGrid.__init__.<locals>.<listcomp>   c                 3       | ]
}  |d tV  qdS rB   r   r   r-   r)   r*   r         z&SnapToGrid.__init__.<locals>.<genexpr>rg   c                 3   r   rB   r   r   r-   r)   r*   r     r   r   z2Must provide 1, 2, or 4 arguments to `SnapToGrid`.)r   extendr!   r   r   )r"   rr   r;   r$   nargsr#   r'   r-   r*   r     s   zSnapToGrid.__init__r   r)   r)   r'   r*   r   
      r   c                   @   r   )SymDifferencerg   rh   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   )rA   rq   r   r   r   )r"   rr   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   )rQ   r   r   rp   r   r   r   rT   r   r'   r)   r*   rT   .  s   zTranslate.as_sqlite)r,   rC   rD   rT   rF   r)   r)   r'   r*   r   -  r   r   c                   @   r   )Unionrg   rh   Nr   r)   r)   r)   r*   r   6  r   r   N)I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.dbr	   Zdjango.db.modelsr
   r   r   r   r   r   r   r   Zdjango.db.models.functionsr   Zdjango.utils.functionalr   rq   rN   rY   r   rH   rK   rM   rV   r\   rf   rk   rt   rw   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zregister_lookupr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r)   r)   r)   r*   <module>   sn    (

V
	3	'	