U
    dt                     @   sp   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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geos_version_tuple)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
   	TypeErrorZ_ptr_z)selfptrz r   D/tmp/pip-unpacked-wheel-7vj2equ7/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   s   | 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rF| jrFd}| j}n
d}| j	}t
||krdt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   Zndarrayr   dimsr   _set_point_3d_set_point_2dlenr    )r   r#   valueZn_argsZ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    E   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   Zdimr   r   r   	_checkdimJ   s    zGEOSCoordSeq._checkdimc                 C   s   t | j|tt S N)capiZcs_getxr   r   r   r"   r   r   r   _get_xO   s    zGEOSCoordSeq._get_xc                 C   s   t | j|tt S r0   )r1   Zcs_getyr   r   r   r"   r   r   r   _get_yR   s    zGEOSCoordSeq._get_yc                 C   s   t | j|tt S r0   )r1   Zcs_getzr   r   r   r"   r   r   r   _get_zU   s    zGEOSCoordSeq._get_zc                 C   s   t | j|| d S r0   )r1   Zcs_setxr   r   r#   r,   r   r   r   _set_xX   s    zGEOSCoordSeq._set_xc                 C   s   t | j|| d S r0   )r1   Zcs_setyr   r5   r   r   r   _set_y[   s    zGEOSCoordSeq._set_yc                 C   s   t | j|| d S r0   )r1   Zcs_setzr   r5   r   r   r   _set_z^   s    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!   a   s    zGEOSCoordSeq._point_getterc                 C   s   |  || |fS r0   )r2   r3   r"   r   r   r   r:   e   s    zGEOSCoordSeq._get_point_2dc                 C   s   |  || || |fS r0   )r2   r3   r4   r"   r   r   r   r9   h   s    zGEOSCoordSeq._get_point_3dc                 C   s$   |\}}|  || | || d S r0   )r6   r7   )r   r#   r,   xyr   r   r   r*   k   s    zGEOSCoordSeq._set_point_2dc                 C   s2   |\}}}|  || | || | || d S r0   )r6   r7   r8   )r   r#   r,   r;   r<   r   r   r   r   r)   p   s    
zGEOSCoordSeq._set_point_3dc                 C   s,   |  | | | t| j||tt S )z3Return the value for the given dimension and index.)r    r/   r1   Zcs_getordinater   r   r   )r   	dimensionr#   r   r   r   getOrdinatew   s    

zGEOSCoordSeq.getOrdinatec                 C   s*   |  | | | t| j||| dS )z0Set the value for the given dimension and index.N)r    r/   r1   Zcs_setordinater   )r   r=   r#   r,   r   r   r   setOrdinate}   s    

zGEOSCoordSeq.setOrdinatec                 C   s   |  d|S )zGet the X value at the index.r   r>   r"   r   r   r   getX   s    zGEOSCoordSeq.getXc                 C   s   |  d|| dS )z(Set X with the value at the given index.r   Nr?   r5   r   r   r   setX   s    zGEOSCoordSeq.setXc                 C   s   |  d|S )z#Get the Y value at the given index.   r@   r"   r   r   r   getY   s    zGEOSCoordSeq.getYc                 C   s   |  d|| dS )z(Set Y with the value at the given index.rD   NrB   r5   r   r   r   setY   s    zGEOSCoordSeq.setYc                 C   s   |  d|S )z(Get Z with the value at the given index.r&   r@   r"   r   r   r   getZ   s    zGEOSCoordSeq.getZc                 C   s   |  d|| dS )z(Set Z with the value at the given index.r&   NrB   r5   r   r   r   setZ   s    zGEOSCoordSeq.setZc                 C   s   t | jtt S )z,Return the size of this coordinate sequence.)r1   Z
cs_getsizer   r   r   r   r   r   r   r      s    zGEOSCoordSeq.sizec                 C   s   t | jtt S )z2Return the dimensions of this coordinate sequence.)r1   Z
cs_getdimsr   r   r   r   r   r   r   r(      s    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   r1   Zcs_cloner   rI   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 r0   r   .0r   r   substrr   r   	<genexpr>   s     z#GEOSCoordSeq.kml.<locals>.<genexpr>)rI   joinr   r+   stripr   r   rN   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.rD   r   c                 3   s   | ]} |V  qd S r0   r   rL   Z	get_pointr   r   rP      s     z%GEOSCoordSeq.tuple.<locals>.<genexpr>)r   r!   r   r   )r   nr   rT   r   r      s
    zGEOSCoordSeq.tuplec                 C   s   t  dk rpd}t| }t|D ]H}|d | }|| | d | | d  7 }|| | d | | d  8 }q|dkS t }t| jt|stdtjj	 |j
dkS )z<Return whether this coordinate sequence is counterclockwise.)r%      g        rD   r   z*Error encountered in GEOS C function "%s".)r   r+   r   r   r1   Z	cs_is_ccwr   r   r	   	func_namer,   )r   arearU   r   jretr   r   r   is_counterclockwise   s    

z GEOSCoordSeq.is_counterclockwiseN)F))__name__
__module____qualname____doc__r
   Zptr_typer   r   r   r   r$   r-   r    r/   r2   r3   r4   r6   r7   r8   propertyr!   r:   r9   r*   r)   r>   r?   rA   rC   rE   rF   rG   rH   r   r(   rI   rJ   rS   r   r[   r   r   r   r   r      sV   






r   N)r_   ctypesr   r   r   r   Zdjango.contrib.gis.geosr   r1   Zdjango.contrib.gis.geos.baser   Zdjango.contrib.gis.geos.errorr	   Zdjango.contrib.gis.geos.libgeosr
   r   Zdjango.contrib.gis.shortcutsr   r   r   r   r   r   <module>   s   