o
    uvXj—B  ã                   @   s*  d dl Z 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 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"ƒZ0G d-d.„ d.e#ƒZ1G d/d0„ d0e#ƒZ2G d1d2„ d2e#ƒZ3G d3d4„ d4e"ƒZ4G d5d6„ d6e%e#ƒZ5ej6G d7d8„ d8e%e!eƒƒZ7G d9d:„ d:e/e%e"ƒZ8G d;d<„ d<e"ƒZ9G d=d>„ d>e"ƒZ:G d?d@„ d@e"ƒZ;G dAdB„ dBe"ƒZ<G dCdD„ dDe"ƒZ=G dEdF„ dFe/e%e"ƒZ>G dGdH„ dHe%e#ƒZ?G dIdJ„ dJe"ƒZ@G dKdL„ dLe$e#ƒZAG dMdN„ dNe$e#ƒZBG dOdP„ dPe%e#ƒZCG dQdR„ dRe#ƒZG dSdT„ dTeAƒZDG dUdV„ dVe%e#ƒZEdS )Wé    N)ÚDecimal)ÚBaseSpatialFieldÚGeometryField)Ú	AreaFieldÚDistanceField)ÚGEOSGeometry)Ú
FieldError)ÚBooleanFieldÚ
FloatFieldÚIntegerFieldÚ	TextFieldÚ	Transform)ÚFuncÚValue)ÚCast)ÚNotSupportedError)ÚRemovedInDjango30Warning)Ú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__© úc/var/www/html/myproject/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    ,   s   zGeoFuncMixin.namec                 C   s   | j | jd  jS ©Nr   )r   r   Úfieldr.   r*   r*   r+   Ú	geo_field0   s   zGeoFuncMixin.geo_fieldc                    s2   | j s|s|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   4   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   9   s&   

ÿÿÿ
€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_paramP   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   Z   ó    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   _   s   zGeomOutputGeoFunc.output_fieldN)r-   rH   rI   r   r   r*   r*   r*   r+   rP   ^   s    rP   c                       ó    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   |   ¡ D ]}t|dƒrt|jtƒrt|jƒ|_qtƒ j||fi |¤ŽS )Nr   )Úget_source_expressionsrC   r   r   r   Úfloatr   r5   )r"   r6   r7   r8   r&   r(   r*   r+   Ú	as_sqlitei   s
   €z#SQLiteDecimalToFloatMixin.as_sqlite)r-   rH   rI   Ú__doc__rU   rK   r*   r*   r(   r+   rR   d   s    rR   c                   @   s   e Zd ZdZdd„ ZdS )ÚOracleToleranceMixingš™™™™™©?c                 K   s,   | j  d| j¡}| j||fdd| i|¤ŽS )NÚ	toleranceÚtemplatez#%%(function)s(%%(expressions)s, %s))r$   ÚgetrX   r5   )r"   r6   r7   r8   Útolr*   r*   r+   Ú	as_oracles   s   ÿþýzOracleToleranceMixin.as_oracleN)r-   rH   rI   rX   r\   r*   r*   r*   r+   rW   p   s    rW   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   ƒ   ó   zArea.as_sqlc                 K   s0   | j  |¡rd|d< d|d< | j||fi |¤ŽS )Nz+%(function)s(%(expressions)s, %(spheroid)d)rY   TÚspheroid)r1   rb   r5   rc   r*   r*   r+   rU   ˆ   s   zArea.as_sqlite)	r-   rH   rI   Úarityr   r   r5   rU   rK   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-   rH   rI   r
   r   rf   r   r*   r*   r*   r+   rh   �   ó    rh   c                       ó$   e Zd Zeƒ Zd‡ 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   ri   ©ÚappendrF   Úintr   r   )r"   Ú
expressionÚbboxÚcrsrp   r$   r#   Úoptionsr(   r*   r+   r   ˜   s   
zAsGeoJSON.__init__)FFro   ©r-   rH   rI   r   r   r   rK   r*   r*   r(   r+   rn   •   ó    rn   c                       s4   e Zd ZdZeƒ Zd‡ fdd„	Z‡ fdd„Z‡  ZS )	ÚAsGML)r   ri   ro   c                    s:   ||g}|d ur|  |  |dt¡¡ tƒ j|i |¤Ž d S ©Nrp   rr   )r"   ru   Úversionrp   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   rq   zSDO_UTIL.TO_GML311GEOMETRYzSDO_UTIL.TO_GMLGEOMETRYr2   )rS   ÚcopyÚset_source_expressionsr   r   r{   r5   )r"   r6   r7   r8   r   r}   Úcloner(   r*   r+   r\   ²   s   zAsGML.as_oracle)ri   ro   )	r-   rH   rI   r   r   r   r   r\   rK   r*   r*   r(   r+   r{   ¨   s
    r{   c                   @   s   e Zd Zdd„ ZdS )ÚAsKMLc                 K   s2   |   ¡ }| |  ¡ dd … ¡ |j||fi |¤ŽS )Nr   )r~   r   rS   r5   ©r"   r6   r7   r8   r€   r*   r*   r+   rU   ¼   s   zAsKML.as_sqliteN)r-   rH   rI   rU   r*   r*   r*   r+   r�   »   s    r�   c                       rm   )ÚAsSVGFro   c                    s@   t |dƒr|nt|ƒ}|||  |dt¡g}tƒ j|i |¤Ž d S )Nr9   rp   )rC   rt   rF   r   r   )r"   ru   Úrelativerp   r$   r#   r(   r*   r+   r   Æ   s   ýzAsSVG.__init__)Fro   ry   r*   r*   r(   r+   rƒ   Ã   rz   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"   ru   Únum_segr$   r(   r*   r+   r   Ñ   s   zBoundingCircle.__init__c                    s6   |   ¡ }| |  ¡ d g¡ tt|ƒj||fi |¤ŽS r/   )r~   r   rS   r   r…   r\   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   rf   r*   r*   r*   r+   r‰   Ú   ó    r‰   c                   @   ó   e Zd ZdZdZdS )Ú
Differenceri   rj   N©r-   rH   rI   rf   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   r1   r.   r*   r*   r+   r   ä   r_   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 )
ÚDistancerj   Nc                    s6   ||g}|d ur|   |dt¡| _tƒ j|i |¤Ž d S )Nre   )rF   Úboolre   r   r   )r"   Úexpr1Úexpr2re   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   )r~   r   r’   r   r‘   r   r   r   r   r   r1   rb   re   r3   r4   rs   r   r“   r5   )r"   r6   r7   r8   r€   r2   r–   r‘   r(   r*   r+   Úas_postgresqlö   s"   



þ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)rY   re   )r1   rb   rt   r”   re   r   r5   rc   r(   r*   r+   rU     s   zDistance.as_sqliter,   )	r-   rH   rI   r   re   r   r™   rU   rK   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›     r‹   r›   c                       rQ   )ÚForceRHRr   c                    s&   t jdtdd� tƒ j|i |¤Ž d S )Nz2ForceRHR is deprecated in favor of ForcePolygonCW.ri   )Ú
stacklevel)ÚwarningsÚwarnr   r   r   )r"   r<   r=   r(   r*   r+   r   "  s
   þzForceRHR.__init__)r-   rH   rI   rf   r   rK   r*   r*   r(   r+   rœ     s    rœ   c                       s,   e Zd Zeƒ Zd‡ fdd„	Zdd„ Z‡  ZS )ÚGeoHashNc                    s8   |g}|d ur|  |  |dt¡¡ tƒ j|i |¤Ž d S r|   rr   )r"   ru   rp   r$   r#   r(   r*   r+   r   -  s   zGeoHash.__init__c                 K   s:   |   ¡ }t|jƒdk r|j tdƒ¡ |j||fi |¤ŽS )Nri   éd   )r~   Úlenr   rs   r   r5   r‚   r*   r*   r+   Úas_mysql3  s   zGeoHash.as_mysqlr,   )r-   rH   rI   r   r   r   r£   rK   r*   r*   r(   r+   r    *  s    r    c                   @   rŒ   )ÚIntersectionri   rj   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\   E  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,   )re   r   r   )r"   r•   re   r$   r(   r*   r+   r   K  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   rb   r`   Úsupports_length_geodeticr   r   r5   rc   r(   r*   r+   r5   O  rd   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©Ú.0Úfr*   r*   r+   Ú	<genexpr>^  s   € z'Length.as_postgresql.<locals>.<genexpr>ri   r2   )r~   r’   r   rs   r   re   r1   rb   r3   r4   Úminr:   Úlength3dr   rª   r5   )r"   r6   r7   r8   r€   r2   r®   r(   r*   r+   r™   T  s   zLength.as_postgresqlc                    s8   d }| j  |¡r| jrdnd}tƒ j||fd|i|¤ŽS )NÚGeodesicLengthÚGreatCircleLengthr2   )r1   rb   re   r   r5   )r"   r6   r7   r8   r2   r(   r*   r+   rU   c  s   zLength.as_sqlite)T)r-   rH   rI   r   r5   r™   rU   rK   r*   r*   r(   r+   rª   J  s
    rª   c                   @   rg   )ÚLineLocatePointri   rj   Nrk   r*   r*   r*   r+   r·   j  rl   r·   c                   @   rL   )Ú	MakeValidNrN   r*   r*   r*   r+   r¸   p  rO   r¸   c                   @   ó   e Zd Zeƒ ZdZdS )ÚMemSizer   N©r-   rH   rI   r   r   rf   r*   r*   r*   r+   rº   t  ó    rº   c                   @   r¹   )ÚNumGeometriesr   Nr»   r*   r*   r*   r+   r½   y  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>ri   r2   )
r1   rb   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   rb   r   r   r5   rc   r(   r*   r+   rU   �  s   zPerimeter.as_sqlite)r-   rH   rI   rf   r™   rU   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   ÚNUMERIC_TYPESrs   r   r   )r"   ru   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   ri   c                    s   g | ]	}ˆ   |d t¡‘qS )rB   ©rF   rÈ   ©r°   Úargr.   r*   r+   Ú
<listcomp>¯  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>ri   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"   ru   r<   r$   Únargsr#   r(   r.   r+   r   ª  s   ÿÿþzSnapToGrid.__init__rÉ   r*   r*   r(   r+   rË   ©  ó    rË   c                   @   rŒ   )ÚSymDifferenceri   rj   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   rt   r   r   r   )r"   ru   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   )r~   r¢   r   rs   r   r   r×   rU   r‚   r(   r*   r+   rU   Í  s   zTranslate.as_sqlite)r-   rH   rI   rU   rK   r*   r*   r(   r+   r×   Ì  rÕ   r×   c                   @   rŒ   )ÚUnionri   rj   NrŽ   r*   r*   r*   r+   rØ   Õ  r�   rØ   )Frž   Údecimalr   Ú#django.contrib.gis.db.models.fieldsr   r   Ú django.contrib.gis.db.models.sqlr   r   Údjango.contrib.gis.geosr   Údjango.core.exceptionsr   Údjango.db.modelsr	   r
   r   r   r   Údjango.db.models.expressionsr   r   Údjango.db.models.functionsr   Údjango.db.utilsr   Údjango.utils.deprecationr   Údjango.utils.functionalr   rt   rT   rÈ   r   rM   rP   rR   rW   r]   rh   rn   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>   sf    
F
	+	 	