B
    ¥0H[#  ã               @   sT   d dl mZ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 )	é    )ÚbyrefÚc_uint)Ú
prototypes)ÚGEOSGeometry)ÚGEOM_PTR)Ú
LinearRingc                   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 ƒ j|  dd¡f|Ž dS |d }|dd… }t|ƒ}|dkr’t|d ttfƒr’t|d ƒdkrpd}d}n"t|d d tƒr’|d }t|ƒ}|  |d |f| ¡}t ƒ j|f|Ž dS )aÓ  
        Initialize 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	   © )ÚsuperÚ__init__Ú_create_polygonÚlenÚ
isinstanceÚtupleÚlistr   )ÚselfÚargsÚkwargsZext_ringZ
init_holesÚn_holesZpolygon)Ú	__class__r
   úcC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\contrib\gis\geos\polygon.pyr      s    zPolygon.__init__c             c   s$   xt t| ƒƒD ]}| | V  qW dS )z&Iterate over each ring in the polygon.N)Úranger   )r   Úir
   r
   r   Ú__iter__2   s    zPolygon.__iter__c             C   s
   | j d S )z+Return the number of rings in this Polygon.r	   )Únum_interior_rings)r   r
   r
   r   Ú__len__7   s    zPolygon.__len__c             C   sn   |\}}}}x:|D ]2}t |ttfƒstd||||||||||f
 ƒS qW t||f||f||f||f||ffƒS )z2Construct a Polygon from a bounding box (4-tuple).z,POLYGON((%s %s, %s %s, %s %s, %s %s, %s %s)))r   ÚfloatÚintr   r   )ÚclsZbboxZx0Zy0Úx1Úy1Úzr
   r
   r   Ú	from_bbox;   s    
 zPolygon.from_bboxc       	         sš   |st  ¡ S g }x2|D ]*}t|tƒr0| |¡ q| ˆ  |¡¡ qW ˆ  | d¡¡}|d }|r„t| ‡ fdd„|D ƒŽ }t|ƒ}nd }t  	||t
|ƒ¡S )Nr   r	   c                s   g | ]}ˆ   |¡‘qS r
   )Ú_clone)Ú.0Úr)r   r
   r   ú
<listcomp>Y   s    z+Polygon._create_polygon.<locals>.<listcomp>)ÚcapiZcreate_empty_polygonr   r   ÚappendÚ_construct_ringr$   Úpopr   Zcreate_polygonr   )	r   ÚlengthÚitemsZringsr&   Úshellr   ZholesZholes_paramr
   )r   r   r   F   s    


zPolygon._create_polygonc             C   s$   t |tƒrt |¡S t |j¡S d S )N)r   r   r(   Ú
geom_cloneÚptr)r   Úgr
   r
   r   r$   `   s    

zPolygon._cloneúYParameter 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 )z1Try to construct a ring from the given parameter.N)r   r   Ú	TypeError)r   ÚparamÚmsgÚringr
   r
   r   r*   f   s    
zPolygon._construct_ringc             C   s2   | j }| j}|  ||¡| _ |r$|| _t |¡ d S )N)r0   Úsridr   r(   Zdestroy_geom)r   r,   r-   Zprev_ptrr7   r
   r
   r   Ú	_set_listq   s    zPolygon._set_listc             C   s*   |dkrt  | j¡S t  | j|d ¡S dS )a7  
        Return 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!
        Return 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_extringr0   Zget_intring)r   Úindexr
   r
   r   Ú_get_single_internal{   s    zPolygon._get_single_internalc             C   s   t t |  |¡¡| jd�S )N)r7   )r   r(   r/   r:   r7   )r   r9   r
   r
   r   Ú_get_single_external�   s    zPolygon._get_single_externalc             C   s   t  | j¡S )z$Return the number of interior rings.)r(   Z
get_nringsr0   )r   r
   r
   r   r   ”   s    zPolygon.num_interior_ringsc             C   s   | d S )z%Get 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%Set the exterior ring of the Polygon.r   Nr
   )r   r6   r
   r
   r   Ú_set_ext_ringž   s    zPolygon._set_ext_ringc                s   t ‡ fdd„ttˆ ƒƒD ƒƒS )z,Get the tuple for each ring in this Polygon.c             3   s   | ]}ˆ | j V  qd S )N)r   )r%   r   )r   r
   r   ú	<genexpr>©   s    z Polygon.tuple.<locals>.<genexpr>)r   r   r   )r   r
   )r   r   r   ¦   s    zPolygon.tuplec                s0   d  ‡ fdd„tˆ jƒD ƒ¡}dˆ d j|f S )z.Return 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   r@   )r   Z	inner_kmlr
   )r   r   r@   ¬   s    
zPolygon.kml)r2   )Ú__name__Ú
__module__Ú__qualname__Z
_minlengthr   r   r   Úclassmethodr#   r   r$   r*   r8   r:   r;   r   Z_set_single_rebuildZ_set_singleZ_assign_extended_slice_rebuildZ_assign_extended_sliceÚpropertyr   r<   r=   Zexterior_ringr.   r   Zcoordsr@   Ú__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   Z"django.contrib.gis.geos.linestringr   r   r
   r
   r
   r   Ú<module>   s
   