Ë
    ¹ûàgÀ@  ã                   ó<  — d dl Z d dlmZ d dlmZ d dl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 d d
l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 d dlmZ d dl m!Z! ddl"m#Z# ddl$m%Z%m&Z& ddl'm(Z( dZ) G d„ de«      Z* G d„ de«      Z+ G d„ dee«      Z,y)é    N)Úsettings)ÚBaseSpatialOperations)ÚSpatialOperator)ÚGeometryFieldÚRasterField)Ú
GDALRaster)ÚGEOSGeometryBase)Úwkb_r)ÚDistance)ÚImproperlyConfigured)ÚNotSupportedErrorÚProgrammingError)ÚDatabaseOperations)Úis_psycopg3)ÚFuncÚValue)Úcached_property)Úget_version_tupleé   )ÚPostGISAdapter)ÚPostGISGeometryColumnsÚPostGISSpatialRefSys©Úfrom_pgrasterÚ	bilateralc                   ó6   ‡ — e Zd Zdˆ fd„	Zˆ fd„Zd„ Zd„ Zˆ xZS )ÚPostGISOperatorc                 ó@   •— || _         || _        t        ‰| �  di |¤Ž y )N© )Ú	geographyÚrasterÚsuperÚ__init__)Úselfr    r!   ÚkwargsÚ	__class__s       €úo/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/operations.pyr#   zPostGISOperator.__init__   s%   ø€ ð #ˆŒð
 ˆŒÜ‰ÑÑ"˜6Ó"ó    c                 óp   •— | j                  ||«      }| j                  ||«      }t        ‰| �  |||g|¢­Ž S ©N)Úcheck_rasterÚcheck_geographyr"   Úas_sql)r$   Ú
connectionÚlookupÚtemplate_paramsÚargsr&   s        €r'   r-   zPostGISOperator.as_sql(   s?   ø€ Ø×+Ñ+¨F°OÓDˆØ×.Ñ.¨v°ÓGˆÜ‰w‰~˜j¨&°/ÐIÀDÒIÐIr(   c                 ój  — |j                   xr |j                   d   dk(  }|j                  j                  j                  dk(  }t	        |j
                  t        «      }|j                  �0|r.| j                  st        d«      ‚|d   ›d|j                  ›�|d<   |j                  �0|r.| j                  st        d«      ‚|d   ›d|j                  ›�|d<   | j                  r|r|rd|d   z  |d<   |rd|d   z  |d<   |S | j                  t        k(  r |r|sd|d   z  |d<   |S |r|sd|d   z  |d<   |S )	NéÿÿÿÿÚspheroidÚRASTERzFBand indices are not allowed for this operator, it works on bbox only.Úlhsz, ÚrhszST_Polygon(%s))Ú
rhs_paramsr6   ÚfieldÚ	geom_typeÚ
isinstancer7   r   Úband_lhsÚfuncÚ
ValueErrorÚband_rhsr!   Ú	BILATERAL)r$   r/   r0   r4   Úlhs_is_rasterÚrhs_is_rasters         r'   r+   zPostGISOperator.check_raster-   si  € Ø×$Ñ$ÒL¨×):Ñ):¸2Ñ)>À*Ñ)Lˆð Ÿ
™
×(Ñ(×2Ñ2°hÑ>ˆÜ" 6§:¡:¬zÓ:ˆð �?‰?Ð&©=Ø—9’9Ü ðóð ð
   Ó&Ø—’ð&ˆO˜EÑ"ð
 �?‰?Ð&©=Ø—9’9Ü ðóð ð
   Ó&Ø—’ð&ˆO˜EÑ"ð �{Š{™háØ)9¸OÈEÑ<RÑ)R� Ñ&ÙØ)9¸OÈEÑ<RÑ)R� Ñ&ð Ðð �[‰[œIÒ%ñ ¡]Ø)9¸OÈEÑ<RÑ)R� Ñ&ð Ðñ ¡}Ø)9¸OÈEÑ<RÑ)R� Ñ&àÐr(   c                 óx   — |j                   j                  j                  r| j                  s|dxx   dz  cc<   |S )z9Convert geography fields to geometry types, if necessary.r6   z
::geometry)r6   Úoutput_fieldr    )r$   r/   r0   s      r'   r,   zPostGISOperator.check_geography\   s1   € à�:‰:×"Ñ"×,Ò,°T·^²^Ø˜EÓ" lÑ2Ó"ØÐr(   )FF)Ú__name__Ú
__module__Ú__qualname__r#   r-   r+   r,   Ú__classcell__©r&   s   @r'   r   r      s   ø„ õ
#ôJò
-ö^r(   r   c                   ó2   ‡ — e Zd Zd Zˆ fd„Zed„ «       Zˆ xZS )Ú
ST_Polygonc                 ó  •— t         ‰| �  |«       | j                  d   }t        |t        «      rP|j
                  sCt	        |j                  t        |j                  j                  ¬«      ¬«      | j                  d<   y y y )Nr   ©Úsrid)rD   )	r"   r#   Úsource_expressionsr;   r   Ú_output_field_or_noneÚvaluer   rN   )r$   Úexprr&   s     €r'   r#   zST_Polygon.__init__f   sf   ø€ Ü‰Ñ˜ÔØ×&Ñ& qÑ)ˆÜ�dœEÔ"¨4×+EÒ+EÜ).Ø—
‘
¬¸$¿*¹*¿/¹/Ô)Jô*ˆD×#Ñ# AÒ&ð ,FÐ"r(   c                 ó\   — t        | j                  d   j                  j                  ¬«      S )Nr   rM   )r   rO   r9   rN   ©r$   s    r'   rD   zST_Polygon.output_fieldn   s$   € ä $×"9Ñ"9¸!Ñ"<×"BÑ"B×"GÑ"GÔHÐHr(   )rE   rF   rG   Úfunctionr#   r   rD   rH   rI   s   @r'   rK   rK   c   s#   ø„ Ø€Hôð ñIó ôIr(   rK   c                   óN  ‡ — e Zd ZdZdZdZeZedz   Zedz   Z	edz   Z
edz   Zedz   Zed	z   Zed
z   Zi d edd¬«      “d eddd¬«      “d edd¬«      “d ede¬«      “d ede¬«      “d ed¬«      “d ed¬«      “d ed¬«      “d ed¬«      “d  ed!¬«      “d" ed#¬«      “d$ ed%e¬«      “d& ed%e¬«      “d' ed(e¬)«      “d* ed+e¬)«      “d, ed-de¬.«      “d/ ed0de¬.«      “ ed1¬2«       ed3e¬)«       ed4¬2«       ed5de¬.«       ed6e¬)«       ed7¬2«       ed8e¬)«       ed9e¬)«       ed:de¬.«      d;œ	¥Z e«       Zerd<nd=Zd>Zed?„ «       Zed@„ «       ZdA„ ZdB„ ZdC„ ZdD„ ZdE„ ZdF„ ZdG„ Z dH„ Z!dI„ Z"dJ„ Z#dK„ Z$dL„ Z%dM„ Z&dN„ Z'dO„ Z(dP„ Z)dQ„ Z*ˆ fdR„Z+e,dS„ «       Z-dT„ Z.dU„ Z/ˆ xZ0S )VÚPostGISOperationsÚpostgisTÚST_ÚCollectÚExtentÚ3DExtentÚ3DLengthÚMakeLineÚ3DPerimeterÚUnionÚ
bbcontainsú~)Úopr!   Ú
bboverlapsz&&)rc   r    r!   Ú	containedú@Úoverlaps_leftz&<Úoverlaps_rightz&>Úoverlaps_belowz&<|)rc   Úoverlaps_abovez|&>Úleftz<<Úrightz>>Ústrictly_belowz<<|Ústrictly_abovez|>>Úsame_asz~=ÚexactÚcontainsÚST_Contains)r=   r!   Úcontains_properlyÚST_ContainsProperlyÚ	coveredbyÚST_CoveredBy)r=   r    r!   ÚcoversÚ	ST_CoversÚ
ST_Crosses)r=   ÚST_DisjointÚ	ST_EqualsÚST_IntersectsÚST_OverlapsÚ	ST_RelateÚ
ST_TouchesÚ	ST_WithinÚ
ST_DWithin)	ÚcrossesÚdisjointÚequalsÚ
intersectsÚoverlapsÚrelateÚtouchesÚwithinÚdwithinú%sz	%s::byteaNc                 ó   — dddddddœ}|S )NÚST_AsBinaryÚ	ST_AsTextÚST_MinimumBoundingCircleÚST_GeomFromWKBÚST_GeomFromTextÚ
ST_NPoints)ÚAsWKBÚAsWKTÚBoundingCircleÚFromWKBÚFromWKTÚ	NumPointsr   )r$   Úfunction_namess     r'   r™   z PostGISOperations.function_names«   s%   € ð #Ø Ø8Ø'Ø(Ø%ñ
ˆð Ðr(   c                 óü   — t        t        d«      rt        j                  }|S | j                  d«       	 | j	                  «       }|dd }|S # t
        $ r& t        d| j                  j                  d   z  «      ‚w xY w)z-Determine the version of the PostGIS library.ÚPOSTGIS_VERSIONÚversionzÌCannot determine PostGIS version for database "%s" using command "SELECT postgis_lib_version()". GeoDjango requires at least PostGIS version 3.0. Was the database created from a spatial database template?ÚNAMEr   N)	Úhasattrr   r›   Ú_get_postgis_funcÚpostgis_version_tupler   r   r.   Úsettings_dict)r$   rœ   Úvtups      r'   Úspatial_versionz!PostGISOperations.spatial_version·   s“   € ô ”8Ð.Ô/Ü×.Ñ.ˆGð$ ˆð ×"Ñ" 9Ô-ð	Ø×1Ñ1Ó3�ð ˜1˜2�hˆGØˆøô $ò Ü*ð ð #'§/¡/×"?Ñ"?ÀÑ"Gñ	Hóð ðús   µA Á/A;c                 óÆ   — |€y|dd j                  d«      \  }}t        t        |j                  «       «      \  }}t        t        |j                  «       «      \  }}||||fS )zÊ
        Return a 4-tuple extent for the `Extent` aggregate by converting
        the bounding box text returned by PostGIS (`box` argument), for
        example: "BOX(-90.0 30.0, -85.0 40.0)".
        Né   r3   ú,©ÚsplitÚmapÚfloat)r$   ÚboxÚllÚurÚxminÚyminÚxmaxÚymaxs           r'   Úconvert_extentz PostGISOperations.convert_extentÕ   s_   € ð ˆ;ØØ�Q�r�—‘ Ó%‰ˆˆBÜœ §¡£
Ó+‰
ˆˆdÜœ §¡£
Ó+‰
ˆˆdØ�d˜D $Ð'Ð'r(   c                 óÎ   — |€y|dd j                  d«      \  }}t        t        |j                  «       «      \  }}}t        t        |j                  «       «      \  }}}	||||||	fS )z×
        Return a 6-tuple extent for the `Extent3D` aggregate by converting
        the 3d bounding-box text returned by PostGIS (`box3d` argument), for
        example: "BOX3D(-90.0 30.0 1, -85.0 40.0 2)".
        Né   r3   r¦   r§   )
r$   Úbox3dr¬   r­   r®   r¯   Úzminr°   r±   Úzmaxs
             r'   Úconvert_extent3dz"PostGISOperations.convert_extent3dâ   sk   € ð ˆ=ØØ�q˜�×"Ñ" 3Ó'‰ˆˆBÜœu b§h¡h£jÓ1Ñˆˆd�DÜœu b§h¡h£jÓ1Ñˆˆd�DØ�d˜D $¨¨dÐ3Ð3r(   c                 ó  — |j                   dk(  ry|j                  dk(  r|j                   dz   }n|j                   }|j                  r+|j                  dk7  rt	        d«      ‚d||j                  fz  S d||j                  fz  S )	zM
        Return the database field type for the given spatial field.
        r5   r!   é   ÚZiæ  z=PostGIS only supports geography columns with an SRID of 4326.zgeography(%s,%d)zgeometry(%s,%d))r:   Údimr    rN   r   )r$   Úfr:   s      r'   Úgeo_db_typezPostGISOperations.geo_db_typeï   sƒ   € ð �;‰;˜(Ò"Øð �5‰5�AŠ:ØŸ™ cÑ)‰IàŸ™ˆIØ�;Š;Ø�v‰v˜Š~Ü'ØSóð ð &¨°A·F±FÐ(;Ñ;Ð;à$¨	°1·6±6Ð':Ñ:Ð:r(   c                 ó^  — |d   }|j                  | j                  «      }|j                  }t        |t        «      rm|r|j
                  }|gS |r|dk(  rt        d«      ‚|j
                  }|gS t        |t	        j                  |j                  | j                  «      «      «      }|gS |}|gS )a�  
        Retrieve the distance parameters for the given geometry field,
        distance lookup value, and the distance lookup type.

        This is the most complex implementation of the spatial backends due to
        what is supported on geodetic geometry columns vs. what's available on
        projected geometry columns.  In addition, it has to take into account
        the geography column type.
        r   rŠ   zNOnly numeric values of degree units are allowed on geographic DWithin queries.)
Úgeodeticr.   r    r;   r   Úmr>   ÚgetattrÚunit_attnameÚ
units_name)r$   r½   Údist_valÚlookup_typerQ   rÀ   r    Ú
dist_params           r'   Úget_distancezPostGISOperations.get_distance  sÁ   € ð ˜‘ˆð —:‘:˜dŸo™oÓ.ˆØ—K‘Kˆ	ä�eœXÔ&ÙØ"ŸW™W�
ð  ˆ|Ðñ Ø )Ò+Ü$ðAóð ð #ŸW™W�
ð ˆ|Ðô %Øœ8×0Ñ0°·±¸d¿o¹oÓ1NÓOó�
ð ˆ|Ðð ˆJàˆ|Ðr(   c                 ó&  — | j                  d«      }t        |d«      r;|j                  j                  |j                  k(  rd}|S |›d|j                  ›d�}|S |€d}n|j                  }|�||j                  k(  rd}|S |›d|j                  ›d�}|S )zÖ
        Provide a proper substitution value for Geometries or rasters that are
        not in the SRID of the field. Specifically, this routine will
        substitute in the ST_Transform() function call.
        Ú	Transformr-   r‹   z(%s, ú)N)Úspatial_function_namerž   r9   rN   )r$   r½   rQ   ÚcompilerÚtransform_funcÚplaceholderÚ
value_srids          r'   Úget_geom_placeholderz&PostGISOperations.get_geom_placeholder+  s¢   € ð ×3Ñ3°KÓ@ˆÜ�5˜(Ô#Ø�{‰{×Ñ 1§6¡6Ò)Ø"�ð Ðò 0>¸q¿v»vÐF�ØÐð ˆ=Ø‰JàŸ™ˆJð Ð ¨q¯v©vÒ!5ØˆKð Ðò ,:¸1¿6»6ÐBˆKàÐr(   c                 ó°   — | j                   j                  «       5 }|j                  d|z  «       |j                  «       d   cddd«       S # 1 sw Y   yxY w)zZ
        Helper routine for calling PostGIS functions and returning their result.
        zSELECT %s()r   N)r.   Útemporary_connectionÚexecuteÚfetchone)r$   r=   Úcursors      r'   rŸ   z#PostGISOperations._get_postgis_funcH  sK   € ð
 �_‰_×1Ñ1Ó3ð 	(°vØ�N‰N˜=¨4Ñ/Ô0Ø—?‘?Ó$ QÑ'÷	(÷ 	(ò 	(ús   ›'AÁAc                 ó$   — | j                  d«      S )z9Return the version of the GEOS library used with PostGIS.Úpostgis_geos_version©rŸ   rT   s    r'   rØ   z&PostGISOperations.postgis_geos_versionQ  ó   € à×%Ñ%Ð&<Ó=Ð=r(   c                 ó$   — | j                  d«      S )zFReturn the version number of the PostGIS library used with PostgreSQL.Úpostgis_lib_versionrÙ   rT   s    r'   rÜ   z%PostGISOperations.postgis_lib_versionU  s   € à×%Ñ%Ð&;Ó<Ð<r(   c                 ó$   — | j                  d«      S )z9Return the version of the PROJ library used with PostGIS.Úpostgis_proj_versionrÙ   rT   s    r'   rÞ   z&PostGISOperations.postgis_proj_versionY  rÚ   r(   c                 ó$   — | j                  d«      S )ú7Return PostGIS version number and compile-time options.Úpostgis_versionrÙ   rT   s    r'   rá   z!PostGISOperations.postgis_version]  s   € à×%Ñ%Ð&7Ó8Ð8r(   c                 ó$   — | j                  d«      S )rà   Úpostgis_full_versionrÙ   rT   s    r'   rã   z&PostGISOperations.postgis_full_versiona  rÚ   r(   c                 ó@   — | j                  «       }|ft        |«      z   S )zi
        Return the PostGIS version as a tuple (version string, major,
        minor, subminor).
        )rÜ   r   )r$   rœ   s     r'   r    z'PostGISOperations.postgis_version_tuplee  s%   € ð
 ×*Ñ*Ó,ˆØˆzÔ-¨gÓ6Ñ6Ð6r(   c                 óÖ   — t        j                  d«      }| j                  «       }|j                  |«      }|r't	        t        t        |j                  «       «      «      S t        d«      ‚)z‚
        Return the version of PROJ used by PostGIS as a tuple of the
        major, minor, and subminor release numbers.
        z(\d+)\.(\d+)\.(\d+)z.Could not determine PROJ version from PostGIS.)	ÚreÚcompilerÞ   ÚsearchÚtupler©   ÚintÚgroupsÚ	Exception)r$   Ú
proj_regexÚproj_ver_strrÁ   s       r'   Úproj_version_tuplez$PostGISOperations.proj_version_tuplem  sX   € ô
 —Z‘ZÐ 6Ó7ˆ
Ø×0Ñ0Ó2ˆØ×Ñ˜lÓ+ˆÙÜœœS !§(¡(£*Ó-Ó.Ð.äÐLÓMÐMr(   c                 óB   — |dk(  r| j                   S | j                  |z   S )NÚExtent3D)Úextent3dÚgeom_func_prefix)r$   Úagg_names     r'   Úspatial_aggregate_namez(PostGISOperations.spatial_aggregate_namez  s%   € Ø�zÒ!Ø—=‘=Ð à×(Ñ(¨8Ñ3Ð3r(   c                 ó   — t         S r*   )r   rT   s    r'   Úgeometry_columnsz"PostGISOperations.geometry_columns�  s   € Ü%Ð%r(   c                 ó   — t         S r*   )r   rT   s    r'   Úspatial_ref_sysz!PostGISOperations.spatial_ref_sys„  s   € Ü#Ð#r(   c                 ó   — t        |«      S )z@Convert a PostGIS HEX String into a dict readable by GDALRaster.r   )r$   rQ   s     r'   Úparse_rasterzPostGISOperations.parse_raster‡  s   € ä˜UÓ#Ð#r(   c                 ób   •— t        ‰| �  | j                  |«      | j                  |«      fi |¤ŽS r*   )r"   Údistance_expr_for_lookupÚ_normalize_distance_lookup_arg)r$   r6   r7   r%   r&   s       €r'   rý   z*PostGISOperations.distance_expr_for_lookup‹  s;   ø€ Ü‰wÑ/Ø×/Ñ/°Ó4Ø×/Ñ/°Ó4ñ
ð ñ
ð 	
r(   c                 óŠ   — t        | d«      r| j                  j                  dk(  nt        | t        «      }|rt        | «      S | S )Nr9   r5   )rž   r9   r:   r;   r   rK   )ÚargÚ	is_rasters     r'   rþ   z0PostGISOperations._normalize_distance_lookup_arg’  sD   € ô �s˜GÔ$ð �I‰I×Ñ 8Ò+ä˜C¤Ó,ð 	ñ
 #,Œz˜#‹Ð4°Ð4r(   c                 ój   ‡‡— t        «       j                  Š|j                  j                  Šˆˆfd„}|S )Nc                 ór   •— t        | t        «      r| j                  d«      } | €d S t         ‰| «      ‰«      S )NÚascii)r;   ÚstrÚencoder	   )rQ   Ú
expressionr.   Ú
geom_classÚreads      €€r'   Ú	converterz;PostGISOperations.get_geometry_converter.<locals>.converterŸ  s6   ø€ Ü˜%¤Ô%ØŸ™ WÓ-�Ø ˜=�4ÐWÔ.>¹tÀE»{ÈJÓ.WÐWr(   )r
   r	  rD   r  )r$   r  r
  r  r	  s      @@r'   Úget_geometry_converterz(PostGISOperations.get_geometry_converter›  s-   ù€ Ü‹w�|‰|ˆØ×,Ñ,×7Ñ7ˆ
õ	Xð
 Ðr(   c                  ó   — y)NÚsq_mr   )r$   r9   s     r'   Úget_area_att_for_fieldz(PostGISOperations.get_area_att_for_field¦  s   € Ør(   )1rE   rF   rG   ÚnamerX   ró   r   ÚAdapterÚcollectÚextentrò   Úlength3dÚmakelineÚperimeter3dÚunionaggr   r@   Úgis_operatorsÚsetÚunsupported_functionsr   ÚselectÚselect_extentr   r™   r£   r²   r¸   r¾   rÈ   rÑ   rŸ   rØ   rÜ   rÞ   rá   rã   r    rï   rõ   r÷   rù   rû   rý   Ústaticmethodrþ   r  r  rH   rI   s   @r'   rW   rW   s   sÂ  ø„ Ø€DØ€GØÐà€Gà Ñ*€GØ Ñ(€FØ *Ñ,€HØ *Ñ,€HØ *Ñ,€HØ" ]Ñ2€KØ 'Ñ)€Hð!Ø‘o¨°TÔ:ð!à‘o¨¸ÀdÔKð!ð 	‘_¨°DÔ9ð!ð 	™¨D¸ÔCð	!ð
 	™/¨T¸)ÔDð!ð 	™/¨UÔ3ð!ð 	™/¨UÔ3ð!ð 	‘ 4Ô(ð!ð 	‘ DÔ)ð!ð 	™/¨UÔ3ð!ð 	™/¨UÔ3ð!ð 	‘? d°9Ô=ð!ð 	‘ D°Ô;ð!ð 	‘O¨¸yÔIð!ð 	™_Ø&¨yô
ð!ð$ 	‘_Ø¨4¸	ô
ð%!ð* 	‘/ {¸dÈ9ÔUð+!ñ, #¨Ô5Ù#¨¸yÔIÙ! {Ô3Ù%Ø ¨D¸ô
ñ $¨¸yÔIÙ! {Ô3Ù"¨¸YÔGÙ! {¸9ÔEÙ"¨ÀÈYÔWòA!€MñF  ›EÐá ‰T k€Fà€Màñ	ó ð	ð ñó ðò:(ò4ò;ò.#òJò:(ò>ò=ò>ò9ò>ò7òNò4ò&ò$ò$ô
ð ñ5ó ð5ò	ör(   rW   )-ræ   Údjango.confr   Ú.django.contrib.gis.db.backends.base.operationsr   Ú$django.contrib.gis.db.backends.utilsr   Údjango.contrib.gis.db.modelsr   r   Údjango.contrib.gis.gdalr   Ú django.contrib.gis.geos.geometryr	   Ú%django.contrib.gis.geos.prototypes.ior
   Údjango.contrib.gis.measurer   Údjango.core.exceptionsr   Ú	django.dbr   r   Ú(django.db.backends.postgresql.operationsr   Ú)django.db.backends.postgresql.psycopg_anyr   Údjango.db.modelsr   r   Údjango.utils.functionalr   Údjango.utils.versionr   Úadapterr   Úmodelsr   r   Úpgrasterr   r@   r   rK   rW   r   r(   r'   ú<module>r/     st   ðÛ 	å  Ý PÝ @ß CÝ .Ý =Ý 7Ý /Ý 7ß 9Ý GÝ Aß (Ý 3Ý 2å #ß @Ý #ð €	ôE�oô EôPI�ô Iô tÐ-Ð/Aõ tr(   