
    +'&h2                       U d dl mZ d dlZd dlZd dl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 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 ej        Z e            Zded<    G d d          Z G d de          Z G d de          Z G d de          Z G d de          Z ee          d!d            Z g dZ!ded<   d"d Z"dS )#    )annotationsN)Any)Dict)List)Optional)Set)Union)compiles)	functions)FunctionElement)to_instance)ArgumentErrorzSet[str]function_registryc                  n    e Zd ZdZddd
ZddZddZddZddZd Z	d Z
ddZddZed             ZdS )_SpatialElementa  The base class for public spatial elements.

    Args:
        data: The first argument passed to the constructor is the data wrapped
            by the ``_SpatialElement`` object being constructed.
        srid: An integer representing the spatial reference system. E.g. ``4326``.
            Default value is ``-1``, which means no/unknown reference system.
        extended: A boolean indicating whether the extended format (EWKT or EWKB)
            is used. Default is ``None``.

    NsridintextendedOptional[bool]returnNonec                0    || _         || _        || _        d S Nr   datar   )selfr   r   r   s       O/var/www/html/reinick/venv/lib/python3.11/site-packages/geoalchemy2/elements.py__init__z_SpatialElement.__init__&   s    		     strc                    | j         S r   descr   s    r   __str__z_SpatialElement.__str__+   s
    yr    c                @    d| j         j        t          |           | fz  S )Nz<%s at 0x%x; %s>)	__class____name__idr%   s    r   __repr__z_SpatialElement.__repr__.   s(    !N#tHH%
 
 	
r    boolc                    	 | j         |j         k    o| j        |j        k    o| j        |j        k    S # t          $ r Y dS w xY w)NF)r   r   r$   AttributeErrorr   others     r   __eq__z_SpatialElement.__eq__5   s^    	/ ,I+,I+
  	 	 	55	s   /2 
A A c                .    |                      |           S r   )r1   r/   s     r   __ne__z_SpatialElement.__ne__?   s    ;;u%%%%r    c                D    t          | j        | j        | j        f          S r   )hashr$   r   r   r%   s    r   __hash__z_SpatialElement.__hash__B   s    TY	4=9:::r    c                    |                                 t          vrt          t          j        |           }t          ||          S )N)expr)lowerr   r.   r   _FunctionGeneratorgetattr)r   namefunc_s      r   __getattr__z_SpatialElement.__getattr__E   sC     ::<<000  
 ,$777ud###r    Dict[str, Any]c                @    | j         t          |           | j        d}|S )Nr   )r   r!   r   r   states     r   __getstate__z_SpatialElement.__getstate__[   s(    III
 

 r    rB   c                z    |d         | _         |d         | _        |                     |d                   | _        d S )Nr   r   r   )r   r   _data_from_descr   rA   s     r   __setstate__z_SpatialElement.__setstate__c   s6    &M	j)((v77			r    c                    t                      r   )NotImplementedErrorr#   s    r   rE   z_SpatialElement._data_from_desch   s    !###r    r   N)r   r   r   r   r   r   r   r!   )r   r,   )r   r?   )rB   r?   r   r   )r)   
__module____qualname____doc__r   r&   r+   r1   r3   r6   r>   rC   rF   staticmethodrE    r    r   r   r      s        
 
! ! ! ! !
   
 
 
 
   & & & &; ; ;$ $ $,   8 8 8 8
 $ $ \$ $ $r    r   c                      e Zd ZU dZ ej        d          Z ej        d          ZdZde	d<   dZ
de	d<   dddZedd            Zed             ZddZddZd
S )
WKTElementa  Instances of this class wrap a WKT or EWKT value.

    Usage examples::

        wkt_element_1 = WKTElement('POINT(5 45)')
        wkt_element_2 = WKTElement('POINT(5 45)', srid=4326)
        wkt_element_3 = WKTElement('SRID=4326;POINT(5 45)', extended=True)
    z(SRID=([0-9]+); ?)?(.*)z0((SRID=\d+) *; *)?([\w ]+) *(\([-\d\. ,\(\)]+\))ST_GeomFromTextr!   	geom_fromST_GeomFromEWKTgeom_from_extended_versionr   Nr   r   r   r   r   r   r   c                   ||                     d          }|r|dk    r|                    d          }t          |          dk    r"t          d                    |                    |d         }	 t          |dd                    }n0# t          $ r# t          d                    |                    w xY wt                              | |||           d S )NSRID=r   ;   zinvalid EWKT string {}r      )	
startswithsplitlenr   formatr   
ValueErrorr   r   )r   r   r   r   data_sheaders         r   r   zWKTElement.__init__}   s    w//H 		K

ZZ__F6{{a#$<$C$CD$I$IJJJAYFK6!"": K K K#$<$C$CD$I$IJJJK  tT8<<<<<s   3B -B8c                    | j         S "This element's description string.r   r%   s    r   r$   zWKTElement.desc        yr    c                    | S r   rO   r#   s    r   rE   zWKTElement._data_from_desc       r    c                    | j         rM| j                            | j                  }|J t	          |                    d          | j        d          S t	          | j        | j        | j                   S )N   Fr   )r   _REMOVE_SRIDmatchr   rQ   groupr   )r   
srid_matchs     r   as_wktzWKTElement.as_wkt   sn    = 	N*00;;J)))j..q1149uMMMM$)TY>>>r    c                    | j         s/| j        dk    r$d| j         d| j        z   }t          |d          S t          | j        | j        | j                   S )Nr   rW   rX   Trk   )r   r   r   rQ   )r   r   s     r   as_ewktzWKTElement.as_ewkt   sZ    } 	3b'49'''$)3DdT2222$)TY>>>r    rI   )r   r!   r   r   r   r   r   r   rJ   )r   rQ   )r)   rK   rL   rM   recompilerl   SPLIT_WKT_PATTERNrS   __annotations__rU   r   propertyr$   rN   rE   rp   rr   rO   r    r   rQ   rQ   m   s           2:788L"
#VWW&I&&&&&77777= = = = =    X   \? ? ? ?? ? ? ? ? ?r    rQ   c                  |    e Zd ZU dZdZded<   dZded<   	 dddZedd            Z	e
dd            ZddZddZdS )
WKBElementa  Instances of this class wrap a WKB or EWKB value.

    Geometry values read from the database are converted to instances of this
    type. In most cases you won't need to create ``WKBElement`` instances
    yourself.

    If ``extended`` is ``True`` and ``srid`` is ``-1`` at construction time
    then the SRID will be read from the EWKB data.

    Note: you can create ``WKBElement`` objects from Shapely geometries
    using the :func:`geoalchemy2.shape.from_shape` function.
    ST_GeomFromWKBr!   rS   ST_GeomFromEWKBrU   r   Nr   Union[str, bytes, memoryview]r   r   r   r   r   r   c                $   |dk    s||rt          |t                    rt          j        |d d                   }n
|d d         }|d         |dd         |dd          }}}|rdnd}t	          |          d	k    r(t          t          j        ||          d                   nd}	||	sd
}n|pt          |	dz            }|r0|dk    r*t          j        ||          d         }t          |          }t          
                    | |||           d S )Nr      	   r      rZ   <I>I   F    )
isinstancer!   binascii	unhexlifyr]   r   structunpackr,   r   r   )
r   r   r   r   ra   
byte_orderwkb_typewkb_sridbyte_order_markerwkb_type_ints
             r   r   zWKBElement.__init__   s>    2::)X) $$$ " "+D"I66bqb-3AYqsVABBZ(J(2 <FI(mmWXFXFXFM"3X>>qABBB^_  # J$HH'I4y0H+I+IH %DBJJ!=):HEEaH8}}  tT8<<<<<r    c                    t          | j        t                    r| j                                        S t          t	          j        | j                  d                                          }|S )rd   utf-8encoding)r   r   r!   r9   r   hexlify)r   r$   s     r   r$   zWKBElement.desc   sZ     di%% 	%9??$$$8#DI..AAAGGIIr    bytesc                V    |                      d          } t          j        |           S )Nr   r   )encoder   r   r#   s    r   rE   zWKBElement._data_from_desc   s&    {{G{,,!$'''r    c                   | j         rt          | j        t                    r6d}t	          j        | j        d d                   }|d         |dd         }}nd}| j        d         | j        dd         }}|rdnd}t          |          d	k    r(t          t          j	        ||          d                   nd}|d
z  }|rbt	          j
        |                    d	|rdnd                    }| j        d d         |                    d          z   | j        dd          z   }nt                      }	|	                    | j        d d                    |	                    t          j        ||                     |	                    | j        dd                     t!          |	          }t#          || j        d          S t#          | j        | j                  S )NT
   r   r   rZ   Fr   r   r   l   ? littlebigrY   asciir~   r   rk   )r   r   r   r!   r   r   r]   r   r   r   r   to_bytesdecode	bytearrayextendpack
memoryviewry   r   )
r   is_hexra   r   r   r   r   wkb_type_hexr   buffers
             r   as_wkbzWKBElement.as_wkb   s   = 	?$)S)) D !+DIcrcN;;'-ay&1+H

'+y|TYqs^H
(2 <FI(mmWXFXFXFM"3X>>qABBB^_  J&L 
*'/ ))!-NXXOO    y!}|':':7'C'CCdiPRPSPSnT"dim,,,fk*;\JJKKKdim,,,!&))dDI>>>>$)TY///r    c                   | j         sN| j        dk    rBt          | j        t                    r4t          j        | j        d d                   }|d         |dd         }}n| j        d         | j        dd         }}|rdnd}t          t          |          dk    rt          j
        ||          d         nd          }|d	z  }t          | j        t                    rt          j        |                    d|rd
nd                    }t          j        | j                            d|rd
nd                    }| j        d d         |                    d          z   |                    d          z   | j        dd          z   }nt                      }	|	                    | j        d d                    |	                    t          j        ||                     |	                    t          j        || j                             |	                    | j        dd                     t#          |	          }t%          || j        d          S t%          | j        | j                  S )Nr   r   r   r   rZ   r   r   r   r   r   r   rY   r   Trk   )r   r   r   r   r!   r   r   r   r]   r   r   r   r   r   r   r   r   r   ry   )
r   ra   r   r   r   r   r   wkb_srid_hexr   r   s
             r   as_ewkbzWKBElement.as_ewkb	  sT   } $	>b$)S)) D "+DIcrcN;;'-ay&1+H

'+y|TYqs^H
(2 <ADXRSASAS/::1==YZ L I%L $)S)) *'/ ))!-NXXOO     (/I&&qj*K((eLL    IbqbM"))'223"))'223 in%  #dim,,,fk*;\JJKKKfk*;TYGGHHHdim,,,!&))dDI====$)TY///r    rI   )r   r|   r   r   r   r   r   r   rJ   )r   r   )r   ry   )r)   rK   rL   rM   rS   rv   rU   r   rw   r$   rN   rE   r   r   rO   r    r   ry   ry      s           &I%%%%&77777 _c%= %= %= %= %=N    X ( ( ( \(0 0 0 0@&0 &0 &0 &0 &0 &0r    ry   c                  X    e Zd ZU dZdZded<   dd	Zedd
            Ze	d             Z
dS )RasterElementzInstances of this class wrap a ``raster`` value.

    Raster values read from the database are converted to instances of this type. In
    most cases you won't need to create ``RasterElement`` instances yourself.
    rasterr!   rU   r   r|   r   r   c                   	 t          j        |d d                   }nG# t          $ r: |}t          t          j        |                              d                    }Y nw xY w|d         }|dd         }t          j        |rdnd|          d         }t          	                    | |t          |          d	           d S )
Nr   r   r   r   5   9   r   r   T)r   r   BinasciiErrorr!   r   r   r   r   r   r   r   )r   r   bin_datar   r   s        r   r   zRasterElement.__init__;  s    
	H)$tt*55HH 	H 	H 	HHx'--44g4FFGGDDD	H a[
2}Z9TTT4@@C  tSYY=====s    AA#"A#c                    | j         S rc   re   r%   s    r   r$   zRasterElement.descJ  rf   r    c                    | S r   rO   r#   s    r   rE   zRasterElement._data_from_descO  rh   r    N)r   r|   r   r   rJ   )r)   rK   rL   rM   rU   rv   r   rw   r$   rN   rE   rO   r    r   r   r   2  s           '/....> > > >    X   \  r    r   c                  6     e Zd ZU dZdZded<   	 d fdZ xZS )	CompositeElementz7Instances of this class wrap a Postgres composite type.Fr,   inherit_cacher   r   c                    || _         t          |          | _        t          t          |                               |           d S r   )r<   r   typesuperr   r   )r   basefieldtype_r(   s       r   r   zCompositeElement.__init__Z  s>    	&&	%%..t44444r    )r   r   )r)   rK   rL   rM   r   rv   r   __classcell__)r(   s   @r   r   r   T  sY         AAM/5 5 5 5 5 5 5 5 5 5r    r   r   r!   c                >    d |j         | j        fi |d| j        S )N(z).)processclausesr<   )r8   compilerkws      r   _compile_pgelemr   a  s0     ((<<<<<<diiHHr    )r   r   r   ry   rQ   	List[str]__all__c                     t           S r   )r   rO   r    r   __dir__r   o  s    Nr    rJ   )r   r   )#
__future__r   r   rs   r   typingr   r   r   r   r   r	   sqlalchemy.ext.compilerr
   sqlalchemy.sqlr   sqlalchemy.sql.functionsr   sqlalchemy.typesr   geoalchemy2.excr   Errorr   setr   rv   r   rQ   ry   r   r   r   r   r   rO   r    r   <module>r      sq   " " " " " " "  				                                      , , , , , , $ $ $ $ $ $ 4 4 4 4 4 4 ( ( ( ( ( ( ) ) ) ) ) )!cee  # # # #Q$ Q$ Q$ Q$ Q$ Q$ Q$ Q$h3? 3? 3? 3? 3? 3? 3? 3?lL0 L0 L0 L0 L0 L0 L0 L0^    O   D
5 
5 
5 
5 
5 
5 
5 
5 

I I I I           r    