U
    Ha                     @   s   d dl Z d dlmZ d dlmZ e jd  dkr:eeefZneeee	fZG dd deZ
G dd deZd	d
 ZG dd de
ZG dd de
Zdd ZG dd deZG dd de
Zdd ZG dd de
ZG dd de
ZG dd deZdS )    N)Decimal)GeoJSON   c                       s.   e Zd ZdZd	 fdd	Zedd Z  ZS )
GeometryzA
    Represents an abstract base class for a WGS84 geometry.
    NF   c                    sJ   t t| jf | | |pg || d< |rF|  }|rFtd||dS )av  
        Initialises a Geometry object.

        :param coordinates: Coordinates of the Geometry object.
        :type coordinates: tuple or list of tuple
        :param validate: Raise exception if validation errors are present?
        :type validate: boolean
        :param precision: Number of decimal places for lat/lon coords.
        :type precision: integer
        coordinatesz{}: {}N)superr   __init__clean_coordinateserrors
ValueErrorformat)selfr   validate	precisionextrar   	__class__ 4/tmp/pip-unpacked-wheel-kunv6awc/geojson/geometry.pyr	      s     zGeometry.__init__c                 C   s   t || r|d S g }t |tr&|g}|D ]h}t |ttfrP|| || q*t |trj||d  q*t |tr|t|| q*td| q*|S )Nr   z!%r is not a JSON compliant number)	
isinstancer   listtupleappendr
   _JSON_compliant_typesroundr   )clsZcoordsr   Z
new_coordscoordr   r   r   r
   '   s    



zGeometry.clean_coordinates)NFr   )__name__
__module____qualname____doc__r	   classmethodr
   __classcell__r   r   r   r   r      s   r   c                       s6   e Zd ZdZd	 fdd	Zdd Z fddZ  ZS )
GeometryCollectionzP
    Represents an abstract base class for collections of WGS84 geometries.
    Nc                    s"   t t| jf | |pg | d< d S )N
geometries)r   r$   r	   )r   r%   r   r   r   r   r	   @   s    zGeometryCollection.__init__c                 C   s    dd | d D }dd |D S )Nc                 S   s   g | ]}|  qS r   )r   ).0Zgeomr   r   r   
<listcomp>E   s     z-GeometryCollection.errors.<locals>.<listcomp>r%   c                 S   s   g | ]}|r|qS r   r   )r&   errr   r   r   r'   F   s      r   )r   r   r   r   r   r   D   s    zGeometryCollection.errorsc              
      sB   z|  dd| W S  tttfk
r<   tt| | Y S X d S )Nr%   r   )getKeyError	TypeError
IndexErrorr   r   __getitem__)r   keyr   r   r   r-   H   s    zGeometryCollection.__getitem__)N)r   r   r    r!   r	   r   r-   r#   r   r   r   r   r$   ;   s   r$   c                 C   s"   t | tsdS t| dkrdS d S )Nzeach position must be a list)   r   z*a position must have exactly 2 or 3 values)r   r   len)r   r   r   r   check_pointQ   s    
r1   c                   @   s   e Zd Zdd ZdS )Pointc                 C   s   t | d S Nr   )r1   r   r   r   r   r   Y   s    zPoint.errorsNr   r   r    r   r   r   r   r   r2   X   s   r2   c                   @   s   e Zd Zdd ZdS )
MultiPointc                 C   s   |  t| d S r3   )check_list_errorsr1   r4   r   r   r   r   ^   s    zMultiPoint.errorsNr5   r   r   r   r   r6   ]   s   r6   c                 C   s@   t | tsdS t| dk rdS | D ]}t|}|r"|  S q"d S )Nz%each line must be a list of positionsr/   zBthe "coordinates" member must be an array of two or more positions)r   r   r0   r1   )r   poserrorr   r   r   check_line_stringb   s    
r:   c                   @   s   e Zd Zdd ZdS )
LineStringc                 C   s   t | d S r3   )r:   r4   r   r   r   r   o   s    zLineString.errorsNr5   r   r   r   r   r;   n   s   r;   c                   @   s   e Zd Zdd ZdS )MultiLineStringc                 C   s   |  t| d S r3   )r7   r:   r4   r   r   r   r   t   s    zMultiLineString.errorsNr5   r   r   r   r   r<   s   s   r<   c                 C   sd   t | tsdS tdd | D s$dS tdd | D }|dkrBdS tdd | D }|dkr`d	S d S )
Nz+Each polygon must be a list of linear ringsc                 s   s   | ]}t |tV  qd S )N)r   r   r&   elemr   r   r   	<genexpr>|   s     z check_polygon.<locals>.<genexpr>z6Each element of a polygon's coordinates must be a listc                 s   s   | ]}t |d kV  qdS )   N)r0   r=   r   r   r   r?      s     Fz2Each linear ring must contain at least 4 positionsc                 s   s   | ]}|d  |d kV  qdS )r   Nr   r=   r   r   r   r?      s     z*Each linear ring must end where it started)r   r   all)r   lengthsZisringr   r   r   check_polygonx   s    
rD   c                   @   s   e Zd Zdd ZdS )Polygonc                 C   s   t | d S r3   )rD   r4   r   r   r   r      s    zPolygon.errorsNr5   r   r   r   r   rE      s   rE   c                   @   s   e Zd Zdd ZdS )MultiPolygonc                 C   s   |  t| d S r3   )r7   rD   r4   r   r   r   r      s    zMultiPolygon.errorsNr5   r   r   r   r   rF      s   rF   c                   @   s   e Zd ZdZdS )Defaultz!
    GeoJSON default object.
    N)r   r   r    r!   r   r   r   r   rG      s   rG   )sysdecimalr   Zgeojson.baser   version_infofloatintr   longr   r$   r1   r2   r6   r:   r;   r<   rD   rE   rF   objectrG   r   r   r   r   <module>   s"   -