a
    .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-   A/var/www/staging/api/app_home/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   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)r7   r8   r+   r-   r-   r.   to_dict*   s    zCustomPolygon.to_dictc                 C   s   t | jjS N)r   r'   descr9   r-   r-   r.   r,   0   s    zCustomPolygon.geometryc                 C   s   t  | jS r;   )r    calculated_arear,   r9   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   )r:   ).0polygonlayersmodelsr-   r.   
<listcomp>J       z(CustomPolygon.within.<locals>.<listcomp>)r   nextiterbeginr   r!   wherer   	ST_Within	__table__cr'   r   dumpslimitr   executeall)r+   r,   rE   rD   
db_sessionr@   r-   rC   r.   withinA   s    
zCustomPolygon.withinc                 C   s>   g }|  D ],\}}|D ]}||i|vr|||i qq|S r;   )itemsappend)r+   rE   rD   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      )rD   
rmse_rangepointsZdefault_limit)tablesdatarP   )geometry_helperpoint_data_withinr,   rY   r   )r+   rE   rD   r-   r-   r.   r\   T   s    zCustomPolygon.pointsc                 C   s>   i }|D ]0}| |jjs&g ||jj< ||jj | q|S r;   )getframelayerrV   )r+   r\   	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   )avgmaxmin)   
      2   F   Z   _   p02d)
lennumpymamasked_arrayisinfroundnanmeannanmaxnanminnanpercentile)r+   diffsoutputZmasked_diffs
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   rA   rq   r-   r-   r.   rF   s   rG   z+CustomPolygon.distances.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r-   r,   r   r-   r-   r.   rF   s   rG   )r0   r,   z	EPSG:4326)crsz	EPSG:3857c                    s    j | S r;   )r,   distancer   Z
frame_3857r-   r.   <lambda>v   rG   z)CustomPolygon.distances.<locals>.<lambda>r0   )r   to_crsr,   applyindexcolumns)r+   r\   rb   matrixr-   r   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)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_lenr\   )countrJ   end)	disp_diffr0   r   rt   arrayintanyrV   absrs   setrx   ry   r   ri   rh   )r+   periodZlayer_pointsr~   Z
disp_diffsre   r   r^   r   t_vel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)rA   xr-   r-   r.   rF      rG   z0CustomPolygon.metrics_layers.<locals>.<listcomp>r   )rZ            02_months)rx   rt   ry   r   )r+   points_separatedr~   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 )NtilesrD   rW   TF)groupedZcheck_authorised)r   rU   r]   r\   rf   r   )r+   Zaccess_helperrW   rD   Zdatabase_layersrc   Z
layer_datafiltersrE   r\   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   ST_GeomFromEWKTwktST_ContainsrM   rN   r'   )r+   locationlocation_as_sql_funcqueryr-   r-   r.   closest   s    zCustomPolygon.closestN)__name__
__module____qualname__r/   r   displacements_helperr    r_   propertyr7   r:   r,   r2   r?   classmethodrT   rY   r\   rf   r   r   r   r   r   r   r-   r-   r-   r.   r!      s0   

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

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