o
    ˜¨ÊhSG  ã                   @   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__© úX/var/www/html/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)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 )ÚBoundingCircleé0   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	'	