
    jj5G                        S r SSKrSSKrSSKrSSKJrJrJ	r	J
r
JrJrJr  SSKrSSKJrJrJr  SSKJrJr  SSKJr  SSKJr  SSKrSSKJrJr  SS	KJr  / S
QrSS/r \RB                  S 5       r"\RB                  S 5       r#\RB                  S 5       r$\RB                  S 5       r%\RB                  S 5       r&\RB                  S 5       r'\RB                  S 5       r(\RB                  S 5       r)\RB                  S 5       r*\RB                  S 5       r+\RB                  S 5       r,\RB                  S 5       r-\RB                  S 5       r.\RB                  S 5       r/\RB                  S 5       r0\RB                  S 5       r1\RB                  S 5       r2\RB                  S 5       r3\RB                  S 5       r4S  r5S! r6\Rn                  Rq                  S"\5       " S# S$5      5       r9S% r:S& r;\Rn                  Ry                  \(       + S'S(9S) 5       r=S* r>S+ r?\Rn                  Rq                  S"\ 5      S, 5       r@\Rn                  R                  S-5      \Rn                  Rq                  S.\" 5       \R                  4S/-  \R                  S\R                  S04\" \" 5       \" 5       /S1S29\" \" 5       \" 5       /S1S29R                  5       \" / S1S29\" / S1S29R                  5       /5      S3 5       5       rDS4 rEg)5zTests for the clip module.    N)GeometryCollection
LinearRing
LineString
MultiPointPointPolygonbox)GeoDataFrame	GeoSeriesclip)
HAS_PYPROJPANDAS_INFER_STR)POLYGON_GEOM_TYPES)_mask_is_list_like_rectangle)assert_geodataframe_equalassert_geoseries_equal)assert_index_equal)single_rectangle_gdf single_rectangle_gdf_list_bounds!single_rectangle_gdf_tuple_bounds!single_rectangle_gdf_array_boundslarger_single_rectangle_gdf"larger_single_rectangle_gdf_boundsc                      [         R                  " SS/SS/SS/SS//5      n [        U  Vs/ s H  n[        U5      PM     snS/S	S
9nU$ s  snf )Create a point GeoDataFrame.         	      igeometry	EPSG:3857columnscrsnparrayr
   r   ptsxygdfs      b/var/www/html/Sattelite-Image/venv/lib/python3.13/site-packages/geopandas/tools/tests/test_clip.py	point_gdfr/   '   sX     ((QFQFQFS#J7
8C
C0Cbb	C0:,K
XCJ 1s   Ac            	          [         R                  " SS/SS/SS/SS/SS/SS//5      n [        U  Vs/ s H  n[        U5      PM     snS/SS	9nU$ s  snf )
r      r   r   r   r      r"   r#   r$   r'   r*   s      r.   
point_gdf2r3   /   sd     ((QFQFQFQFQFQFC
DC
C0Cbb	C0:,K
XCJ 1s   Ac                      [         R                  " SS/SS/SS//5      n [        U  Vs/ s H  n[        U5      PM     snS/SS9nU$ s  snf )zCreate a point GeoDataFrame. Its points are all outside the single
rectangle, and its bounds are outside the single rectangle's.r1         r"   r#   r$   r'   r*   s      r.   pointsoutside_nooverlap_gdfr7   7   sR     ((QGb"XBx0
1C
C0Cbb	C0:,K
XCJ 1   Ac                      [         R                  " SS/SS/SS//5      n [        U  Vs/ s H  n[        U5      PM     snS/SS9nU$ s  snf )zCreate a point GeoDataFrame. Its points are all outside the single
rectangle, and its bounds are overlapping the single rectangle's.r1   r5   r"   r#   r$   r'   r*   s      r.   pointsoutside_overlap_gdfr:   @   sR     ((QGb"XAw/
0C
C0Cbb	C0:,K
XCJ 1r8   c                  D    [        / SQ5      n [        S/U /SS9nSUS'   U$ )z'Create a single rectangle for clipping.r   r   )r   
   )r>   r>   r>   r   r=   r2   r#   r"   r&   site-boundaryattr2r   r
   poly_intersr-   s     r.   r   r   I   s/     FGK
sk]
DC"CLJ    c                 ,    [        U R                  5      $ z&Bounds of the created single rectangletupletotal_boundsr   s    r.   r   r   R   s     %2233rF   c                 ,    [        U R                  5      $ rH   )listrK   rL   s    r.   r   r   X   s     $1122rF   c                     U R                   $ rH   )rK   rL   s    r.   r   r   ^   s      ,,,rF   c                  F    [        / SQ5      n [        S/U /SS9nS/US'   U$ )zCreate a slightly larger rectangle for clipping.
The smaller single rectangle is used to test the edge case where slivers
are returned when you clip polygons. This fixture is larger which
eliminates the slivers in the clip return.
)rR   )rR   r5   )r5   r5   )r5   rR   rQ   r2   r#   r@   z
study arearB   rC   rD   s     r.   r   r   d   s1     LMK
sk]
DC >CLJrF   c                 ,    [        U R                  5      $ rH   rI   )r   s    r.   r   r   q   s     ,99::rF   c                 <    U nUR                  S5      US'   SUS'   U$ )z(Buffer points to create a multi-polygon.r   r"   plottype)buffer)r/   buffered_locss     r.   buffered_locationsrY   w   s.     M - 4 4Q 7M*"M&rF   c                 0    [         R                  " XSS9nU$ )z4Make a geometry with a hole in the middle (a donut).symmetric_difference)how)	geopandasoverlay)rY   r   donuts      r.   donut_geometryr`      s!     6LE LrF   c                  V    [        / SQ5      n [        / SQ5      n[        SS/X/SS9nU$ )zCreate Line Objects For Testing)r2   r2   r   r   r   r   r1   r   )r   r   )r1         r   r>   r1   r   g      @r2   r   r#   r@   r   r
   linealinebr-   s      r.   two_line_gdfrp      s3     78ECDE
1vK
HCJrF   c                 X    U R                  5       n[        [        U5      SS9nS/US'   U$ )z$Create a multi-polygon GeoDataFrame.r#   r@   poolattr)	union_allr
   r   )r`   
multi_polyout_dfs      r.   multi_poly_gdfrw      s3      ))+J9Z#8kJFXF6NMrF   c                 v    U R                  5       n[        / SQ5      n[        [        X/5      SS9nSS/US'   U$ )zRCreate a multi-line GeoDataFrame.
This GDF has one multiline and one regular line.))r   r2   )r   r2   )r   r2   r1   r   r#   r@   roadstreamrs   )rt   r   r
   r   )rp   multiline_featlinecrv   s       r.   
multi_liner~      sD    
 "++-N78E9n-D#E;WFh'F6NMrF   c                     U R                  5       n[        [        U[        SS5      [        SS5      [        SS5      /5      SS9n/ S	QUS
'   U$ )z"Create a multi-point GeoDataFrame.r   r1   iiir!   r#   r@   )treezanother treeshrubberriesrs   )rt   r
   r   r   )r/   multi_pointrv   s      r.   r   r      sX     %%'K%1+uS#c3H
 	F BF6NMrF   c                      [        SS5      n [        / SQ5      n[        / SQ5      n[        / SQ5      n[	        / SQXX/SS9nU$ )1Create a Mixed Polygon and LineString For Testingr   r   rb   rc   rd   re   )ri   r2   rf   ry   rh   rj   rk   )r2   r   r   r   r#   r@   )r   r   r   r   r
   )pointlinepolyringr-   s        r.   	mixed_gdfr      sM     !QKE?@D?@D?@D
T8kC JrF   c                  j    [        SS5      n [        / SQ5      n[        X/5      n[        S/U/SS9nU$ )r   r   r   r   r2   r#   r@   )r   r   r   r
   )r   r   collr-   s       r.   geomcol_gdfr      s=     !QKE?@Dum,D
sdV
=CJrF   c                  V    [        / SQ5      n [        / SQ5      n[        SS/X/SS9nU$ )z4Create a line that will create a point when clipped.)rj   )   r1   )r5   r1   r   r2   r   r#   r@   rl   rm   s      r.   sliver_liner      s3     23E@AE
1vK
HCJrF   c                    [         R                  " [        5         [        SU 5        SSS5        [         R                  " [        5         [        U S5        SSS5        [         R                  " [        5         [        U S5        SSS5        [         R                  " [        5         [        U S5        SSS5        g! , (       d  f       N= f! , (       d  f       N~= f! , (       d  f       N`= f! , (       d  f       g= f)z/Non-GeoDataFrame inputs raise attribute errors.)r   r   Nfoobar)r2   r   r   )r2   r   r   r   r1   )pytestraises	TypeErrorr   rL   s    r.   test_not_gdfr      s    	y	!V)* 
"	y	!!8, 
"	y	!!9- 
"	y	!!?3 
"	! 
"	!	!	!	!	!	!	!s/   B>
C9C (C1>
C
C 
C.1
C?c                  <   [        / SQ5      n [        S/U /SS9nUR                  5       nUR                  R	                  S 5      n[        X5      n[        X1R                  SS 5        [        UR                  U5      n[        U[        UR                  S95        g)	zCTest that a bounding box returns empty if the extents don't overlap)r=   )r   r2   rb   )r2   r   r=   r2   r#   r@   c                 >    [         R                  R                  U SS9$ )Nr6   )xoff)shapelyaffinity	translate)xs    r.   <lambda>,test_non_overlapping_geoms.<locals>.<lambda>   s    '"",,QR,8rF   Nr   r&   )r   r
   copyr"   applyr   r   ilocr   r   r&   )unit_boxunit_gdfnon_overlapping_gdfoutout2s        r.   test_non_overlapping_geomsr      s    ?@HQC8*+FH"--/-66<<8 x
-Cc==!#45!!#67D4x||!<=rF   mask_fixture_namec                       \ rS rSr\R
                  S 5       rS rS rS r	S r
S rS rS	 rS
 rS rS rS rS rS rS rS rS rS rS rSrg)TestClipWithSingleRectangleGdf   c                 $    UR                  U5      $ )N)getfixturevalue)selfr   requests      r.   mask#TestClipWithSingleRectangleGdf.mask   s    &&'899rF   c                 H    [        X5      n[        U[        5      (       d   eg)z?Test that function returns a GeoDataFrame (or GDF-like) object.N)r   
isinstancer
   r   r/   r   r   s       r.   test_returns_gdf/TestClipWithSingleRectangleGdf.test_returns_gdf   s    9##|,,,,rF   c                 ^    [        UR                  U5      n[        U[        5      (       d   eg)z>Test that function returns a GeoSeries if GeoSeries is passed.N)r   r"   r   r   r   s       r.   test_returns_series2TestClipWithSingleRectangleGdf.test_returns_series   s'    9%%t,#y))))rF   c                     [        X5      n[        R                  " SS/SS/SS//5      n[        U Vs/ s H  n[	        U5      PM     snS/SS9n[        X65        g	s  snf )
;Test clipping a points GDF with a generic polygon geometry.r   r   r   r   r    r"   r#   r$   N)r   r(   r)   r
   r   r   )r   r/   r   clip_ptsr+   r,   exps          r.   test_clip_points/TestClipWithSingleRectangleGdf.test_clip_points   sb    	(hhAAA/0!$%2U2Y%
|
 	"(0 &s   Ac                     UR                  S5      n[        X25      n[        R                  " SS/SS/SS//5      n[	        U Vs/ s H  n[        U5      PM     snS/SSS9n[        XG5        g	s  snf )
r   	geometry2r   r   r   r   r    r#   )r%   r&   r"   N)rename_geometryr   r(   r)   r
   r   r   )r   r/   r   point_gdf_geom_col_renamer   r+   r,   r   s           r.    test_clip_points_geom_col_rename?TestClipWithSingleRectangleGdf.test_clip_points_geom_col_rename  sy    $-$=$=k$J!18hhAAA/0!$%2U2Y% M 	
 	"(0 &s   A/c                     [        X5      n[        UR                  5      S:X  d   e[        UR                  S:H  5      (       d   eg<Test clipping a polygon GDF with a generic polygon geometry.r   r   N)r   lenr"   all	geom_typer   rY   r   clipped_polys       r.   test_clip_poly-TestClipWithSingleRectangleGdf.test_clip_poly  sB    .5<(()Q...<))Y67777rF   c                     UR                  S5      n[        X25      n[        UR                  5      S:X  d   eSUR	                  5       ;  d   eSUR	                  5       ;   d   eg)r   r   r   r"   N)r   r   r   r"   keys)r   rY   r   poly_gdf_geom_col_renamer   s        r.   test_clip_poly_geom_col_rename=TestClipWithSingleRectangleGdf.test_clip_poly_geom_col_rename  sg     $6#E#Ek#R 4;<(()Q...!2!2!4444l//1111rF   c                     [        UR                  U5      n[        U5      S:X  d   e[        UR                  S:H  5      (       d   egr   )r   r"   r   r   r   r   s       r.   test_clip_poly_series4TestClipWithSingleRectangleGdf.test_clip_poly_series$  sD    .77>< A%%%<))Y67777rF   c                    [        XSS9n[        U5      (       a  UOUR                  n[        R                  " UR                  U5      (       d   eUR
                  R                  [        5      R                  5       (       d   eg)Test a multi poly object where the return includes a sliver.
Also the bounds of the object should == the bounds of the clip object
if they fully overlap (as they do in these fixtures).Tkeep_geom_typeN)	r   r   rK   r(   array_equalr   isinr   r   )r   rw   r   clippedexpected_boundss        r.   "test_clip_multipoly_keep_geom_typeATestClipWithSingleRectangleGdf.test_clip_multipoly_keep_geom_type*  sp     ~DA066DD<M<M 	 ~~g22ODDDD!!&&'9:??AAAArF   c                 D    [        X5      nUR                  S   S:X  d   eg)zKTest that clipping a multiline feature with a poly returns expected
output.r   MultiLineStringNr   r   )r   r~   r   r   s       r.   test_clip_multiline2TestClipWithSingleRectangleGdf.test_clip_multiline6  s(     z(  #'8888rF   c                    [        X5      nUR                  S   S:X  d   e[        US5      (       d   e[        U5      S:X  d   e[	        [        SS5      [        SS5      [        SS5      /5      nUR                  S   R                  R                  UR                  :X  d   e[        U5      (       a  [        U6 OUR                  5       n[        UR                  U5      5      (       d   eg	)
z~Clipping a multipoint feature with a polygon works as expected.
should return a geodataframe with a single multi point featurer   r   rs   r   r   r   r   r    N)r   r   hasattrr   r   r   r   r"   wktr   r	   rt   r   
intersects)r   r   r   r   clipped_mutltipointshape_for_pointss         r.   test_clip_multipoint3TestClipWithSingleRectangleGdf.test_clip_multipoint<  s     {)  #|333w''''7|q   (aaa
 ||A''++/B/F/FFFF6t<<CJ$..BR 	 7%%&678888rF   c                 P    [        X5      n[        UR                  5      S:X  d   eg)z;Test what happens when you give the clip_extent a line GDF.r   N)r   r   r"   )r   rp   r   	clip_lines       r.   test_clip_lines.TestClipWithSingleRectangleGdf.test_clip_linesQ  s%    ,	9%%&!+++rF   c                     [        X5      nUR                  S   S:X  a&  UR                  S   S:X  a  UR                  S   S:X  d   eg)z"Test clipping a mixed GeoDataFramer   r   r2   r   r   r   Nr   r   r   r   r   s       r.   test_mixed_geom.TestClipWithSingleRectangleGdf.test_mixed_geomV  sR    y'a G+!!!$	1!!!$4	
54rF   c                     [        UR                  U5      nUR                  S   S:X  a&  UR                  S   S:X  a  UR                  S   S:X  d   eg)zTest clipping a mixed GeoSeriesr   r   r2   r   r   r   N)r   r"   r   r   s       r.   test_mixed_series0TestClipWithSingleRectangleGdf.test_mixed_series_  sZ    y))40a G+!!!$	1!!!$4	
54rF   c                     [        XSS9n[        UR                  5      S:X  d   eUR                  S:H  R	                  5       (       a   eg)zWhen the output of a clipped line returns a geom collection,
and keep_geom_type is True, no geometry collections should be returned.Tr   r2   r   N)r   r   r"   r   any)r   r   r   r   s       r.   test_clip_with_line_extra_geom=TestClipWithSingleRectangleGdf.test_clip_with_line_extra_geomh  sM     {>7##$)))%%)==BBDDDDDrF   c                 <    [        X5      n[        U5      S:X  d   eg)z>Test clip when intersection is empty and boxes do not overlap.r   Nr   r   )r   r7   r   r   s       r.   test_clip_no_box_overlap7TestClipWithSingleRectangleGdf.test_clip_no_box_overlapp  s    297|q   rF   c                 <    [        X5      n[        U5      S:X  d   eg)z:Test clip when intersection is empty and boxes do overlap.r   Nr  )r   r:   r   r   s       r.   test_clip_box_overlap4TestClipWithSingleRectangleGdf.test_clip_box_overlapu  s    077|q   rF   c                     [         R                  " [        5         [        XSS9  SSS5        g! , (       d  f       g= f)zOTest the correct warnings are raised if keep_geom_type is
called on a mixed GDFTr   Nr   warnsUserWarningr   )r   r   r   s      r.   test_warning_extra_geoms_mixed=TestClipWithSingleRectangleGdf.test_warning_extra_geoms_mixedz  s&     \\+&6 '&&   /
=c                     [         R                  " [        5         [        XSS9  SSS5        g! , (       d  f       g= f)zaTest the correct warnings are raised if keep_geom_type is
called on a GDF with GeometryCollectionTr   Nr
  )r   r   r   s      r.   test_warning_geomcoll4TestClipWithSingleRectangleGdf.test_warning_geomcoll  s&     \\+&48 '&&r   N)__name__
__module____qualname____firstlineno__r   fixturer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  __static_attributes__r  rF   r.   r   r      st    ^^: :-
*
11828
B99*,


E!
!
79rF   r   c                 n    [        X5      nSUR                  S   :X  d   eSUR                  S   :X  d   eg)zNTest the correct output if a point is returned
from a line only geometry type.r   r   r   r2   Nr   )r   r   r   s      r.   test_clip_line_keep_sliversr    s@     ;5Gg''****7,,Q////rF   c                     [        X5      n[        R                  " UR                  UR                  5      (       d   eSUR                  S   ;   d   eg)r   r   r   N)r   r(   r   rK   r   )rw   r   r   s      r.    test_clip_multipoly_keep_sliversr    sK     >8G>>'..0D0Q0QRRRR7#4#4Q#7777rF   zpyproj not available)reasonc                     [         R                  " [        SS9   [        XR	                  S5      5        S S S 5        g ! , (       d  f       g = f)NzCRS mismatch between the CRS)matchi  )r   r  r  r   to_crs)r/   r   s     r.   test_warning_crs_mismatchr"    s1    	k)G	HY33D9: 
I	H	Hs	   >
Ac                     [        / SQ5      n[        X5      nUR                  [        / SQ5      5      n[        S/U/SS9nSUS'   [	        X$5        g)	z%Test clip when using a shapely object)r=   )r1   ri   r?   r=   r<   r2   r#   r@   rA   rB   N)r   r   intersectionr
   r   )r   polygonr   exp_polyr   s        r.   test_clip_with_polygonr'    sV    89G'1G##<=H shZ[
AC"CLg+rF   c                 ~    U R                  SS9R                  5       n[        X5      nUR                  S   S:X  d   eg)z,Test clipping a polygon with a multipolygon.rV   byr   r   N)dissolvereset_indexr   r   )rY   r   multir   s       r.   test_clip_with_multipolygonr.    sB    ''6'2>>@E'/GQ9,,,rF   c                     UR                  U5      nU R                  SS9R                  5       n[        XC5      nUR                  S   S:X  d   eg)zSWhen clipping a multi-polygon feature, no additional geom types
should be returned.rV   r)  r   r   N)r   r+  r,  r   r   )rY   r   r   masksr-  r   s         r.   )test_clip_single_multipoly_no_extra_geomsr1    sT     ##$56E''6'2>>@E5 GQ9,,,rF   z ignore:All-NaN slice encounteredr   r   r2   r#   r   c                     [        X5      n[        / SS/SS9n[        (       a  UR                  SS05      n[	        UUSS9  [        U R
                  U5      n[        U[        / SS95        g	)
z;Test that clipping with empty mask returns an empty result.r"   rV   r#   r$   strF)check_index_typer   N)r   r
   r   astyper   r"   r   r   )rY   r   r   expecteds       r.   test_clip_empty_maskr7    sq     %,GBV(<+NH??FE?3
 %..5G7Ibk$BCrF   c                    [         R                  R                  SSSS5      nU R                  U5      nU R                  USS9n[        R
                  " / SQ5      n[        UR                  5      UR                  :H  R                  5       (       a   e[        UR                  5      UR                  :H  R                  5       (       d   e[        XCR                  5        g)zTest the sorting kwarg in clipr   r   T)sort)r2   r   r1   N)
r   r"   r	   r   pdIndexsortedindexr   r   )r3   bboxunsorted_clipped_gdfsorted_clipped_gdfexpected_sorted_indexs        r.   test_clip_sortingrB    s    1a+D%??40#D9HHY/+1126J6P6PPUUWWWW%++,0B0H0HHMMOOOO,.F.FGrF   )F__doc__numpyr(   pandasr:  r   shapely.geometryr   r   r   r   r   r   r	   r]   r
   r   r   geopandas._compatr   r   geopandas.arrayr   geopandas.tools.clipr   r   geopandas.testingr   r   pandas.testingr   mask_variants_single_rectanglemask_variants_large_rectangler  r/   r3   r7   r:   r   r   r   r   r   r   rY   r`   rp   rw   r~   r   r   r   r   r   r   markparametrizer   r  r  skipifr"  r'  r.  r1  filterwarningsnanto_framer7  rB  r  rF   r.   <module>rT     s           3 3 : . =  O -"  "(!            4 4
 3 3
 - -
 	 	 ; ;
           
 
 	 	    	4> ,.LMT9 T9 NT9n08 
N+AB; C;
	,- !-	- >?
			A	BFFA79gi(k:79gi(k:CCE"+&"+&//1D @D
HrF   