a
    !h-(                     @   s   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
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 d d
lmZ d dlmZ dd Zdd Zdd ZG dd dZdS )    )Numbershape)BaseGeometry)MultiPolygon)orientPolygon)	transform)loads)vector_tile_pb2)GeometryEncodermake_it_valid)get_encode_optionsc                 C   s   t d| j d S )NzInvalid geometry: )
ValueErrorZwktr    r   h/var/www/staging/api/virtual_environments/venv/lib/python3.9/site-packages/mapbox_vector_tile/encoder.pyon_invalid_geometry_raise   s    r   c                 C   s   d S Nr   r   r   r   r   on_invalid_geometry_ignore   s    r   c                 C   s   t | S r   r   r   r   r   r   on_invalid_geometry_make_valid   s    r   c                   @   s   e Zd Zd#ddZd$ddZd%ddZd	d
 Zdd Zdd Zdd Z	e
dd Zdd Zdd Zdd Ze
dd Ze
dd Ze
dd Zedd  Zd!d" ZdS )&
VectorTileNc                 C   sF   t  | _|| _d | _d | _d| _d| _i | _i | _i | _	t
 | _d S )Nr   )vector_tiletiledefault_optionslayerlayer_optionskey_idxval_idxseen_keys_idxseen_values_idxseen_values_bool_idxsetseen_layer_names)selfr   r   r   r   __init__   s    
zVectorTile.__init__c                 C   s  |st d|d|| jv r.t d|d| j| | jj | _t|| jd| _|| j_	d| j_
| jd | j_d| _d| _i | _i | _i | _|D ]|}|d	}|d u rq| |}|d u rtd
|jrq| jd r| |}| jd r| |}|d ur|js| || qd S )NzA layer name can not be empty. z was provided.zThe layer name z# already exists in the vector tile.)r   r      extentsr   geometryz@Can't do geometries that are not wkt, wkb, or shapely geometriesquantize_boundsZcheck_winding_order)r   r#   addr   Zlayersr   r   r   r   nameversionZextentr   r   r   r    r!   get_load_geometryNotImplementedErroris_emptyquantizeenforce_winding_orderadd_feature)r$   r+   featuresoptionsfeaturegeometry_specr   r   r   r   	add_layer+   s<    






zVectorTile.add_layer   c                 C   s6   |j dkr| j||d}n|j dkr2| j||d}|S )Nr   r   n_tryr   )	geom_type"enforce_multipolygon_winding_orderenforce_polygon_winding_orderr$   r   r;   r   r   r   r2   R   s
    

z VectorTile.enforce_winding_orderc                    s<   | j d \| j d  d fdd	}t||S )Nr)   r'   c                    s@      }   }||   } ||  }t | t |fS r   round)xyzZxfacZyfacr'   ZmaxxZmaxyZminxZminyr   r   fnh   s
    zVectorTile.quantize.<locals>.fn)N)r   r	   )r$   r   rF   r   rE   r   r1   d   s    
zVectorTile.quantizec                 C   sX   |j r
|S || jd krd S | jd rT| jd |}|d urT|jsT| j||d d}|S )NZmax_geometry_validate_triesZon_invalid_geometryr9   r:   )Zis_validr   r0   r2   r?   r   r   r   handle_shape_validityq   s    
z VectorTile.handle_shape_validityc                 C   s   |j dksJ g }|jD ]B}| j||d}|d ur|js|j dkrP||j q|| q|sdd S t|dkrz|d }nt|}| ||}|S )Nr   r:   r9   r   )	r<   Zgeomsr>   r0   extendappendlenr   rG   )r$   r   r;   partspartoriented_shaper   r   r   r=      s    


z-VectorTile.enforce_multipolygon_winding_orderc                    s   |j dksJ dd   |jj}d }t|jdkrN fdd|jD }jd r\dnd	}tt|||d
}	||}|S )Nr   c                 S   s   | \}}t |t |fS r   r@   )pointrB   rC   r   r   r   rF      s    z4VectorTile.enforce_polygon_winding_order.<locals>.fnr   c                    s   g | ]}  |jqS r   )	apply_mapcoords).0ringrF   r$   r   r   
<listcomp>       z<VectorTile.enforce_polygon_winding_order.<locals>.<listcomp>y_coord_downg      ?g      )sign)
r<   rO   exteriorrP   rJ   Z	interiorsr   r   r   rG   )r$   r   r;   rX   ZringsrW   rM   r   rS   r   r>      s    z(VectorTile.enforce_polygon_winding_orderc                 C   s   t t| |S r   )listmap)rF   rB   r   r   r   rO      s    zVectorTile.apply_mapc                 C   s   t |tr|}nXt |tr$t|}nDzt|}W n6 tyf   zt|}W n ty`   Y Y d S 0 Y n0 | jd d u rz|S t| jd |S d S )NZtransformer)	
isinstancer   dictshapely_shapeload_wkb	Exceptionload_wktr   r	   )r$   r7   Zgeomr   r   r   r.      s    


zVectorTile._load_geometryc           	      C   s   t | jd | jd }||}| |}t|dkr:d S | jj }|d}|d urpt	|t
rp|dkrp||_|d}|d ur| | j|| ||_|j| d S )NrV   r'   r   id
properties)r   r   encode_get_feature_typerJ   r   r4   r*   r-   r[   r   ra   _handle_attrtyper(   rH   )	r$   r6   r   Zgeom_encoderr(   Zfeature_typefZfidrb   r   r   r   r3      s    



zVectorTile.add_featurec                 C   s|   |j dks|j dkr| jjS |j dks0|j dkr8| jjS |j dksL|j dkrT| jjS |j dkrhtdntd	|j  d S )
NPointZ
MultiPoint
LineStringZMultiLineStringr   r   ZGeometryCollectionz+Encoding geometry collections not supportedz%Cannot encode unknown geometry type: )r<   r   rh   ri   r   r   )r$   r   r   r   r   rd      s    

zVectorTile._get_feature_typec                    s     fddt dt D S )Nc                    s   g | ]} ||  qS r   r   )rQ   posseqsizer   r   rT      rU   z'VectorTile._chunker.<locals>.<listcomp>r   )rangerJ   rk   r   rk   r   _chunker   s    zVectorTile._chunkerc                 C   s
   t | tS r   )r[   str)kr   r   r   _can_handle_key   s    zVectorTile._can_handle_keyc                 C   s   t | ttttfS r   )r[   rp   boolintfloat)vr   r   r   _can_handle_val   s    zVectorTile._can_handle_valc                 C   s   |  |o| |S r   )rr   rw   )clsrq   rv   r   r   r   _can_handle_attr   s    zVectorTile._can_handle_attrc                 C   s   |  D ]\}}| ||r|| jvrL|j| | j| j|< |  jd7  _|j| j|  t|trp| j	}n| j
}||vr| j||< |  jd7  _|j }t|tr||_n4t|tr||_n"t|tr||_nt|tr||_|j||  qd S )Nr9   )itemsry   r   keysrI   r   tagsr[   rs   r!   r    r   valuesr*   Z
bool_valuerp   Zstring_valuert   Z	int_valueru   Zdouble_value)r$   r   r6   propsrq   rv   Z
values_idxvalr   r   r   re      s.    







zVectorTile._handle_attr)N)N)r9   )__name__
__module____qualname__r%   r8   r2   r1   rG   r=   r>   staticmethodrO   r.   r3   rd   ro   rr   rw   classmethodry   re   r   r   r   r   r      s*   

'





r   N) numbersr   Zshapely.geometryr   r]   Zshapely.geometry.baser   Zshapely.geometry.multipolygonr   Zshapely.geometry.polygonr   r   Zshapely.opsr	   Zshapely.wkbr
   r^   Zshapely.wktr`   Zmapbox_vector_tile.Mapboxr   r   Zmapbox_vector_tile.geom_encoderr   Zmapbox_vector_tile.polygonr   Zmapbox_vector_tile.utilsr   r   r   r   r   r   r   r   r   <module>   s   