o
    <g                     @   sl   d Z ddlmZmZ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 G dd	 d	e
Zd
S )z
 This module houses the GEOSCoordSeq object, which is used internally
 by GEOSGeometry to house the actual coordinates of the Point,
 LineString, and LinearRing geometries.
    )byrefc_bytec_doublec_uint)
prototypes)GEOSBaseGEOSException)CS_PTR)numpyc                   @   sB  e Zd ZdZeZdHddZdd Zdd Zd	d
 Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zedd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Z d7d8 Z!ed9d: Z"ed;d< Z#ed=d> Z$d?d@ Z%edAdB Z&edCdD Z'edEdF Z(dGS )IGEOSCoordSeqzGThe internal representation of a list of coordinates inside a Geometry.Fc                 C   s"   t |ts	td|| _|| _dS )zInitialize from a GEOS pointer.z4Coordinate sequence should initialize with a CS_PTR.N)
isinstancer
   	TypeError_ptr_z)selfptrz r   S/var/www/html/venv/lib/python3.10/site-packages/django/contrib/gis/geos/coordseq.py__init__   s   

zGEOSCoordSeq.__init__c                 c   s     t | jD ]}| | V  qdS )z3Iterate over each point in the coordinate sequence.N)rangesize)r   ir   r   r   __iter__   s   zGEOSCoordSeq.__iter__c                 C      | j S )z7Return the number of points in the coordinate sequence.)r   r   r   r   r   __len__!   s   zGEOSCoordSeq.__len__c                 C   s
   t | jS )z<Return the string representation of the coordinate sequence.)strtupler   r   r   r   __str__%   s   
zGEOSCoordSeq.__str__c                 C   s   |  | | |S )z8Return the coordinate sequence value at the given index.)_checkindex_point_getterr   indexr   r   r   __getitem__)   s   

zGEOSCoordSeq.__getitem__c                 C   s|   t |ttfrntrt |tjrntd| jdkr#| jr#d}| j}nd}| j	}t
||kr2td| | ||| dS )z5Set the coordinate sequence value at the given index.zBMust set coordinate with a sequence (list, tuple, or numpy array).      z"Dimension of value does not match.N)r   listr   r   ndarrayr   dimsr   _set_point_3d_set_point_2dlenr!   )r   r$   valuen_argspoint_setterr   r   r   __setitem__.   s    
zGEOSCoordSeq.__setitem__c                 C   s(   d|  kr| j k sn td| dS )zCheck the given index.r   zinvalid GEOS Geometry index: %sN)r   
IndexErrorr#   r   r   r   r!   F   s   zGEOSCoordSeq._checkindexc                 C   s    |dk s|dkrt d| dS )zCheck the given dimension.r   r'   zinvalid ordinate dimension "%d"Nr   )r   dimr   r   r   	_checkdimK   s   zGEOSCoordSeq._checkdimc                 C      t | j|tt S N)capics_getxr   r   r   r#   r   r   r   _get_xP      zGEOSCoordSeq._get_xc                 C   r5   r6   )r7   cs_getyr   r   r   r#   r   r   r   _get_yS   r:   zGEOSCoordSeq._get_yc                 C   r5   r6   )r7   cs_getzr   r   r   r#   r   r   r   _get_zV   r:   zGEOSCoordSeq._get_zc                 C      t | j|| d S r6   )r7   cs_setxr   r   r$   r.   r   r   r   _set_xY      zGEOSCoordSeq._set_xc                 C   r?   r6   )r7   cs_setyr   rA   r   r   r   _set_y\   rC   zGEOSCoordSeq._set_yc                 C   r?   r6   )r7   cs_setzr   rA   r   r   r   _set_z_   rC   zGEOSCoordSeq._set_zc                 C   s   | j dkr| jr| jS | jS )Nr&   )r*   r   _get_point_3d_get_point_2dr   r   r   r   r"   b   s   zGEOSCoordSeq._point_getterc                 C   s   |  || |fS r6   )r9   r<   r#   r   r   r   rI   f   rC   zGEOSCoordSeq._get_point_2dc                 C   s   |  || || |fS r6   )r9   r<   r>   r#   r   r   r   rH   i   s   zGEOSCoordSeq._get_point_3dc                 C   s$   |\}}|  || | || d S r6   )rB   rE   )r   r$   r.   xyr   r   r   r,   l   s   zGEOSCoordSeq._set_point_2dc                 C   s2   |\}}}|  || | || | || d S r6   )rB   rE   rG   )r   r$   r.   rJ   rK   r   r   r   r   r+   q   s   
zGEOSCoordSeq._set_point_3dc                 C   s,   |  | | | t| j||tt S )z3Return the value for the given dimension and index.)r!   r4   r7   cs_getordinater   r   r   )r   	dimensionr$   r   r   r   getOrdinatex   s   

zGEOSCoordSeq.getOrdinatec                 C   s*   |  | | | t| j||| dS )z0Set the value for the given dimension and index.N)r!   r4   r7   cs_setordinater   )r   rM   r$   r.   r   r   r   setOrdinate~   s   

zGEOSCoordSeq.setOrdinatec                 C      |  d|S )zGet the X value at the index.r   rN   r#   r   r   r   getX      zGEOSCoordSeq.getXc                 C      |  d|| dS )z(Set X with the value at the given index.r   NrP   rA   r   r   r   setX      zGEOSCoordSeq.setXc                 C   rQ   )z#Get the Y value at the given index.   rR   r#   r   r   r   getY   rT   zGEOSCoordSeq.getYc                 C   rU   )z(Set Y with the value at the given index.rY   NrV   rA   r   r   r   setY   rX   zGEOSCoordSeq.setYc                 C   rQ   )z(Get Z with the value at the given index.r'   rR   r#   r   r   r   getZ   rT   zGEOSCoordSeq.getZc                 C   rU   )z(Set Z with the value at the given index.r'   NrV   rA   r   r   r   setZ   rX   zGEOSCoordSeq.setZc                 C      t | jtt S )z,Return the size of this coordinate sequence.)r7   
cs_getsizer   r   r   r   r   r   r   r         zGEOSCoordSeq.sizec                 C   r^   )z2Return the dimensions of this coordinate sequence.)r7   
cs_getdimsr   r   r   r   r   r   r   r*      r`   zGEOSCoordSeq.dimsc                 C   r   )z
        Return whether this coordinate sequence is 3D. This property value is
        inherited from the parent Geometry.
        )r   r   r   r   r   hasz   s   zGEOSCoordSeq.haszc                 C   s   t t| j| jS )zClone this coordinate sequence.)r   r7   cs_cloner   rb   r   r   r   r   clone   s   zGEOSCoordSeq.clonec                    s:    j rdnddd fddtt D   S )z2Return the KML representation for the coordinates.z	%s,%s,%s z%s,%s,0 z<coordinates>%s</coordinates> c                 3   s    | ]	} |  V  qd S r6   r   .0r   r   substrr   r   	<genexpr>   s    z#GEOSCoordSeq.kml.<locals>.<genexpr>)rb   joinr   r-   stripr   r   rh   r   kml   s   $zGEOSCoordSeq.kmlc                    s6   | j }| j |dkr dS t fddt|D S )z3Return a tuple version of this coordinate sequence.rY   r   c                 3   s    | ]} |V  qd S r6   r   rf   	get_pointr   r   rj      s    z%GEOSCoordSeq.tuple.<locals>.<genexpr>)r   r"   r   r   )r   nr   rn   r   r      s
   zGEOSCoordSeq.tuplec                 C   s2   t  }t| jt|stdtjj |jdkS )z<Return whether this coordinate sequence is counterclockwise.z*Error encountered in GEOS C function "%s".rY   )r   r7   	cs_is_ccwr   r   r	   	func_namer.   )r   retr   r   r   is_counterclockwise   s   

z GEOSCoordSeq.is_counterclockwiseN)F))__name__
__module____qualname____doc__r
   ptr_typer   r   r   r    r%   r1   r!   r4   r9   r<   r>   rB   rE   rG   propertyr"   rI   rH   r,   r+   rN   rP   rS   rW   rZ   r[   r\   r]   r   r*   rb   rd   rm   r   rt   r   r   r   r   r      sX    






r   N)rx   ctypesr   r   r   r   django.contrib.gis.geosr   r7   django.contrib.gis.geos.baser   django.contrib.gis.geos.errorr	   django.contrib.gis.geos.libgeosr
   django.contrib.gis.shortcutsr   r   r   r   r   r   <module>   s    