a
    J5d(                     @   s   d Z ddlZddlZ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 dd	gZd
d ZG dd	 d	eZeejjd< G dd dZG dd de
Zeejjd< dddZdS )z*Polygons and their linear ring components
    N)is_ccw_implsigned_area)TopologicalError)BaseGeometry)
LineString)PointPolygon
LinearRingc                 C   s8   t | }t |}t t |}|r4t ||}|S N)shapelyZfrom_wkbZget_sridlinearringsZget_coordinatesZset_srid)ZwkbZ
linestringZsridZ
linearring r   T/var/www/html/django/DPS/env/lib/python3.9/site-packages/shapely/geometry/polygon.py_unpickle_linearring   s    

r   c                   @   sJ   e Zd ZdZg ZdddZedd Zdd Zed	d
 Z	edd Z
dS )r	   a  
    A geometry type composed of one or more line segments
    that forms a closed loop.

    A LinearRing is a closed, one-dimensional feature.
    A LinearRing that crosses itself or touches itself at a single point is
    invalid and operations on it may fail.

    Parameters
    ----------
    coordinates : sequence
        A sequence of (x, y [,z]) numeric coordinate pairs or triples, or
        an array-like with shape (N, 2) or (N, 3).
        Also can be a sequence of Point objects.

    Notes
    -----
    Rings are automatically closed. There is no need to specify a final
    coordinate pair identical to the first.

    Examples
    --------
    Construct a square ring.

    >>> ring = LinearRing( ((0, 0), (0, 1), (1 ,1 ), (1 , 0)) )
    >>> ring.is_closed
    True
    >>> list(ring.coords)
    [(0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
    >>> ring.length
    4.0

    Nc                    s   |d u rt dS t|trDt|tkr,|S |js<tdq|j}njt	|drXt
|}t|t
jrvt
|jt
jrvn8dd  t
 fdd|D }t
|jt
jstdt|d	krt dS t |}t|tstd
|S )NzLINEARRING EMPTYz"An input LineString must be valid.Z	__array__c                 S   s&   t | tr| jd S dd | D S d S )Nr   c                 S   s   g | ]}t |qS r   )float.0cr   r   r   
<listcomp>[       z7LinearRing.__new__.<locals>._coords.<locals>.<listcomp>)
isinstancer   coords)or   r   r   _coordsW   s    

z#LinearRing.__new__.<locals>._coordsc                    s   g | ]} |qS r   r   )r   r   r   r   r   r   ]   r   z&LinearRing.__new__.<locals>.<listcomp>z&Inconsistent coordinate dimensionalityr   z/Invalid values passed to LinearRing constructor)r   from_wktr   r   typer	   is_validr   r   hasattrnpZasarrayZndarrayZ
issubdtypeZdtypenumberarray
ValueErrorlenr   )selfcoordinatesgeomr   r   r   __new__>   s0    







zLinearRing.__new__c                 C   s   dt | jdS )Nr	   r   r%   )tupler   r$   r   r   r   __geo_interface__m   s    zLinearRing.__geo_interface__c                 C   s   t tj| ddffS )zWKB doesn't differentiate between LineString and LinearRing so we
        need to move the coordinate sequence into the correct geometry typeT)Zinclude_srid)r   r   Zto_wkbr*   r   r   r   
__reduce__q   s    zLinearRing.__reduce__c                 C   s   t t | S )z/True is the ring is oriented counter clock-wise)boolr   r*   r   r   r   is_ccwv   s    zLinearRing.is_ccwc                 C   s   t t| S )zsTrue if the geometry is simple, meaning that any self-intersections
        are only at boundary points, else False)r-   r   	is_simpler*   r   r   r   r/   {   s    zLinearRing.is_simple)N)__name__
__module____qualname____doc__	__slots__r'   propertyr+   r,   r.   r/   r   r   r   r   r	      s   "
/

   c                   @   sL   e Zd ZdZdZdZdZdd Zdd Zdd Z	d	d
 Z
dd Zdd ZdS )InteriorRingSequenceNr   c                 C   s   || _ |j| _d S r
   )_parent_ndim)r$   parentr   r   r   __init__   s    zInteriorRingSequence.__init__c                 C   s   d| _ |  | _| S )Nr   )_index__len___lengthr*   r   r   r   __iter__   s    
zInteriorRingSequence.__iter__c                 C   s2   | j | jk r*| | j }|  j d7  _ |S td S )N   )r<   r>   	_get_ringStopIteration)r$   ringr   r   r   __next__   s
    zInteriorRingSequence.__next__c                 C   s   t | jS r
   )r   Zget_num_interior_ringsr8   r*   r   r   r   r=      s    zInteriorRingSequence.__len__c                 C   s   |   }t|trN|| dk s&||kr.td|dk r@|| }n|}| |S t|trg }||\}}}t|||D ]}|| | qx|S t	dd S )Nr   zindex out of rangezkey must be an index or slice)
r=   r   int
IndexErrorrA   sliceindicesrangeappend	TypeError)r$   keymiresstartstopZstrider   r   r   __getitem__   s    



z InteriorRingSequence.__getitem__c                 C   s   t | j|S r
   )r   Zget_interior_ringr8   )r$   rN   r   r   r   rA      s    zInteriorRingSequence._get_ring)r0   r1   r2   r8   r9   r<   r>   r;   r?   rD   r=   rR   rA   r   r   r   r   r7      s   r7   c                   @   sd   e Zd ZdZg ZdddZedd Zedd Zed	d
 Z	edd Z
dddZedd ZdS )r   aE  
    A geometry type representing an area that is enclosed by a linear ring.

    A polygon is a two-dimensional feature and has a non-zero area. It may
    have one or more negative-space "holes" which are also bounded by linear
    rings. If any rings cross each other, the feature is invalid and
    operations on it may fail.

    Parameters
    ----------
    shell : sequence
        A sequence of (x, y [,z]) numeric coordinate pairs or triples, or
        an array-like with shape (N, 2) or (N, 3).
        Also can be a sequence of Point objects.
    holes : sequence
        A sequence of objects which satisfy the same requirements as the
        shell parameters above

    Attributes
    ----------
    exterior : LinearRing
        The ring which bounds the positive space of the polygon.
    interiors : sequence
        A sequence of rings which bound all existing holes.

    Examples
    --------
    Create a square polygon with no holes

    >>> coords = ((0., 0.), (0., 1.), (1., 1.), (1., 0.), (0., 0.))
    >>> polygon = Polygon(coords)
    >>> polygon.area
    1.0
    Nc                 C   st   |d u rt dS t|tr |S t|}|d urPt|dkrBd }ndd |D }t j||d}t|tsptd|S )NzPOLYGON EMPTYr   c                 S   s   g | ]}t |qS r   )r	   )r   rC   r   r   r   r      r   z#Polygon.__new__.<locals>.<listcomp>)holesz,Invalid values passed to Polygon constructor)r   r   r   r   r	   r#   Zpolygonsr"   )r$   shellrS   r&   r   r   r   r'      s    


zPolygon.__new__c                 C   s
   t | S r
   )r   Zget_exterior_ringr*   r   r   r   exterior   s    zPolygon.exteriorc                 C   s   | j r
g S t| S r
   )is_emptyr7   r*   r   r   r   	interiors   s    zPolygon.interiorsc                 C   s   t dd S )NzCComponent rings have coordinate sequences, but the polygon does not)NotImplementedErrorr*   r   r   r   r      s    zPolygon.coordsc                 C   sJ   | j t krg }n*t| j jg}| jD ]}|t|j q&dt|dS )Nr   r(   )rU   r	   r)   r   rW   rJ   )r$   r   holer   r   r   r+     s    
zPolygon.__geo_interface__      ?c                 C   s|   | j r
dS |du r | jrdnd}|du r,d}dd | jjD g}dd | jD }d	d
d || D }dd| |||S )a  Returns SVG path element for the Polygon geometry.

        Parameters
        ==========
        scale_factor : float
            Multiplication factor for the SVG stroke-width.  Default is 1.
        fill_color : str, optional
            Hex string for fill color. Default is to use "#66cc99" if
            geometry is valid, and "#ff3333" if invalid.
        opacity : float
            Float number between 0 and 1 for color opacity. Default value is 0.6
        z<g />Nz#66cc99z#ff3333g333333?c                 S   s   g | ]}d j | qS z{},{}formatr   r   r   r   r   !  r   zPolygon.svg.<locals>.<listcomp>c                 S   s   g | ]}d d |j D qS )c                 S   s   g | ]}d j | qS r[   r\   r   r   r   r   r   #  r   z*Polygon.svg.<locals>.<listcomp>.<listcomp>)r   )r   Zinteriorr   r   r   r   "  s    c              
   S   s*   g | ]"}d  |d d|dd qS )zM {} L {} zr   z L r@   N)r]   join)r   r   r   r   r   r   &  s   za<path fill-rule="evenodd" fill="{2}" stroke="#555555" stroke-width="{0}" opacity="{3}" d="{1}" />g       @)rV   r   rU   r   rW   r_   r]   )r$   Zscale_factorZ
fill_colorZopacityZexterior_coordsZinterior_coordspathr   r   r   svg  s&    zPolygon.svgc                 C   s    | ||f||f||f||fgS )z,Construct a `Polygon()` from spatial bounds.r   )clsZxminZyminZxmaxZymaxr   r   r   from_bounds0  s    zPolygon.from_bounds)NN)rZ   NN)r0   r1   r2   r3   r4   r'   r5   rU   rW   r   r+   ra   classmethodrc   r   r   r   r   r      s   #




	
"   rZ   c                 C   s   t |}g }| j}t|| dkr.|| n|t|jd d d  | jD ]:}t|| dkrn|| qN|t|jd d d  qNt|d |dd  S )Ng        r   r@   )r   rU   r   rJ   listr   rW   r   )ZpolygonsignsZringsrC   r   r   r   orient9  s    
rj   )rZ   )r3   numpyr   r   Zshapely.algorithms.cgar   r   Zshapely.errorsr   Zshapely.geometry.baser   Zshapely.geometry.linestringr   Zshapely.geometry.pointr   __all__r   r	   libregistryr7   r   rj   r   r   r   r   <module>   s   	i2