a
    1$eeq                     @   s6  d dl Z d dlZd dlZd dlmZmZmZm	Z	m
Z
 d dlZd dlmZmZmZmZ d dlmZ d dlmZmZ d dlZzd dlmZ W n" ey   G dd deZY n0 e je je jed	d
Zej j!Z"ej#dd Z$ej#g dddd Z%ej#g dddd Z&ej#ddgddd Z'dd Z(ej )ddd Z*dd Z+ej ,dddgd d! Z-d"d# Z.d$d% Z/d&d' Z0d(d) Z1d*d+ Z2d,d- Z3d.d/ Z4d0d1 Z5ej ,d2g d3d4d5 Z6d6d7 Z7d8d9 Z8d:d; Z9d<d= Z:d>d? Z;d@dA Z<ej ,dBddgdCdD Z=dEdF Z>dGdH Z?dIdJ Z@G dKdL dLZAdS )M    N)PointPolygon
LineStringGeometryCollectionbox)GeoDataFrame	GeoSeriesoverlay	read_file)PANDAS_GE_20)assert_geodataframe_equalassert_geoseries_equal)DriverErrorc                   @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r   r   X/var/www/html/django/DPS/env/lib/python3.9/site-packages/geopandas/tests/test_overlay.pyr      s   r   datar	   c                 C   sd   t tg dtg dg}t tg dtg dg}tddg|d}tddg|d}||fS )	N)r   r      r   r   r   r   r   )r      r   r   r   r   r      r       r    r"   r"   r    r"   r#      r"   r'   r'   r"   r'   r    r   col1geometrycol2r,   )r   r   r   )requests1s2df1df2r   r   r   dfs   s    



r4   )zdefault-index	int-indexstring-index)paramsc                 C   sB   |\}}| j dkr&ddg|_ddg|_| j dkr:ddg|_||fS )Nr5   r    r   r   r6   Zrow1Zrow2)paramindex)r/   r4   r2   r3   r   r   r   	dfs_index0   s    




r:   )unionintersection
differencesymmetric_differenceidentityc                 C   s   | j S Nr8   r/   r   r   r   how;   s    rC   TFc                 C   s   | j S r@   rA   rB   r   r   r   keep_geom_typeB   s    rD   c           	      C   s   | \}}t |||d}dd }|dkr^|d}|d}tj||gddd	}|d
 t|d
< n||}|dkr|d
dgjdd}n|dkr|jdd}t||dd |dkrt |||d}|jdd}|d}t||dd dS )z
    Basic overlay test with small dummy example dataframes (from docs).
    Results obtained using QGIS 2.16 (Vector -> Geoprocessing Tools ->
    Intersection / Union / ...), saved to GeoJSON
    rC   c                 S   sL   t tjtdd| }d |_|j|jdk D ]}|| 	d||< q0|S )Npolyszdf1_df2-{0}.geojsonint32int64)
r
   ospathjoinDATAformatcrscolumnsZdtypesastype)nameexpectedcolr   r   r   _readR   s    ztest_overlay.<locals>._readr?   r<   r=   TF)Zignore_indexsortr+   r;   r.   drop)check_column_typezdifference-inverseN)r	   pdconcatrP   floatsort_valuesreset_indexr   )	r:   rC   r2   r3   resultrT   Zexpected_intersectionZexpected_differencerR   r   r   r   test_overlayG   s*    	
r_   z)ignore:GeoSeries crs mismatch:UserWarningc                 C   s  t tjd}t tjtdd}t||| d}g d}| dkrN|d d }| dkrlt tjtdd	}nt tjtdd
	| }| dkr|
ddg}|jddd ||j }|jddd | dkr||j   }||jdd}||jdd}| dv rF|jd dksJ t|jt|jks8J |j|jd}i }tjj|jj|jjfi | tjj|jj|jjfi | | dkrd |jd< d |jd< | dkrd |jd< d |jd< t||ddddd d S )NnybbZ	nybb_qgiszpolydf2.shprE   )BoroCodeZBoroNameZ
Shape_LengZ
Shape_AreaZvalue1value2r=   r?   zqgis-union.shpzqgis-{0}.shpr;         T)ZinplacerW   rV   )r;   r?   r,   rO   r>   )	   r,   )rd   r,   F)	normalize	check_crsrX   check_less_precise)r
   	geopandasdatasetsget_pathrI   rJ   rK   rL   r	   rM   rW   r]   is_validra   Znotnullcopyr\   rO   lenreindexrY   testingZassert_series_equalr,   ZareaZassert_frame_equalZboundslocr   )rC   ZpolydfZpolydf2r^   colsrR   kwargsr   r   r   test_overlay_nybbu   sb    







rw   c                 C   s   t tjtdd}t tjtdd}t||| d}| dkrFt t tjtdd| }| dkrv|j	dd	 }|j
d
d}| dkr|ddgj
d
d}t||d
dd
d dS )a  
    Overlay test with overlapping geometries in both dataframes.
    Test files are created with::

        import geopandas
        from geopandas import GeoSeries, GeoDataFrame
        from shapely.geometry import Point, Polygon, LineString

        s1 = GeoSeries([Point(0, 0), Point(1.5, 0)]).buffer(1, resolution=2)
        s2 = GeoSeries([Point(1, 1), Point(2, 2)]).buffer(1, resolution=2)

        df1 = GeoDataFrame({'geometry': s1, 'col1':[1,2]})
        df2 = GeoDataFrame({'geometry': s2, 'col2':[1, 2]})

        ax = df1.plot(alpha=0.5)
        df2.plot(alpha=0.5, ax=ax, color='C1')

        df1.to_file('geopandas/geopandas/tests/data/df1_overlap.geojson',
                    driver='GeoJSON')
        df2.to_file('geopandas/geopandas/tests/data/df2_overlap.geojson',
                    driver='GeoJSON')

    and then overlay results are obtained from using  QGIS 2.16
    (Vector -> Geoprocessing Tools -> Intersection / Union / ...),
    saved to GeoJSON.
    overlapzdf1_overlap.geojsonzdf2_overlap.geojsonrE   r?   zdf1_df2_overlap-{0}.geojsonr;   Nrf   TrV   r+   r.   F)ri   rX   rk   )r
   rI   rJ   rK   rL   r	   pytestskiprM   Zilocr]   r\   r   )rC   r2   r3   r^   rR   r   r   r   test_overlay_overlap   s(    r{   other_geometryc           	      C   st  | \}}|  }|jddid}|d}|r:|jj|d< |jjdksJJ t|||d}t|||d}|jjdksvJ |dkr|jjdksJ |rd|jv sJ t|d |d dd |j	dgdd	}|jddid}|d}|r|d
kr|j
|jd}t|| |  }|jddid}|d}|r8|jj|d< |jjdksJJ t|||d}t|||d}t|| d S )Nr,   Zpolygonsrg   rE   r=   F)Zcheck_series_typer    Zaxisr<   Zgeom)rp   renameZset_geometryZcentroidr,   rQ   r	   rO   r   rW   rr   r   )	r4   rC   r|   r2   r3   df3Zres1Zres2df4r   r   r    test_geometry_not_named_geometry  s@    



r   c                 C   sD   | \}}t t t||dd W d    n1 s60    Y  d S )NZspandexrE   )ry   raises
ValueErrorr	   r4   r2   r3   r   r   r   test_bad_howH  s    r   c                 C   sT   |dkrt d | \}}|jddid}t|||d}d|jv rLd|jv sPJ d S )	Nr=   z)Difference uses columns from one df only.r.   r+   rg   rE   Zcol1_1Zcol1_2)ry   rz   r~   r	   rO   )r4   rC   r2   r3   Zdf2rresr   r   r   test_duplicate_column_nameN  s    
r   c                 C   sF   | \}}t t  t||jdd W d    n1 s80    Y  d S Nr;   rE   )ry   r   NotImplementedErrorr	   r,   r   r   r   r   test_geoseries_warningW  s    r   c                 C   sT   | \}}t |||d}|jd u s$J d}||_||_t |||d}|j|ksPJ d S )NrE   z	epsg:4326)r	   rN   )r4   rC   r2   r3   r^   rN   r   r   r   test_preserve_crs^  s    r   c                 C   sT   | \}}d|_ d|_ tjtdd t|||d W d    n1 sF0    Y  d S )Ni  i  zCRS mismatch between the CRSmatchrE   )rN   ry   warnsUserWarningr	   )r4   rC   r2   r3   r   r   r   test_crs_mismatchi  s
    r   c                 C   sb   | \}}t tg dtg dg}t|ddgd}tg g dd}t||}t||dd	 d S )
N))rf   rf   )rf   r   r   )rf   r   )r   )r   )r   r   )r   r   r    r   r,   col3)r+   r   r,   rg   Fcheck_dtyper   r   r   r	   r   )r4   r2   r3   polys3r   rR   r^   r   r   r   test_empty_intersectionq  s    


r   c           	      C   s   | \}}t tg dtg dtg dg}t|g dd}tg d}tg d}tdd|gd	d
|ggg dd}t||dd}t|| d S )Nr   )rf   r    r   r$   )rf   r"   r%   r    r   r"   r   )r   r$   r#   r!   r   )r#   r)   r(   r&   r#   r    r"   r   )r   r.   r,   rg   TrD   r   )	r4   r2   r3   r   r   i1i2rR   r^   r   r   r   test_correct_index  s    


r   c                 C   sz   | \}}t tg dtg dtg dg}td|i}tjtdd t||d d W d    n1 sl0    Y  d S )Nr   r   r%   r,    `keep_geom_type=True` in overlayr   r   )r   r   r   ry   r   r   r	   )r4   r2   r3   r   r   r   r   r   test_warn_on_keep_geom_type  s    


r   
geom_types)rF   	poly_line
poly_point	line_poly
point_polyc              
   C   s6  t tg dtg dg}tddg|d}t tg dtg dtg dg}t|g dd}t tg d	td
dgg}tddg|d}t tdtdg}	tddg|	d}
|dkrt||| |d}nl|dkrt||| |d}nR|dkr
t||
| |d}n6|dkr&t||| |d}n|dkr@t|
|| |d}zttj	t
ddj|| |d}t|j|jks|J dtt|jdh }|j|ddjdd}|j|ddjdd}t||dddddd  W n\ ty   |jsJ Y n> ty   |jsJ Y n  ty0   |js,J Y n0 d!S )"a  
    Test of mixed geometry types on input and output. Expected results initially
    generated using following snippet.

        polys1 = gpd.GeoSeries([Polygon([(1, 1), (3, 1), (3, 3), (1, 3)]),
                                Polygon([(3, 3), (5, 3), (5, 5), (3, 5)])])
        df1 = gpd.GeoDataFrame({'col1': [1, 2], 'geometry': polys1})

        polys2 = gpd.GeoSeries([Polygon([(1, 1), (3, 1), (3, 3), (1, 3)]),
                                Polygon([(-1, 1), (1, 1), (1, 3), (-1, 3)]),
                                Polygon([(3, 3), (5, 3), (5, 5), (3, 5)])])
        df2 = gpd.GeoDataFrame({'geometry': polys2, 'col2': [1, 2, 3]})

        lines1 = gpd.GeoSeries([LineString([(2, 0), (2, 4), (6, 4)]),
                                LineString([(0, 3), (6, 3)])])
        df3 = gpd.GeoDataFrame({'col3': [1, 2], 'geometry': lines1})
        points1 = gpd.GeoSeries([Point((2, 2)),
                                 Point((3, 3))])
        df4 = gpd.GeoDataFrame({'col4': [1, 2], 'geometry': points1})

        params=["union", "intersection", "difference", "symmetric_difference",
                "identity"]
        stricts = [True, False]

        for p in params:
            for s in stricts:
                exp = gpd.overlay(df1, df2, how=p, keep_geom_type=s)
                if not exp.empty:
                    exp.to_file('polys_{p}_{s}.geojson'.format(p=p, s=s),
                                driver='GeoJSON')

        for p in params:
            for s in stricts:
                exp = gpd.overlay(df1, df3, how=p, keep_geom_type=s)
                if not exp.empty:
                    exp.to_file('poly_line_{p}_{s}.geojson'.format(p=p, s=s),
                                driver='GeoJSON')
        for p in params:
            for s in stricts:
                exp = gpd.overlay(df1, df4, how=p, keep_geom_type=s)
                if not exp.empty:
                    exp.to_file('poly_point_{p}_{s}.geojson'.format(p=p, s=s),
                                driver='GeoJSON')
    r   r%   r    r   r*   r   r   )r,   r.   )r   r      r   )r   r"   )r   r"   )r   r,   r   r#   )Zcol4r,   rF   )rC   rD   r   r   r   r   strictz{t}_{h}_{s}.geojson)thszColumn name mismatchr,   r   r}   TrV   F)ri   rX   rk   rj   r   N)r   r   r   r   r   r	   r
   rI   rJ   rK   rL   rM   allrO   listsetr\   r]   r   r   emptyOSErrorRuntimeError)rC   rD   r   polys1r2   polys2r3   Zlines1r   Zpoints1r   r^   rR   ru   r   r   r   test_overlay_strict  sp    0









r   c                  C   s   t tg dtg dg} tddg| d}t tg dtg dg}tddg|d}tt t||dd W d    n1 s0    Y  d S )Nr   r%   r    r   r*   Tr   )r   r   r   r   ry   r   r   r	   )r   r2   mixedZdfmixedr   r   r   test_mixed_geom_error  s    



r   c                  C   s   t ttg dtg dg} tdg| d}t tg dtg dg}tddg|d}tt t||dd W d    n1 s0    Y  d S )Nr   r%   r   r*   r    Tr   )	r   r   r   r   r   ry   r   	TypeErrorr	   )ZgcolZdfcolr   r2   r   r   r   test_keep_geom_type_error,  s     



r   c                  C   s   t tjtdd} t tjtdd}tjtdd t| |d d}W d    n1 sZ0    Y  t	|dkstJ |j
dk sJ t| |d	d}t	|dksJ |j
dk sJ t| |d
d}t	|dksJ |j
dk sJ d S )N	geom_typezdf1.geojsonzdf2.geojsonr   r   r   r    r   TFr   )r
   rI   rJ   rK   rL   ry   r   r   r	   rq   r   r   )r2   r3   r<   r   r   r   'test_keep_geom_type_geometry_collectionA  s    ,r   c                  C   s(  t ddddt ddddt ddddg} t ddddt ddddt ddddg}tddg| d}tddg|d}t||d	d
}tddgddgt ddddt ddddgd}t|| t||dd
}tg dg dt ddddtddtt ddddtddgggd}t|| d S )Nr   r    r"   r'   r   r   leftr,   rightr,   Tr   r   r   r,   F)r   r    r    )r   r   r    r!   )r"   r   )r   r;   r   r	   r   r   r   r   r   r   r2   r3   result1	expected1r   r   r   (test_keep_geom_type_geometry_collection2U  s6    
r   c               	   C   s   t ddddt ddddg} tg dt ddddg}tddg| d	}tddg|d
}t||dd}tdgdgt ddddgd}t|| t||dd}tddgddgttddgtddgt ddddgd}t|| d S )Nr   r    r"   
      ))r    r   )r"   r   r#   r$   r    r   r   )r   r    r         r   r   Tr   r   Fr   r$   )r   r   r   r	   r   r   r   r   )r   r   r2   r3   r   r   Zresult2Z	expected2r   r   r   ,test_keep_geom_type_geomcoll_different_types{  s0    


r   c                  C   s   t ddddt ddddg} t ddddt ddddt ddddg}tddg| d}tddg|d}t||dd	d
}tdgt ddddgd}t|| d S )Nr   r    r   r"   g       @r   r   Tr=   )rD   rC   )r   r;   r   r	   r   r   r   r   r   2test_keep_geom_type_geometry_collection_difference  s    	r   
make_validc                 C   s   t g d}|jrJ |d}|js*J tdgttddddgd}tddgt||gd}| rt||| d}|jd	 |sJ |jd
 |sJ n<t	j
tdd t||| d W d    n1 s0    Y  d S )N)r   )rh   rh   )rh   r    )r    rh   r   r   regionr   r*   invalidZvalid)r   )r   r,   )r    r,   z1 invalid input geometriesr   )r   ro   bufferr   r   r   r	   atequalsry   r   r   )r   ZbowtieZfixed_bowtier2   Z	df_bowtieZdf_overlay_bowtier   r   r   test_overlap_make_valid  s    


 r   c                  C   sV   t t jd} |  }|d|_t | |}tg d| j	d}t
||dd d S )Nr`   i -1)	Z
BoroCode_1Z
BoroName_1ZShape_Leng_1ZShape_Area_1Z
BoroCode_2Z
BoroName_2ZShape_Leng_2ZShape_Area_2r,   )rO   rN   Fr   )rl   r
   rm   rn   rp   	translater,   r	   r   rN   r   )r`   Znybb2r^   rR   r   r   r   0test_empty_overlay_return_non_duplicated_columns  s    r   c                 C   s6  t g d}t g d}tdg|gd}tdg|gd}t||| d}| dkrtr\d }ntjg d	d
}ttjg dd
tjg dd
g d|d}n| dkrtdtjgtjdg||gd}nj| dkrtdgtjg|gd}nH| dkrtdtjgtjdg||gd}n| dkr(tdg|gd}t	|| d S )Nr   r%   r    r*   r   r-   rE   r<   object)ZdtyperH   )r+   r.   r,   )r9   r;   r?   g      ?r>   r=   )
r   r   r	   r   rY   Indexnparraynanr   )rC   p1p2r2   r3   r^   r9   rR   r   r   r   test_non_overlapping  sX    

r   c                  C   sr   t dd tdD } tdg di| d}tdg di| d	d}tg d
d}t||dd}t||dd d S )Nc                 S   s   g | ]}t ||d qS )g?)r   r   ).0xr   r   r   
<listcomp>      z(test_no_intersection.<locals>.<listcomp>r"   foo)abcr,   bar)135r    )r   r   r,   rg   r<   rE   F)Zcheck_index_type)r   ranger   r   r	   r   )gsZgdf1Zgdf2rR   r^   r   r   r   test_no_intersection  s    r   c                   @   sL   e Z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 )TestOverlayWikiExamplec                 C   s  t tddddgd| _t tddddgd| _t tddddgd| _t tddddtg dtg dgd| _t tg dgd| _t tg dgd| _t tg dtg dgd| _	t tddddtg dgd| _
t tddddtg dgd| _d S )	Nr   r   r   r   r   r   )r   r   )r   r   )r   r   r   r   r   )r   r   )r   r   r   )r   r   r   )r   r   r   )r   r   layer_alayer_br<   r   r;   a_difference_bb_difference_ar>   a_identity_bb_identity_a)selfr   r   r   setup_method)  s>    






z#TestOverlayWikiExample.setup_methodc                 C   s*   t | j| jdd}|| j s&J d S )Nr<   rE   )r	   r   r   Zgeom_equalsr<   boolr   Z	df_resultr   r   r   test_intersectionW  s    z(TestOverlayWikiExample.test_intersectionc                 C   s"   t | j| jdd}t|| j d S r   )r	   r   r   r   r;   r   r   r   r   
test_union[  s    z!TestOverlayWikiExample.test_unionc                 C   s"   t | j| jdd}t|| j d S Nr=   rE   )r	   r   r   r   r   r   r   r   r   test_a_difference_b_  s    z*TestOverlayWikiExample.test_a_difference_bc                 C   s"   t | j| jdd}t|| j d S r   )r	   r   r   r   r   r   r   r   r   test_b_difference_ac  s    z*TestOverlayWikiExample.test_b_difference_ac                 C   s"   t | j| jdd}t|| j d S )Nr>   rE   )r	   r   r   r   r>   r   r   r   r   test_symmetric_differenceg  s    z0TestOverlayWikiExample.test_symmetric_differencec                 C   s"   t | j| jdd}t|| j d S Nr?   rE   )r	   r   r   r   r   r   r   r   r   test_a_identity_bk  s    z(TestOverlayWikiExample.test_a_identity_bc                 C   s"   t | j| jdd}t|| j d S r   )r	   r   r   r   r   r   r   r   r   test_b_identity_ao  s    z(TestOverlayWikiExample.test_b_identity_aN)r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   r   (  s   .r   )BrI   numpyr   ZpandasrY   Zshapely.geometryr   r   r   r   r   rl   r   r   r	   r
   Zgeopandas._compatr   Zgeopandas.testingr   r   ry   Zfiona.errorsr   ImportError	ExceptionrJ   rK   abspathdirname__file__rL   markZskip_no_sindexZ
pytestmarkZfixturer4   r:   rC   rD   r_   filterwarningsrw   r{   Zparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sl    




.

k9
-	
t& 
8