o
    uvXj  ã                   @   sh   d Z ddl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_doubleÚc_uint)Ú
prototypes)ÚGEOSBase©ÚGEOSException)ÚCS_PTR)Únumpyc                   @   s6  e Zd ZdZeZdFd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'dES )GÚ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   ú]/var/www/html/myproject/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   ó
   t | jƒS )z7Return the number of points in the coordinate sequence.)Úintr   ©r   r   r   r   Ú__len__    ó   
zGEOSCoordSeq.__len__c                 C   r   )z<Return the string representation of the coordinate sequence.)ÚstrÚtupler   r   r   r   Ú__str__$   r   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"   C   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   Ú	_checkdimH   s   ÿzGEOSCoordSeq._checkdimc                 C   ó   t  | j|ttƒ ƒ¡S ©N)ÚcapiÚcs_getxr   r   r   r$   r   r   r   Ú_get_xM   ó   zGEOSCoordSeq._get_xc                 C   r6   r7   )r8   Úcs_getyr   r   r   r$   r   r   r   Ú_get_yP   r;   zGEOSCoordSeq._get_yc                 C   r6   r7   )r8   Úcs_getzr   r   r   r$   r   r   r   Ú_get_zS   r;   zGEOSCoordSeq._get_zc                 C   ó   t  | j||¡ d S r7   )r8   Úcs_setxr   ©r   r%   r/   r   r   r   Ú_set_xV   ó   zGEOSCoordSeq._set_xc                 C   r@   r7   )r8   Úcs_setyr   rB   r   r   r   Ú_set_yY   rD   zGEOSCoordSeq._set_yc                 C   r@   r7   )r8   Úcs_setzr   rB   r   r   r   Ú_set_z\   rD   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#   _   s   zGEOSCoordSeq._point_getterc                 C   s   |   |¡|  |¡fS r7   )r:   r=   r$   r   r   r   rJ   c   rD   zGEOSCoordSeq._get_point_2dc                 C   s   |   |¡|  |¡|  |¡fS r7   )r:   r=   r?   r$   r   r   r   rI   f   s   zGEOSCoordSeq._get_point_3dc                 C   s$   |\}}|   ||¡ |  ||¡ d S r7   )rC   rF   )r   r%   r/   ÚxÚyr   r   r   r-   i   s   zGEOSCoordSeq._set_point_2dc                 C   s2   |\}}}|   ||¡ |  ||¡ |  ||¡ d S r7   )rC   rF   rH   )r   r%   r/   rK   rL   r   r   r   r   r,   n   s   
zGEOSCoordSeq._set_point_3dc                 C   s,   |   |¡ |  |¡ t | j||ttƒ ƒ¡S )z3Return the value for the given dimension and index.)r"   r5   r8   Úcs_getordinater   r   r   )r   Ú	dimensionr%   r   r   r   ÚgetOrdinateu   s   

zGEOSCoordSeq.getOrdinatec                 C   s*   |   |¡ |  |¡ t | j|||¡ dS )z0Set the value for the given dimension and index.N)r"   r5   r8   Úcs_setordinater   )r   rN   r%   r/   r   r   r   ÚsetOrdinate{   s   

zGEOSCoordSeq.setOrdinatec                 C   ó   |   d|¡S )zGet the X value at the index.r   ©rO   r$   r   r   r   ÚgetX�   ó   zGEOSCoordSeq.getXc                 C   ó   |   d||¡ dS )z(Set X with the value at the given index.r   N©rQ   rB   r   r   r   ÚsetX…   ó   zGEOSCoordSeq.setXc                 C   rR   )z#Get the Y value at the given index.é   rS   r$   r   r   r   ÚgetY‰   rU   zGEOSCoordSeq.getYc                 C   rV   )z(Set Y with the value at the given index.rZ   NrW   rB   r   r   r   ÚsetY�   rY   zGEOSCoordSeq.setYc                 C   rR   )z(Get Z with the value at the given index.r(   rS   r$   r   r   r   ÚgetZ‘   rU   zGEOSCoordSeq.getZc                 C   rV   )z(Set Z with the value at the given index.r(   NrW   rB   r   r   r   ÚsetZ•   rY   zGEOSCoordSeq.setZc                 C   ó   t  | jttƒ ƒ¡S )z,Return the size of this coordinate sequence.)r8   Ú
cs_getsizer   r   r   r   r   r   r   r   š   ó   zGEOSCoordSeq.sizec                 C   r_   )z2Return the dimensions of this coordinate sequence.)r8   Ú
cs_getdimsr   r   r   r   r   r   r   r+   Ÿ   ra   zGEOSCoordSeq.dimsc                 C   s   | j S )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   r8   Úcs_cloner   rc   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 r7   r   ©Ú.0r   ©r   Úsubstrr   r   Ú	<genexpr>»   s   € z#GEOSCoordSeq.kml.<locals>.<genexpr>)rc   Újoinr   r.   Ústripr   r   ri   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.rZ   r   c                 3   s   � | ]}ˆ |ƒV  qd S r7   r   rg   ©Ú	get_pointr   r   rk   Ä   s   € z%GEOSCoordSeq.tuple.<locals>.<genexpr>)r   r#   r    r   )r   Únr   ro   r   r    ½   s
   zGEOSCoordSeq.tupleN)F)(Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   Úptr_typer   r   r   r!   r&   r2   r"   r5   r:   r=   r?   rC   rF   rH   Úpropertyr#   rJ   rI   r-   r,   rO   rQ   rT   rX   r[   r\   r]   r^   r   r+   rc   re   rn   r    r   r   r   r   r      sT    





r   N)ru   Úctypesr   r   r   Údjango.contrib.gis.geosr   r8   Ú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    