
    Ch3B                         S SK r S SKJr  S SKrS SKrS SKJrJ	r	  S SK
Jr  S SKJrJrJrJrJr  S rS rS rS	 rS
 rS rSS jrS rg)    N)reduce)GeoDataFrame	GeoSeries)PANDAS_GE_30)LINE_GEOM_TYPESPOINT_GEOM_TYPESPOLYGON_GEOM_TYPES
_check_crs_crs_mismatch_warnc                    U R                   S:X  do  [        (       a3  SU R                  ;   a  U R                  SSS9n U R	                  S5      n U $ SU R                  ;   a  U R                  SSSS9  U R	                  SSS9  U $ )ztEnsure that the geometry column is called 'geometry'.

If another column with that name exists, it will be dropped.
geometry   axisTr   inplace)r   )_geometry_column_namer   columnsdroprename_geometry)dfs    jC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\venv\Lib\site-packages\geopandas/tools/overlay.py_ensure_geometry_columnr      s    
 ##z1<RZZ'WWZaW0##J/B
 I RZZ'
D9z48I    c                    UR                   R                  U R                  SSS9u  p#UR                  S:  GaU  UR                  S:  GaD  U R                  R	                  U5      nUR                  SSS9  UR                  R	                  U5      nUR                  SSS9  UR                  U5      nUR                  R                  [        5      nXg   R                  5       UR                  U'   [        R                  " X#S.5      nUn	U R                  SS9n UR                  SS9nUR                  U R                  U R                   SS	9S
SS9n
U
R                  UR                  UR                   SS	9SSSS9n
[#        XU R$                  S9$ U R&                  SS R                  UR&                  SS R                  UR                  R(                  SS	9SSSS9n[*        R,                  US
'   [*        R,                  US'   UUR.                  R                  U R                  R(                  5      R1                  5       U R                  R(                  /-      $ )z8Overlay Intersection operation used in overlay function.
intersectsT	predicatesortr   r   r   )__idx1__idx2r   r   r   r!   )left_onright_indexr"   _1_2)r$   r%   suffixesr   crsN
left_indexr%   r)   )sindexqueryr   sizetakereset_indexintersection	geom_typeisinr	   
make_validlocpd	DataFramemerger   r   r   r+   ilocnamenpnanr   tolist)df1df2idx1idx2leftrightintersectionspoly_ixpairs_intersectgeom_intersectdfinterresults               r   _overlay_intersectionrL   #   s.    !!#,,,T!RJDyy1}Q||  &dD1!!$'tT2))%0))../AB%2%;%F%F%H'" ,,$'GH& oo4o(oo4o(!''HHS..QH7 ( 

 --HHS..QH7!	   
 G#''JJ"1##HHRaLcll//a8!	 $ 
 66x66xNN 1 1299;s||?P?P>QQ
 	
r   c           	      X   UR                   R                  U R                  SSS9u  p#[        R                  " USS9u  pE[        R
                  " X5SS 5      n[        U R                  R                  5       Vs/ s H  nXt;   a  UR                  S5      O/ PM     nn/ n	[        U R                  U5       HG  u  p[        S U
/[        UR                  R                  U   5      -   5      nU	R                  U5        MI     [        XR                  U R                   S	9nUR"                  R%                  [&        5      nX   R)                  5       UR*                  U'   XR,                  )    R/                  5       nXR,                  )    R/                  5       nUUUR0                  '   U$ s  snf )
z6Overlay Difference operation used in overlay function.r   Tr   )return_indexr   Nr   c                 $    U R                  U5      $ )N)
difference)xys     r   <lambda>%_overlay_difference.<locals>.<lambda>a   s    ar   )indexr+   )r.   r/   r   r=   uniquesplitranger0   popzipr   listr;   appendr   rU   r+   r4   r5   r	   r6   r7   is_emptycopyr   )r@   rA   rB   rC   idx1_uniqueidx1_unique_indices
idx2_splitidxsidxnew_ggeom
neighboursnewdifferencesrG   	geom_diffdfdiffs                    r   _overlay_differencerk   S   s}    !!#,,,T!RJD')yyD'I$K$AB 78J **++C !/
qR7+ 	 
 Ed3(4&48I8I*8U3V*V
 	S	 4
 E@K##(();<G*3>>@KOOG1112779I&&&',,.F+4F6''(M#s   9"F'c                 t   [        X5      n[        X5      n[        U5      nUR                   Vs/ s H  nXBR                  ;   a  UOU S3PM     nnXSl        [        R
                  " X#/SSS9n[        UR                  5      nUR                  S5        UR                  S5        UR                  US9$ s  snf )z4Overlay Identity operation used in overlay function.r'   TFignore_indexr   r   r   )
rL   rk   r   r   r8   concatr[   remover\   reindex)r@   rA   dfintersectiondfdifferencecolnew_columnsrK   r   s           r   _overlay_identityrw   m   s    *34N&s0L*<8L  '''C ,,,SE*<'   ' YY5DuUF >))*GNN:NN:>>'>**s    B5c                 z   [        X5      n[        X5      n[        [        U5      5      US'   [        [        U5      5      US'   [        R                  US'   [        R                  US'   [        U5      n[        U5      nUR                  USS/SSS9nUR                  R                  5       nSUl	        UR                  UR                  R                  5       S4   UR                  UR                  R                  5       '   UR                  SS/S	S
S9  UR                  S
S
S9  [        XEU R                  S9nU$ )z@Overlay Symmetric Difference operation used in overlay function.r!   r"   outerr&   )onhowr)   r   
geometry_2
geometry_1r   Tr   r    r*   )rk   rX   lenr=   r>   r   r:   r}   r^   r<   r7   isnullr   r2   r   r+   )r@   rA   dfdiff1dfdiff2dfsymr   s         r   _overlay_symmetric_diffr      s(   !#+G!#+Gc'l+GHc'l+GHGHGH%g.G%g.GMMXx(g  E $$&HHM.3ii!<//HLL!!((*+ 
JJl+!TJB	4.sww?ELr   c                     [        X5      n[        X5      n[        R                  " X#/SSS9n[	        UR
                  5      nUR                  S5        UR                  S5        UR                  US9$ )z1Overlay Union operation used in overlay function.TFrm   r   ro   )	rL   r   r8   rp   r[   r   rq   r\   rr   )r@   rA   rJ   r   dfunionr   s         r   _overlay_unionr      sb    #C-G#C-Eii(t%HG7??#GNN:NN:??7?++r   c                 t  ^ / SQnX%;  a  [        SU SU 35      e[        U [        5      (       d  [        U[        5      (       a  [        S5      e[	        X5      (       d
  [        XSS9  Uc  SnSnOS	n[        X/5       H  u  pxUR                  R                  [        5      R                  5       n	UR                  R                  [        5      R                  5       n
UR                  R                  [        5      R                  5       n[        XU/5      S
:  d  M  [        SUS
-    S35      e   US:X  a  U R                  nUR                  nUS   US   ::  a$  US   US   ::  a  US
   US   ::  a  US
   US   ::  d  U R                  SS R!                  UR                  SS R#                  UR$                  R&                  S
S9SSSS9nUUR(                  R#                  U R$                  R&                  5      R+                  5       U R$                  R&                  /-      $ U4S jnU(       a  U R                  R                  S   nU" U 5      n U" U5      n[,        R.                  " 5          [,        R0                  " SSS9  US:X  a  [3        X5      nOGUS:X  a  [5        X5      nO5US:X  a  [7        X5      nO#US:X  a  [9        X5      nOUS:X  a  [;        X5      nUS;   a  WR#                  SS/S
SS9  SSS5        U(       a  [=        WWU5      nWR?                  SSS9  U$ ! , (       d  f       N4= f) aF  Perform spatial overlay between two GeoDataFrames.

Currently only supports data GeoDataFrames with uniform geometry types,
i.e. containing only (Multi)Polygons, or only (Multi)Points, or a
combination of (Multi)LineString and LinearRing shapes.
Implements several methods that are all effectively subsets of the union.

See the User Guide page :doc:`../../user_guide/set_operations` for details.

Parameters
----------
df1 : GeoDataFrame
df2 : GeoDataFrame
how : string
    Method of spatial overlay: 'intersection', 'union',
    'identity', 'symmetric_difference' or 'difference'.
keep_geom_type : bool
    If True, return only geometries of the same geometry type as df1 has,
    if False, return all resulting geometries. Default is None,
    which will set keep_geom_type to True but warn upon dropping
    geometries.
make_valid : bool, default True
    If True, any invalid input geometries are corrected with a call to make_valid(),
    if False, a `ValueError` is raised if any input geometries are invalid.

Returns
-------
df : GeoDataFrame
    GeoDataFrame with new set of polygons and attributes
    resulting from the overlay

Examples
--------
>>> from shapely.geometry import Polygon
>>> polys1 = geopandas.GeoSeries([Polygon([(0,0), (2,0), (2,2), (0,2)]),
...                               Polygon([(2,2), (4,2), (4,4), (2,4)])])
>>> polys2 = geopandas.GeoSeries([Polygon([(1,1), (3,1), (3,3), (1,3)]),
...                               Polygon([(3,3), (5,3), (5,5), (3,5)])])
>>> df1 = geopandas.GeoDataFrame({'geometry': polys1, 'df1_data':[1,2]})
>>> df2 = geopandas.GeoDataFrame({'geometry': polys2, 'df2_data':[1,2]})

>>> geopandas.overlay(df1, df2, how='union')
    df1_data  df2_data                                           geometry
0       1.0       1.0                POLYGON ((2 2, 2 1, 1 1, 1 2, 2 2))
1       2.0       1.0                POLYGON ((2 2, 2 3, 3 3, 3 2, 2 2))
2       2.0       2.0                POLYGON ((4 4, 4 3, 3 3, 3 4, 4 4))
3       1.0       NaN      POLYGON ((2 0, 0 0, 0 2, 1 2, 1 1, 2 1, 2 0))
4       2.0       NaN  MULTIPOLYGON (((3 4, 3 3, 2 3, 2 4, 3 4)), ((4...
5       NaN       1.0  MULTIPOLYGON (((2 3, 2 2, 1 2, 1 3, 2 3)), ((3...
6       NaN       2.0      POLYGON ((3 5, 5 5, 5 3, 4 3, 4 4, 3 4, 3 5))

>>> geopandas.overlay(df1, df2, how='intersection')
   df1_data  df2_data                             geometry
0         1         1  POLYGON ((2 2, 2 1, 1 1, 1 2, 2 2))
1         2         1  POLYGON ((2 2, 2 3, 3 3, 3 2, 2 2))
2         2         2  POLYGON ((4 4, 4 3, 3 3, 3 4, 4 4))

>>> geopandas.overlay(df1, df2, how='symmetric_difference')
    df1_data  df2_data                                           geometry
0       1.0       NaN      POLYGON ((2 0, 0 0, 0 2, 1 2, 1 1, 2 1, 2 0))
1       2.0       NaN  MULTIPOLYGON (((3 4, 3 3, 2 3, 2 4, 3 4)), ((4...
2       NaN       1.0  MULTIPOLYGON (((2 3, 2 2, 1 2, 1 3, 2 3)), ((3...
3       NaN       2.0      POLYGON ((3 5, 5 5, 5 3, 4 3, 4 4, 3 4, 3 5))

>>> geopandas.overlay(df1, df2, how='difference')
                                            geometry  df1_data
0      POLYGON ((2 0, 0 0, 0 2, 1 2, 1 1, 2 1, 2 0))         1
1  MULTIPOLYGON (((3 4, 3 3, 2 3, 2 4, 3 4)), ((4...         2

>>> geopandas.overlay(df1, df2, how='identity')
   df1_data  df2_data                                           geometry
0         1       1.0                POLYGON ((2 2, 2 1, 1 1, 1 2, 2 2))
1         2       1.0                POLYGON ((2 2, 2 3, 3 3, 3 2, 2 2))
2         2       2.0                POLYGON ((4 4, 4 3, 3 3, 3 4, 4 4))
3         1       NaN      POLYGON ((2 0, 0 0, 0 2, 1 2, 1 1, 2 1, 2 0))
4         2       NaN  MULTIPOLYGON (((3 4, 3 3, 2 3, 2 4, 3 4)), ((4...

See Also
--------
sjoin : spatial join
GeoDataFrame.overlay : equivalent method

Notes
-----
Every operation in GeoPandas is planar, i.e. the potential third
dimension is not taken into account.
)r3   unionidentitysymmetric_differencerP   z`how` was 'z' but is expected to be in z4overlay currently only implemented for GeoDataFrames   
stacklevelNTFr   r   z contains mixed geometry types.r3   r      r   r&   r,   c                   > U R                  5       n U R                  R                  [        5      R	                  5       (       a  U R
                  R                  ) nU R                  nT(       aN  U R                  X4   R                  5       U R                  X4'   UR                  5       (       a  [        U SSS9n U $ UR                  5       (       a  [        SUR                  5        S35      eU $ )NPolygonF)r4   keep_geom_type_warningz,You have passed make_valid=False along with zo invalid input geometries. Use make_valid=True or make sure that all geometries are valid before using overlay.)r^   r4   r5   r	   allr   is_validr   r7   r6   any_collection_extract
ValueErrorsum)r   maskru   r6   s      r   _make_validoverlay.<locals>._make_valid8  s    WWY<</04466KK(((D**C$&FF49$5$@$@$Bty!88::,iB 	  Bxxzl #66  	r   ignorezCRS mismatch between the CRS)messagerP   r   r   r   )r3   r   r   r   r!   r"   r   r    ) r   
isinstancer   NotImplementedErrorr
   r   	enumerater4   r5   r	   r   r   r   r   total_boundsr;   r:   r   r   r<   r   r?   warningscatch_warningsfilterwarningsrk   rL   r   r   rw   r   r2   )r@   rA   r{   keep_geom_typer6   allowed_howsr   ir   
poly_checklines_checkpoints_checkbox_gdf1box_gdf2rK   r   r4   s       `            r   overlayr      s   rL ;se+F|nUVV#y!!ZY%?%?!B
 	
 c32!%!&C:&\\&&'9:>>@
ll''8<<>||(()9:>>@
67!;%1q5'1P&QRR ' n#### qkXa[(x{hqk/I1+!,8A;(1+3MXXbq\''!!!#,,"3"3!!< %	 ( F ##CLL$5$56==?3<<CTCTBUU 
. MM&&q)	
c
C
c
C		 	 	"2PQ,(2FN"*34F**,S6FG^#C-FJ&s0FOOKK8,1dKC 
#  $VY8NO
D$/M) 
#	"s   3BL))
L7c                    U[         ;   a  [         nO1U[        ;   a  [        nO U[        ;   a  [        nO[        SU S35      eU R	                  5       nUR
                  S:H  nUR                  5       (       a  UR                  nUR                  XV/4   nUR                  SS9R                  SS9nUR                  SS9nUR                  S   n	S UR                  UR
                  R                  U5      ) U4'   XR                  R                  5       R                  5       -
  n
UR!                  S	S
9nX   R"                  UR                  XV4'   OSn
UR                  S   nUR                  UR
                  R                  U5         nXR                  S   -
  nUS:  d  U
S:  a'  U(       a   [$        R&                  " SX-    S3[(        SS9  U$ )Nz`geom_type` does not support .GeometryCollectionTr#   )index_partsr   )levellevel_0)byz-`keep_geom_type=True` in overlay resulted in zq dropped geometries of different geometry types than df1 has. Set `keep_geom_type=False` to retain all geometriesr   r   )r	   r   r   	TypeErrorr^   r4   r   r   r7   r2   explodeshaper5   r   isnar   dissolvevaluesr   warnUserWarning)r   r4   r   
geom_typesrK   is_collectiongeom_colcollectionsexplodedorig_num_geoms_explodednum_dropped_collection	dissolvedorig_num_geomsnum_droppeds                 r   r   r   l  s   &&'
	o	%$
	&	&%
7	{!DEEWWYF $$(<<M//jj
!:;***5==$=O''a'0"*.."3GKh((--j998CD#&7&7&<&<&>&B&B&DD 	 %%%3	.7.A.H.H

=*+!" \\!_NZZ((--j9:F <<?2Ka1A5;Q;34 5 	
 Mr   )r3   NT)r   	functoolsr   numpyr=   pandasr8   	geopandasr   r   geopandas._compatr   geopandas.arrayr   r   r	   r
   r   r   rL   rk   rw   r   r   r   r    r   r   <module>r      sL        - * "-
`4+06	,}@;r   