a
    SiZ                      @   s  d dl m Z  d dlZd dlZd dlmZmZmZmZmZm	Z	m
Z
mZmZmZ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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%m&Z& d dl'm(Z( d dl)m*Z* G dd dZ+ede!j,ededddedee	ddddededdededded ed!d"d#d$dd%ed&e
dd'e dd(ed)e
dd'e dd(	Z-e!j.e+e-d*ee#dd+d,id- dS ).    )datetimeN)ColumnIntegerARRAYTableString
ForeignKey	TIMESTAMPFloatfuncJSONselect)relationship)Geometry)
Comparator)
from_shapeto_shape)from_wkb
to_geojsonwkb)GeoDataFrame   )UtcNow   )schema   )CustomGroup)CONFIG
DB_SESSION)DisplacementsHelper)GeometryHelperc                   @   s   e Zd Zdd Ze Ze Zedd Z	edd Z
edd Zed	d
 Zedd Zedd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!S )"CustomPolygonc                 C   s:   || _ || _|rt|ddnd | _t | _t | _d S )N  srid)custom_group_id	referencer   _geometry_wkbr   now
created_at
updated_at)selfr%   r&   geometry r-   n/var/www/staging/api/virtual_environments/venv/lib/python3.9/site-packages/main/models/insar/custom_polygon.py__init__   s
    
zCustomPolygon.__init__c                 C   s*   | j | jj| jtt| j| jd}|S )N)idcustom_groupr&   r,   area)	r0   r1   Zbase_outputr&   jsonloadsr   r,   r2   )r+   contentr-   r-   r.   to_dict_minimal   s    zCustomPolygon.to_dict_minimalc                 C   s   | j d| jiB S )Nmetrics)r6   r7   r+   r-   r-   r.   to_dict*   s    zCustomPolygon.to_dictc                 C   s   t | jjS N)r   r'   descr8   r-   r-   r.   r,   0   s    zCustomPolygon.geometryc                 C   s   t  | jS r:   )r    Zcalculated_arear,   r8   r-   r-   r.   r2   4   s    zCustomPolygon.areac                 C   s&   dD ]}t | |sd|   S qdS )N)r%   r&   r,   zIncomplete data - missing T)getattr)r+   Zrequired_fieldr-   r-   r.   	validates8   s    
zCustomPolygon.validatesc              
      s   t tt  b}ttt| j	j
jtj|ddtd d } fdd|| D W  d    S 1 s|0    Y  d S )Nr"   r#   polygonsZ	map_limitc                    s   g | ]}|d    qS )r   )r9   ).0Zpolygonlayersmodelsr-   r.   
<listcomp>J       z(CustomPolygon.within.<locals>.<listcomp>)r   nextiterbeginr   r!   wherer   Z	ST_Within	__table__cr'   r   dumpslimitr   executeall)r+   r,   rB   rA   Z
db_sessionr>   r-   r@   r.   withinA   s    
zCustomPolygon.withinc                 C   s>   g }|  D ],\}}|D ]}||i|vr|||i qq|S r:   )itemsappend)r+   rB   rA   databasemodelr-   r-   r.   ungrouped_modelsL   s    zCustomPolygon.ungrouped_modelsc                 C   s.   | j j| j| ||ddgdtd d dS )Nr      )rA   Z
rmse_rangepointsZdefault_limit)tablesdatarL   )geometry_helperZpoint_data_withinr,   rT   r   )r+   rB   rA   r-   r-   r.   rV   T   s    zCustomPolygon.pointsc                 C   s>   i }|D ]0}| |jjs&g ||jj< ||jj | q|S r:   )getframelayerrQ   )r+   rV   	separatedpointr-   r-   r.   points_separated_by_layerZ   s    z'CustomPolygon.points_separated_by_layerc                 C   s   i }t |dkr|tj|t|}tt|dtt|dtt|dd}dD ]"}tt	||d|d|d< qX|S )Nr   r   )Zavgmaxmin)   
      2   F   Z   _   p02d)
lennumpymaZmasked_arrayisinfroundnanmeanZnanmaxZnanminZnanpercentile)r+   ZdiffsoutputZmasked_diffsZ
percentiler-   r-   r.   diff_calculationsb   s     zCustomPolygon.diff_calculationsc                    s\   t dd |D dd |D ddd}|d  j fdd	} d
 |_ d
 |_|S )Nc                 S   s   g | ]
}|j qS r-   )r0   r?   ri   r-   r-   r.   rC   s   rD   z+CustomPolygon.distances.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r-   r,   rs   r-   r-   r.   rC   s   rD   )r0   r,   z	EPSG:4326)Zcrsz	EPSG:3857c                    s    j | S r:   )r,   Zdistancert   Z
frame_3857r-   r.   <lambda>v   rD   z)CustomPolygon.distances.<locals>.<lambda>r0   )r   Zto_crsr,   applyindexcolumns)r+   rV   r[   matrixr-   ru   r.   	distancesr   s    &


zCustomPolygon.distancesc                 C   s  i }i }|D ]}| |||j< q| |}g g g g tjg tdd}|D ]}||j \}}	}
|
 rJt|d |
|d< |d | |d |	 |D ]V}||kr||j \}}}t|| }|d | |d |||j |j   qqJt	|d dkrt
|d |d< tt|d d	|d
< | |d |d< | t|d |d< | |d |d< | |d |d< t	||d< t	|d tt|d tt|d d|d< |S )N)Zdtype)t_velst_dispdiffs
t_diffs_mvt_diffs_mv_distancesdatesr   r}   r|   r~   r   r   r   avg_velocityZdiffs_dispsZ	diffs_absZdiffs_mvZdiffs_mv_lenrV   )countrG   end)	disp_diffr0   r{   rl   arrayintanyrQ   absrk   setro   rp   rr   ra   r`   )r+   ZperiodZlayer_pointsrq   Z
disp_diffsr^   r{   rX   r   Zt_velZt_datesZpaired_pointZpaired_disp_diff_Zdiff_mvr-   r-   r.   time_period|   s8    
"0zCustomPolygon.time_periodc                 C   sb   i }|D ]T}dt tdd || D di||< dD ]$}| ||| || |dd< q6q|S )Nr   c                 S   s   g | ]
}|j qS r-   )velocity)r?   xr-   r-   r.   rC      rD   z0CustomPolygon.metrics_layers.<locals>.<listcomp>r   )rU            Z02_months)ro   rl   rp   r   )r+   points_separatedrq   Z	layer_keymonthsr-   r-   r.   metrics_layers   s    &$zCustomPolygon.metrics_layersc                 C   sn   t d d }i }| D ]\}}|d |kr|||< qd|i}|j|ddd}| ||}	| |	}
| |
S )NZtilesrA   rR   TF)groupedZcheck_authorised)r   rP   rW   rV   r_   r   )r+   Zaccess_helperrR   rA   Zdatabase_layersr\   Z
layer_datafiltersrB   rV   r   r-   r-   r.   calculate_metrics   s    

zCustomPolygon.calculate_metricsc                 C   s*   t d|j }t | jjj|}|d fS )Nz
SRID=4326;)r   ZST_GeomFromEWKTZwktZST_ContainsrI   rJ   r'   )r+   locationZlocation_as_sql_funcqueryr-   r-   r.   closest   s    zCustomPolygon.closestN)__name__
__module____qualname__r/   r   Zdisplacements_helperr    rY   propertyr6   r9   r,   r2   r=   classmethodrO   rT   rV   r_   rr   r{   r   r   r   r   r-   r-   r-   r.   r!      s0   








%r!   Zcustom_polygonsr0   T)Zprimary_keyZautoincrementr%   zcustom_groups.idF)nullablerx   r&   )r   r7   r,   ZPOLYGONr"   )Zgeometry_typer$   r'   )keyr   r)   )timezone)Zserver_defaultr   r*   r1   Zjoined)ZbackrefZlazy)
properties)/r   r3   rl   Z
sqlalchemyr   r   r   r   r   r   r	   r
   r   r   r   Zsqlalchemy.ormr   Zgeoalchemy2r   Zgeoalchemy2.comparatorr   Zgeoalchemy2.shaper   r   Zshapelyr   r   r   Z	geopandasr   Z services.custom_sqlalchemy_typesr   Z_mapperr   r1   r   setupr   r   Z"main.services.displacements_helperr   Zmain.services.geometry_helperr    r!   metadataZcustom_polygons_tableZmap_imperativelyr-   r-   r-   r.   <module>   sH   4 .