o
    j                     @   sV   d dl Z d dlZd dlZdd Zdd Zdd Zdd	 Zd
d ZdddZdd Z	dS )    Nc                 C   s   | |  dd }g }td|D ]2}g }|ddD ]}| }|s&q| \}}|t|t|f qt|dkrC|| q|S )zAReturn list of rings (each list of (lon,lat)) for a MULTIPOLYGON.(Nz\(([-0-9eE., ]+)\)   ,   )	indexrefinditergroupsplitstripappendfloatlen)wktbodyringsmptspairab r   7/sessions/upbeat-quirky-clarke/mnt/outputs/sfmap/geo.pyparse_multipolygon   s   
r   c           
      C   s   t | dk rdS tdd | D t |  }dtt| }d}d}tt | D ]:}| | d | | | d | }}| |d t |   d | | |d t |   d | }}	|||	 ||  7 }q)t|d	 S )
z@Planar shoelace area in m^2 using local equirectangular scaling.           c                 s       | ]}|d  V  qdS r   Nr   .0pr   r   r   	<genexpr>       zring_area_m2.<locals>.<genexpr>    -@    @r   r   g       @)r   summathcosradiansrangeabs)
ringlat0kxkysix1y1x2y2r   r   r   ring_area_m2   s   ":r5   c                 C   s   ||krt | d |d  | d |d  S |d |d  |d |d  }}| d |d  | | d |d  |  || ||   }tdtd|}t | d |d ||   | d |d ||   S )Nr   r   r   g      ?)r&   hypotmaxmin)r    r   r   dxdytr   r   r   _perp   s   $"84r<   c           
      C   s   t | dk r| dd S dgt |  }d |d< |d< dt | d fg}|rn| \}}||d kr3q$d\}}t|d |D ]}t| | | | | | }	|	|krU|	|}}q>||krld||< |||f |||f |s&d	d
 t| |D S )z.Douglas-Peucker on an open polyline (degrees).r   NFTr   r   )g      r=   c                 S   s   g | ]\}}|r|qS r   r   )r   r    kr   r   r   
<listcomp>5   s    zdp.<locals>.<listcomp>)r   popr)   r<   r   zip)
r   tolkeepstackr0   jdmaxidxr>   dr   r   r   dp&   s    
rI   c                 C   sl   | dd }|d |d kr|dd }t |dk r|S t||d g |}|d |d kr4|dd }|S )z*Simplify a closed ring, keeping it closed.Nr   r=   r   )r   rI   )r+   rB   routr   r   r   dp_ring7   s   rL         i@333333c                    s  | dd }|d |d kr|dd }d}|rt |dkrd}tdd |D t | }d	tt| }d
}g t |d}}	}
t  t|	D ]}}
|
 v rQqJ||
d |	  ||
 ||
d |	  }}}|d |d  | |d |d  | f}|d |d  | |d |d  | f}tj| }tj| }|dkr|dkr|d |d  |d |d   ||  }||k rt|||k rǈ 	|
 d}qJ fddt
|D }|rt |dks|S )zJDrop vertices that form a near-retracing needle (simplification artifact).Nr   r=   Tr   Fc                 s   r   r   r   r   r   r   r   r!   H   r"   zdespike.<locals>.<genexpr>r#   r$   r   c                    s   g | ]
\}}| vr|qS r   r   )r   r0   r    skipr   r   r?   V       zdespike.<locals>.<listcomp>)r   r%   r&   r'   r(   setr)   r6   r8   add	enumerate)r+   max_spike_m
cos_threshrJ   changedr,   r-   r.   rK   nr0   p0p1p2v1v2l1l2cr   rO   r   despikeA   s.   
,(((ra   c           	         s   | d | d kr| dd n| dd }|d |d kr"|dd n|dd }t |t |}}||@  t dk r=dS  fdd}||||}}|du sT|du rVdS |d |d kre|ddd }|d |d ksu|d |d krwdS ||dd  S )zDMerge two rings that share a contiguous chain of identical vertices.r   r=   N   c                    s   t  fdd D tstsd S tfddtD  fddtD }fdd|D ztfddtD }W n
 tyT   Y d S w t|d  s_d S |d | }||d  }|d g| |d	 g S )
Nc                       g | ]}| v qS r   r   r   sharedr   r   r?   c       z/dissolve_two.<locals>.split.<locals>.<listcomp>c                 3   s,    | ]} | s |d    r|V  qdS r   r   r   r0   )inSrX   r   r   r!   e   s   * z.dissolve_two.<locals>.split.<locals>.<genexpr>c                    s   g | ]
} |   qS r   r   )r   r>   )RrX   startr   r   r?   f   rQ   c                    rc   r   r   r   rd   r   r   r?   g   rf   c                 3   s    | ]	} | r|V  qd S )Nr   rg   )inRr   r   r!   j   s    r=   r   )r   allanynextr)   StopIteration)ri   rotfirst_shared	nonsharedshrd   )ri   rk   rh   rX   rj   r   r
   a   s   zdissolve_two.<locals>.splitr   )rR   r   )	r   r   ABsasbr
   papbr   rd   r   dissolve_twoY   s   (( rz   )rM   rN   )
r   r&   jsonr   r5   r<   rI   rL   ra   rz   r   r   r   r   <module>   s    

