3
(h                 @   sp   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 G dd	 d	eZd
S )    )byrefc_uint)
prototypes)GEOSGeometry)GEOM_PTRget_pointer_arr)
LinearRing)six)rangec                   s   e Zd ZdZ fddZdd Zdd Zedd	 Zd
d Z	dd Z
d!ddZdd Zdd Zdd ZejZejZedd Zdd Zdd ZeeeZeZedd ZeZedd  Z  ZS )"Polygon   c                s   |s$t t| j| jddf| dS |d }|dd }t|}|dkrt|d ttfrt|d dkrtf }d}n"t|d d tr|d }t|}| j|d |f| }t t| j|f| dS )a  
        Initializes on an exterior ring and a sequence of holes (both
        instances may be either LinearRing instances, or a tuple/list
        that may be constructed into a LinearRing).

        Examples of initialization, where shell, hole1, and hole2 are
        valid LinearRing geometries:
        >>> from django.contrib.gis.geos import LinearRing, Polygon
        >>> shell = hole1 = hole2 = LinearRing()
        >>> poly = Polygon(shell, hole1, hole2)
        >>> poly = Polygon(shell, (hole1, hole2))

        >>> # Example where a tuple parameters are used:
        >>> poly = Polygon(((0, 0), (0, 10), (10, 10), (0, 10), (0, 0)),
        ...                ((4, 4), (4, 6), (6, 6), (6, 4), (4, 4)))
        r   Nr   )	superr   __init___create_polygonlen
isinstancetuplelistr   )selfargskwargsZext_ringZ
init_holesn_holesZpolygon)	__class__ C/tmp/pip-install-q3hcpn_q/Django/django/contrib/gis/geos/polygon.pyr      s    zPolygon.__init__c             c   s$   xt t| D ]}| | V  qW dS )z'Iterates over each ring in the polygon.N)r
   r   )r   ir   r   r   __iter__4   s    zPolygon.__iter__c             C   s
   | j d S )z,Returns the number of rings in this Polygon.r   )num_interior_rings)r   r   r   r   __len__9   s    zPolygon.__len__c             C   sr   |\}}}}x>|D ]6}t |tjtf std||||||||||f
 S qW t||f||f||f||f||ffS )z3Constructs a Polygon from a bounding box (4-tuple).z,POLYGON((%s %s, %s %s, %s %s, %s %s, %s %s)))r   r	   integer_typesfloatr   r   )clsZbboxZx0Zy0x1y1zr   r   r   	from_bbox=   s    
 zPolygon.from_bboxc       
      C   s   |st j S g }x2|D ]*}t|tr0|j| q|j| j| qW | j|jd}|d }|rt|}x0t	|D ]\}}| j|||< t
|}	qrW nd }	t j||	t|S )Nr   r   )capiZcreate_empty_polygonr   r   append_construct_ring_clonepopr   	enumerater   Zcreate_polygonr   )
r   lengthitemsZringsrshellr   Zholesr   Zholes_paramr   r   r   r   H   s     

zPolygon._create_polygonc             C   s$   t |trtj|S tj|jS d S )N)r   r   r&   
geom_cloneptr)r   gr   r   r   r)   d   s    

zPolygon._cloneYParameter must be a sequence of LinearRings or objects that can initialize to LinearRingsc             C   s<   t |tr|S yt|}|S  tk
r6   t|Y nX dS )zGHelper routine for trying to construct a ring from the given parameter.N)r   r   	TypeError)r   parammsgringr   r   r   r(   j   s    
zPolygon._construct_ringc             C   s2   | j }| j}| j||| _ |r$|| _tj| d S )N)r1   sridr   r&   Zdestroy_geom)r   r,   r-   Zprev_ptrr8   r   r   r   	_set_listu   s    zPolygon._set_listc             C   s*   |dkrt j| jS t j| j|d S dS )aN  
        Returns the ring at the specified index.  The first index, 0, will
        always return the exterior ring.  Indices > 0 will return the
        interior ring at the given index (e.g., poly[1] and poly[2] would
        return the first and second interior ring, respectively).

        CAREFUL: Internal/External are not the same as Interior/Exterior!
        _get_single_internal returns a pointer from the existing geometries for use
        internally by the object's methods.  _get_single_external returns a clone
        of the same geometry for use by external code.
        r   r   N)r&   Zget_extringr1   Zget_intring)r   indexr   r   r   _get_single_internal   s    zPolygon._get_single_internalc             C   s   t tj| j|| jdS )N)r8   )r   r&   r0   r;   r8   )r   r:   r   r   r   _get_single_external   s    zPolygon._get_single_externalc             C   s   t j| jS )z%Returns the number of interior rings.)r&   Z
get_nringsr1   )r   r   r   r   r      s    zPolygon.num_interior_ringsc             C   s   | d S )z&Gets the exterior ring of the Polygon.r   r   )r   r   r   r   _get_ext_ring   s    zPolygon._get_ext_ringc             C   s   || d< dS )z&Sets the exterior ring of the Polygon.r   Nr   )r   r7   r   r   r   _set_ext_ring   s    zPolygon._set_ext_ringc                s   t  fddtt D S )z-Gets the tuple for each ring in this Polygon.c             3   s   | ]} | j V  qd S )N)r   ).0r   )r   r   r   	<genexpr>   s    z Polygon.tuple.<locals>.<genexpr>)r   r
   r   )r   r   )r   r   r      s    zPolygon.tuplec                s0   dj  fddt jD }d d j|f S )z/Returns the KML representation of this Polygon. c             3   s    | ]}d  |d  j  V  qdS )z%<innerBoundaryIs>%s</innerBoundaryIs>r   N)kml)r?   r   )r   r   r   r@      s   zPolygon.kml.<locals>.<genexpr>z:<Polygon><outerBoundaryIs>%s</outerBoundaryIs>%s</Polygon>r   )joinr
   r   rB   )r   Z	inner_kmlr   )r   r   rB      s    
zPolygon.kml)r3   )__name__
__module____qualname__Z
_minlengthr   r   r   classmethodr%   r   r)   r(   r9   r;   r<   r   Z_set_single_rebuildZ_set_singleZ_assign_extended_slice_rebuildZ_assign_extended_slicepropertyr   r=   r>   Zexterior_ringr/   r   ZcoordsrB   __classcell__r   r   )r   r   r      s*   &



r   N)ctypesr   r   Zdjango.contrib.gis.geosr   r&   Z django.contrib.gis.geos.geometryr   Zdjango.contrib.gis.geos.libgeosr   r   Z"django.contrib.gis.geos.linestringr   Zdjango.utilsr	   Zdjango.utils.six.movesr
   r   r   r   r   r   <module>   s   