o
    jJ+                     @   s   d Z ddlZddl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 ddlmZ g d	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)_geometry_helpers)signed_area)TopologicalError)BaseGeometry)
LineString)Point)
LinearRingPolygonorientc                 C   s2   t | }t |}t|}|rt ||}|S N)shapelyZfrom_wkbZget_sridr   Zlinestring_to_linearringZset_srid)ZwkbZ
linestringZsridZ
linearring r   Y/var/www/html/Deteccion_Ine/venv/lib/python3.10/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  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.

    >>> from shapely import LinearRing
    >>> 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r!t|tu r|S |jstd|j}n5t	|dr+t
|}t|t
jr:t
|jt
jr:ndd  t
 fdd|D }t
|jt
jsVtd	t|d
krat dS t |}t|tsotd|S )z!Create a new LinearRing geometry.NzLINEARRING EMPTYz"An input LineString must be valid.Z	__array__c                 S   s"   t | tr
| jd S dd | D S )Nr   c                 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lenZlinearrings)selfcoordinatesgeomr   r   r   __new__=   s0   






zLinearRing.__new__c                 C   s   dt | jdS )z9Return a GeoJSON-like mapping of the LinearRing geometry.r   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 )zPickle support.

        WKB doesn't differentiate between LineString and LinearRing so we
        need to move the coordinate sequence into the correct geometry type
        T)Zinclude_srid)r   r   Zto_wkbr+   r   r   r   
__reduce__r   s   zLinearRing.__reduce__c                 C      t t| S )z0True if the ring is oriented counter clock-wise.)boolr   is_ccwr+   r   r   r   r0   z   s   zLinearRing.is_ccwc                 C   r.   )zwTrue if the geometry is simple.

        Simple means that any self-intersections are only at boundary points.
        )r/   r   	is_simpler+   r   r   r   r1      s   zLinearRing.is_simpler   )__name__
__module____qualname____doc__	__slots__r(   propertyr,   r-   r0   r1   r   r   r   r   r      s    !
0

r      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   s.   | j | jk r| | j }|  j d7  _ |S t)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_ringsr:   r+   r   r   r   r?      s   zInteriorRingSequence.__len__c                 C   s   |   }t|tr'|| dk s||krtd|dk r || }n|}| |S t|trIg }||\}}}t|||D ]
}|| | q<|S t	d)Nr   zindex out of rangezkey must be an index or slice)
r?   r   int
IndexErrorrC   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_ringr:   )r%   rP   r   r   r   rC      s   zInteriorRingSequence._get_ring)r2   r3   r4   r:   r;   r>   r@   r=   rA   rF   r?   rT   rC   r   r   r   r   r9      s    r9   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

    >>> from shapely import Polygon
    >>> 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r(t|dkr!d}ndd |D }t j||d}t|ts8td|S )zCreate a new Polygon geometry.NzPOLYGON EMPTYr   c                 S   r   r   )r   )r   rE   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%   shellrU   r'   r   r   r   r(      s   


zPolygon.__new__c                 C   s
   t | S )z(Return the exterior ring of the polygon.)r   Zget_exterior_ringr+   r   r   r   exterior   s   
zPolygon.exteriorc                 C   s   | j rg S t| S )z5Return the sequence of interior rings of the polygon.)is_emptyr9   r+   r   r   r   	interiors   s   zPolygon.interiorsc                 C   s   t d)zNot implemented for polygons.zCComponent 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 )z6Return a GeoJSON-like mapping of the Polygon geometry.r	   r)   )rW   r   r*   r   rY   rL   )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d|  d| d| d	S )a  Return 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      g | ]}d j | qS z{},{}formatr   r   r   r   r   -      zPolygon.svg.<locals>.<listcomp>c                 S   s   g | ]
}d d |j D qS )c                 S   r]   r^   r_   r   r   r   r   r   /  ra   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 rB   N)r`   join)r   r   r   r   r   r   2  s    z <path fill-rule="evenodd" fill="z!" stroke="#555555" stroke-width="g       @z" opacity="z" d="z" />)rX   r   rW   r   rY   rc   )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_bounds<  s    zPolygon.from_bounds)NN)r\   NN)r2   r3   r4   r5   r6   r(   r7   rW   rY   r   r,   re   classmethodrg   r   r   r   r   r	      s    $






#r	      r\   c                 C   s   t j| |dk dS )a  Return an oriented polygon.

    It is recommended to use :func:`shapely.orient_polygons` instead.

    Parameters
    ----------
    polygon : shapely.Polygon
    sign : float, default 1.
        The sign of the result's signed area.
        A non-negative sign means that the coordinates of the geometry's exterior
        rings will be oriented counter-clockwise.

    Returns
    -------
    Geometry or array_like

    Refer to :func:`shapely.orient_polygons` for full documentation.

    g        )Zexterior_cw)r   Zorient_polygons)Zpolygonsignr   r   r   r
   E  s   r
   )r\   )r5   numpyr    r   r   Zshapely.algorithms.cgar   Zshapely.errorsr   Zshapely.geometry.baser   Zshapely.geometry.linestringr   Zshapely.geometry.pointr   __all__r   r   libregistryr9   r	   r
   r   r   r   r   <module>   s$    	o1 