
    hd                        d dl Z d dlZd dlZd dlmZ d dlmZ d dlZd dl	m
Z
mZ d dl	m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 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)Z)d dl*m+Z+m,Z, d dl-m.Z. d dl/m0Z0  ejb                  ejd                  jg                  e4            dz  Z5 e)jl                  d      Z7d dl8m9Z: d dl;m<Z= d dl7m>Z>  e)j~                  d e)j                  d      g      d        ZAd ZBd ZCd ZDd ZEd ZFd ZGd ZHd ZIe)j                  j                  ddi dfd dd!d"fd d#d$d%fg d#d&d%fd g d#d'd(fd d i id#d'd)fd d ddd*id#d'd+fd d dd,d*id#d'd+fg	      d-        ZLd. ZMd/ ZN e.j                  d0      d1        ZPd2 ZQe)j                  j                  d3g d4      d5        ZRe)j                  j                  d3g d4      d6        ZSd7 ZTd8 ZUe)j                  j                  d9g d:      d;        ZVe)j                  j                  d9g d<      d=        ZWd> ZXd? ZYd@ ZZe)j                  j                  dAdBdCidfdB e#i       idfdB e#d dDi      id"fg      dE        Z[dF Z\dG Z]dH Z^dI Z_dJ Z`dK ZadL ZbdM ZcdN ZddO Zee)j                  j                  dPg dgg      dQ        Zfe)j                  j                  dRddg      dS        Zge)j                  j                  dRddg      dT        Zhe)j                  j                  ej                  dUk  dVW      dX        Zke)j                  j                  ej                  dUk\  dYW      dZ        Zle)j                  j                  d[ eddgdgez               d\        Zme)j                  j                  d]g d^      d_        Znd` Zoda Zpdb Zqe)j                  j                  dcg dd      de        Zre)j                  j                  dcg dd      df        Zsdg Zte)j                  j                  dh edidj      dkdldkdldmf edndog      dkdkdldldmf eg dp      dkdkdldldmf e ed d didi       edqdqdjdj       edrdrdsds      g      dtdtdududmfgg dvw      dx        Zudy Zve)j                  j                  dzdPd{g      d|        Zwe)j                  j                  dzdPd{g      d}        Zxe)j                  j                  d~ edndog      df edndog      df edndog      df eg d      df eg d      df eg d      df eg d      df eg d      dfg      d        Zyd Zzd Z{d Z|d Z}e)j                  j                  ddg e:j                  d      dkD  g      d        Ze)j                  j                  dddg e:j                  d      dkD   e:j                  d      dk  z  g      d        Zd Zd Zd Zd Zy)    N)product)Version)
ArrowDtype	DataFrame)read_parquet)
LineStringMultiPolygonPointPolygonbox)GeoDataFrameread_feather	read_filer   )
HAS_PYPROJ)to_wkb)METADATA_VERSIONSUPPORTED_VERSIONS_convert_bbox_to_parquet_filter_create_metadata_decode_metadata_encode_metadata_geopandas_to_arrow_get_filesystem_path#_remove_id_from_member_of_ensembles_validate_dataframe_validate_geo_metadata)assert_geodataframe_equalassert_geoseries_equal)mock)assert_frame_equaldatapyarrow)featherparquetr#   )paramsc                     | j                   dk(  rt        t        j                  fS | j                   dk(  rt        t        j
                  fS y )Nr$   r#   )paramr   r   
to_parquetr   
to_feather)requests    P/var/www/html/immo/lib/python3.12/site-packages/geopandas/io/tests/test_arrow.pyfile_formatr,   0   sA    }}	!\4444	)	#\4444 
$    c                    t        |       }t        |ddi      }t        |t              sJ |d   t        k(  sJ |d   dk(  sJ d|d   v sJ t
        r5|j                  j                         }t        |       |d   d   d   |k(  sJ |d   d   d   dk(  sJ |d   d   d	   d
dgk(  sJ t        j                  |d   d   d   |j                  j                        sJ |d   d   dk(  sJ |d   d   t        j                  k(  sJ t        |ddi      }|d   dk(  sJ |d   d   d   dk(  sJ t        |      }|d   d   d   dk(  sJ y )NgeometryWKBgeometry_encodingversionprimary_columncolumnscrsencodinggeometry_typesr	   r   bboxcreatorlibrary	geopandaspoint1.1.0)r   r   
isinstancedictr   r   r6   to_json_dictr   nparray_equalr/   total_boundsr<   __version__)naturalearth_lowresdfmetadatacrs_expecteds       r+   test_create_metadatarJ   8   s   	&	'Bz56IJHh%%%I"2222$%333),,,,vv**,+L9	":.u5EEEIz*:6%???Iz*+;<A   
 >>J'/1I1I   Iy)[888Iy)Y-B-BBBB  z76KLHI')))Iz*:6'AAA  #HIz*:6%???r-   c                     g d} t        j                  | t        dd      t        ddd      t        g d      t        g d      t	        g d      t	        g d      t        t	        g d      t	        g d	      g      t        t	        g d      t	        g d
      g      gd      }t        |ddi      }t        |d   d   d         t        |       k(  sJ t        |j                  dd d   ddi      }t        d |d   d   d   D              sJ t        |j                  dd ddi      }|d   d   d   ddgk(  sJ y )N)r
   zPoint Zr   zLineString Zr   	Polygon Zr	   zMultiPolygon Z         )r   r   rM   rM   )rN   rN   ))r   r   rM   )rM   rM   rN   )rN   rN   rO   )rP   )r   rM   rQ   )rM   r   ))r   r   r   )r   rM         ?)rM   rM   rM   )rM   r   rR   ))rR   rR   )rR         ?)rS   rS   )rS   rR   ))rR   rR   rM   )rR   rS   rS   )rS   rS   rN   )rS   rR   rS   )geo_typer/   r/   r0   r1   r5   r8   c              3   >   K   | ]  }|j                  d         yw)z ZN)endswith).0	geom_types     r+   	<genexpr>z9test_create_metadata_with_z_geometries.<locals>.<genexpr>   s#       	4 s         r	   rL   )
r<   r   r
   r   r   r	   r   sortedilocall)r8   rG   rH   s      r+   &test_create_metadata_with_z_geometriesr_   [   s   	N 
		&aaA34<=89HI @A PQ  PQ
	

B@  z56IJH(9%j12BCDI     1*eATUH !),Z89IJ   
  !U@STHIz*+;<A   r-   c                     t        j                  d      } | j                  d      }|j                         }d}d|v rd}d|d   d   d   v sJ t	        |       |rd|d   d   d   vsJ | j                  |      |k(  sJ y )	Npyproj	EPSG:4326Fdatum_ensembleTidmembersr   )pytestimportorskipCRSrA   r   )ra   r6   crs_jsoncheck_ensembles       r+    test_crs_metadata_datum_ensemblerk      s      *F **[
!C!HN8#x 01)<Q????'18$45i@CCCC::h3&&&r-   c                 N   t        j                  t        dddd      gd      }t        j                  t
        d      5  t        |d       d d d        t        j                  t
        d	      5  |j                  | d
d       d d d        y # 1 sw Y   BxY w# 1 sw Y   y xY w)Nr   
   rb   r/   r6   zschema_version must be one ofmatchinvalidschema_versionzB'geoarrow' encoding is only supported with schema version >= 1.1.0z1.0.0geoarrow)rs   r2   )r<   r   r   rf   raises
ValueErrorr   r(   tmp_pathgdfs     r+   (test_write_metadata_invalid_spec_versionrz      s    

 
 3q!R+<*=;
OC	z)H	I 8Y78 
R
 W 	x:V	W W8 8W Ws    B1BBB$c                  0    ddi} d}t        |       |k(  sJ y )Nab
   {"a": "b"})r   )rH   expecteds     r+   test_encode_metadatar      s#    SzHHH%111r-   c                  J    d} ddi}t        |       |k(  sJ t        d       J y )Nr~   r|   r}   )r   )metadata_strr   s     r+   test_decode_metadatar      s4     LSzHL)X555D!)))r-   c                    t        |       }t        |       t        |j                  d             d|d<   t        j                  t
              5  t        |       d d d        t        j                  t
              5  t        |j                  d             d d d        t        j                  t
              5  t        d       d d d        y # 1 sw Y   sxY w# 1 sw Y   CxY w# 1 sw Y   y xY w)Niso_a3rM   r   znot a dataframe)r   r   	set_indexrf   ru   rv   )rF   rG   s     r+   test_validate_dataframer      s    	&	'B X./ BqE 
z	"  B  
z	" -BLLO,- 
z	" /-./ /   - -/ /s$   C<C8C%CC"%C.c                      t        ddd ddidd       t        ddd ddidd       t        dddd	d
diddidd       y )Nr/   r0   r6   r7   0.1.0)r4   r5   rs   	<version>r4   r5   r3   rd   EPSGi  )	authoritycoder=   0.4.0)r    r-   r+    test_validate_geo_metadata_validr      s~    ("De$DE%	
 ("De$DE"	
 ( FDA
 !(	 	
r-   zmetadata,error)N9Missing or malformed geo metadata in Parquet/Feather filer   foo)r4   r5   z>'geo' metadata in Parquet/Feather file is missing required keyr   )r4   r3   z?'geo' metadata in Parquet/Feather file is missing required key:)r5   r3   r   z*'columns' in 'geo' metadata must be a dictzZ'geo' metadata in Parquet/Feather file is missing required key 'encoding' for column 'foo'r   zOnly WKB geometry encodingBKWc                 z    t        j                  t        |      5  t        |        d d d        y # 1 sw Y   y xY w)Nro   )rf   ru   rv   r   )rH   errors     r+   "test_validate_geo_metadata_invalidr      s0    h 
z	/ )x() ) )s   1:c                      ddd dddidd} t        j                  t        d      5  t        |        d d d        y # 1 sw Y   y xY w)	Nr/   r0   	spherical)r6   r7   edges1.0.0-beta.1r   zDThe geo metadata indicate that column 'geometry' has spherical edgesro   )rf   warnsUserWarningr   )rH   s    r+    test_validate_geo_metadata_edgesr   7  sQ    $%+ VW!H
 
T
 ) 	x(	) ) )s	   =Ac                     t        g dgg dt        dd      g      }t        j                  t        d      5  |j                  | dz  d	       d d d        y # 1 sw Y   y xY w)
NrM   rN   rO   r|   r}   r|   rM   r!   r5   r/   zaGeoPandas only supports using pyarrow as the engine for to_parquet: 'fastparquet' passed instead.ro   test.parquetfastparquetengine)r   r
   rf   ru   rv   r(   )tmpdirrG   s     r+   'test_to_parquet_fails_on_invalid_enginer   D  s`    	I;5QRTU;-	XB	8
 E 	f~-mDE E Es   AA#zgeopandas.io.arrow._to_parquetc           	          t        g dgg dt        dd      g      }|j                  dd       | j                  |ddd	d d d
       y )Nr   r   rM   r    r"   r   snappyr0   F)compressionr2   indexrs   write_covering_bbox)r   r
   r(   assert_called_with)mock_to_parquetrG   s     r+   *test_to_parquet_does_not_pass_engine_alongr   Q  sV    	I;5QRTU;-	XBMM"YM' &&

! ' r-   c                     t        g dg dd      }t        j                  j                  t	        |       d      }|j                  |       t        |      }t        ||       y )Nr   )r|   r}   c)r|   r}   test.pq)r   ospathjoinstrr(   pd_read_parquetr    r   rG   filenamepq_dfs       r+   test_pandas_parquet_roundtrip1r   d  sI    	9	:Bww||CK3HMM(H%Er5!r-   test_dataset)rF   naturalearth_citiesnybb_filenamec                    |j                  |       }t        t        |      j                  dg            }t        j
                  j                  t        |      d      }|j                  |       t        |      }t        ||       y )Nr/   r5   r   )getfixturevaluer   r   dropr   r   r   r   r(   r   r    )r   r   r*   r   rG   r   r   s          r+   test_pandas_parquet_roundtrip2r   o  sj     ""<0D	9T?'''=	>Bww||CK3HMM(H%Er5!r-   c                 p   |j                  |      }|\  }}t        |      }|j                         }t        j                  j                  t        |       d      }	 |||	       t        j                  j                  |	      sJ t        ||        ||	      }
t        |
t              sJ t        ||
       y)z_Writing to parquet should not raise errors, and should not alter original
    GeoDataFrame
    r   N)r   r   copyr   r   r   r   existsr   r?   r   )r   r,   r   r*   r   readerwriterrG   origr   r   s              r+   test_roundtripr   ~  s     ""<0D NFF	4B779Dww||CK3H
2x77>>(### b$' 8Ee\***b%(r-   c                    |\  }}t        |      j                  d      }t        j                  j	                  t        |       d      } |||d        ||      }t        ||       t        j                  j	                  t        |       d      } |||d        ||      }t        |j                  d      |       y)	zwSetting index=`True` should preserve index in output, and
    setting index=`False` should drop index from output.
    r   ztest_with_index.pqT)r   zdrop_index.pqF)r   N)r   r   r   r   r   r   r   reset_indexr   r,   rF   r   r   rG   r   r   s           r+   
test_indexr     s     !NFF	&	'	1	1(	;Bww||CK)=>H
2xt$8Eb%(ww||CK9H
2xu%8Ebnn$n7?r-   c                 <   |\  }}t        |      }|j                  d      }|j                  j                         |d<   t	        |      }g d}|j                  |      }|t        u r@t        j                  j                  t        |       d      }t        j                  ||       n?t        j                  j                  t        |       d      }t        j                  ||        ||      }	t        |	j                         |dd k(  sJ t#        |	||dd           y)z7The order of columns should be preserved in the output.r   geom2)r   r   pop_est	continentnamer/   
gdp_md_estztest_column_order.pqztest_column_order.featherrM   N)r   r   r/   representative_pointr   selectr   r   r   r   r   pqwrite_tabler#   write_featherlistr5   r   )
r   r,   rF   r   r   rG   tablecustom_column_orderr   results
             r+   test_column_orderr     s     NFF	&	'B	h	B++224BwK#E LL,-E77<<F-CD
uh'77<<F-HIeX.HF#6qr#::::fb)<QR)@&ABr-   r   )r   gzipbrotlilz4zstdNc                     t        |      }t        j                  j                  t	        |      d      }|j                  ||        t        |      }t        |t              sJ t        ||       y)eUsing compression options should not raise errors, and should
    return identical GeoDataFrame.
    r   r   N)
r   r   r   r   r   r(   r   r?   r   r   r   r   rF   rG   r   r   s         r+   test_parquet_compressionr     s[     
&	'Bww||CK3HMM(M4"Ee\***b%(r-   )uncompressedr   r   c                     t        |      }t        j                  j                  t	        |      d      }|j                  ||        t        |      }t        |t              sJ t        ||       y)r   ztest.featherr   N)
r   r   r   r   r   r)   r   r?   r   r   r   s         r+   test_feather_compressionr     s[     
&	'Bww||CK8HMM(M4"Ee\***b%(r-   c                    |\  }}t        |      }|j                  j                         |d<   t        j                  j                  t        |       d      } |||       t        j                  j                  |      sJ  ||      }t        |t              sJ t        ||       t        |j                  |j                  d       y)zIf multiple geometry columns are present when written to parquet,
    they should all be returned as such when read from parquet.
    r   r   T)check_geom_typeN)r   r/   r   r   r   r   r   r   r?   r   r   r   r   r   s           r+   test_parquet_multiple_geom_colsr     s     !NFF	&	'B++""$BwKww||CK3H
2x77>>(###8Ee\***b%(288U[[$Gr-   c                 P   t        |      }t        |      }t        |d   j                        |d<   t        j
                  j                  t        |       d      }|j                  |       t        j                  t        d      5  t        |       ddd       y# 1 sw Y   yxY w)ztMissing geo metadata, such as from a parquet file created
    from a pandas DataFrame, will raise a ValueError.
    r/   r   -Missing geo metadata in Parquet/Feather file.ro   N)r   r   r   valuesr   r   r   r   r(   rf   ru   rv   r   r   rF   rG   r   s       r+   test_parquet_missing_metadatar     s    
 
&	'B 
2B BzN112BzNww||CK3H MM( 
I
  	X  s   BB%c                 0   ddl m} t        j                  dg di      }t        j
                  j                  t        |       d      } |j                  ||       t        j                  t        d      5  t        |       ddd       y# 1 sw Y   yxY w)zMissing geo metadata, such as from a parquet file created
    from a pyarrow Table (which will also not contain pandas metadata),
    will raise a ValueError.
    r   Nr|   r   r   r   ro   )pyarrow.parquetr$   r"   r   r   r   r   r   r   rf   ru   rv   r   )r   r   r   r   s       r+   test_parquet_missing_metadata2r     sw    
 !MM3	*+Eww||CK3H BNN5(# 
I
  	X  s   7BBzgeo_meta,errorgeor-   barc                    ddl m}m} t        |      }t	        |      }t        |d   j                        |d<   |j                  |      }|j                  j                  }|j                  |       |j                  |      }t        j                  j                  t        |       d      }	|j!                  ||	       t#        j$                  t&        |      5  t)        |	       ddd       y# 1 sw Y   yxY w)zHas geo metadata with missing required fields will raise a ValueError.

    This requires writing the parquet file directly below, so that we can
    control the metadata that is written for this test.
    r   )Tabler$   r/   r   ro   N)r"   r   r$   r   r   r   r   from_pandasschemarH   updatereplace_schema_metadatar   r   r   r   r   rf   ru   rv   r   )
r   geo_metar   rF   r   r$   rG   r   rH   r   s
             r+   test_parquet_invalid_metadatar  2  s    * '	&	'B 
2BBzN112BzNb!E||$$HOOH))(3Eww||CK3Hx(	z	/ X  s   C..C7c                 8   |\  }}t        |      }t        j                  j                  t	        |       d      } |||        ||ddg      }t        |ddg   |       t        j                  t        d      5   ||dg       ddd       y# 1 sw Y   yxY w)zWReading a subset of columns should correctly decode selected geometry
    columns.
    r   r   r/   r   4No geometry columns are included in the columns readro   N)	r   r   r   r   r   r   rf   ru   rv   r   s           r+   test_subset_columnsr  [  s     !NFF	&	'Bww||CK3H
2x8fj%9:Eb&*!56>	P
 + 	x&*+ + +s   ;BBc                    |\  }}t        |      }|j                  j                         |d<   t        j                  j                  t        |       d      } |||        ||ddg      }t        |j                  d      ddg   |       |j                  j                         |d<    |||       t        j                  t        d      5   ||g d      }d	d	d	       t        |j                  d      g d   |       y	# 1 sw Y   *xY w)
zReading a subset of columns that does not include the primary geometry
    column should promote the first geometry column present.
    r   r   r   r   geom3zEMultiple non-primary geometry columns read from Parquet/Feather file.ro   )r   r   r  N)r   r/   r   r   r   r   r   r   set_geometryrf   r   r   r   s           r+   test_promote_secondary_geometryr	  o  s     !NFF	&	'B++""$BwKww||CK3H
2x8fg%67Eboog67HI5Q++""$BwK
2x	U
 E x)CD	E 
 !;<eE Es   DDc                     |\  }}t        |      }t        j                  j                  t	        |       d      } |||       t        j                  t              5   ||dg       ddd       y# 1 sw Y   yxY w)z`Reading a parquet file that is missing all of the geometry columns
    should raise a ValueErrorr   r   r   N)r   r   r   r   r   rf   ru   rv   )r   r,   rF   r   r   rG   r   s          r+   test_columns_no_geometryr    sg     !NFF	&	'Bww||CK3H
2x	z	" +x&*+ + +s   A11A:c                    |\  }}t        |      }d|j                  j                  _        t        j
                  j                  t        |       d      } |||        ||      }|j                  J t        ||d       y)zcIf CRS is `None`, it should be properly handled
    and remain `None` when read from parquet`.
    Nr   T	check_crs)	r   r/   arrayr6   r   r   r   r   r   r   s           r+   test_missing_crsr    sr     !NFF	&	'B BKKww||CK3H
2x8E99b%48r-   c                 ~    t        dddgi      }|j                  | dz         t        | dz        }t        ||       y )Nr|   rM   rN   r   )r   r(   r   r    )rx   rG   r   s      r+   test_default_geo_col_writesr    s>    	sQFm	$BMM(Y&'Hy01Er5!r-   c                    t        j                  d      }dd l} G d d|j                  j                  j
                        }|j                  d|d        |d      }t        |       }|j                  d	d
      5 }|j                  |       d d d        t        dddi      }t        ||       t        d|      }t        ||       |j                  d|j                  j                  j
                  d       y # 1 sw Y   pxY w)Nfsspecr   c                        e Zd Z fdZ xZS )+test_fsspec_url.<locals>.MyMemoryFileSystemc                 2    || _         t        |   |i | y )N)is_setsuper__init__)selfr  argskwargs	__class__s       r+   r  z4test_fsspec_url.<locals>.MyMemoryFileSystem.__init__  s     DKGd-f-r-   )__name__
__module____qualname__r  __classcell__)r  s   @r+   MyMemoryFileSystemr    s    	. 	.r-   r#  memoryT)clobber)r  zdata.parquetwbzmemory://data.parquetr  storage_options)
filesystem)rf   rg   fsspec.implementations.memoryimplementationsr$  MemoryFileSystemregister_implementationr   openr(   r   r   )rF   _r  r#  memfsrG   fr   s           r+   test_fsspec_urlr2    s    H%A(.V33::KK . ""8-?"Nd+E	&	'B	ND	) Q
a 1HdCSTFfb)1eDFfb) ""&((//@@$ #  s   =C>>Dc                     t        j                  t        d      5  t        | ddi       d d d        y # 1 sw Y   y xY w)Nr(  ro   r   r   r'  )rf   ru   rv   r   )rF   s    r+   /test_non_fsspec_url_with_storage_options_raisesr4    s9    	z):	; J(5%.IJ J Js   5>c                  l    t        d      \  } }t        | t        j                  j                        sJ y )Nzfile:///data.parquet)r   r?   r"   fsLocalFileSystem)r)  r/  s     r+   test_prefers_pyarrow_fsr8    s+    ()?@MJj'**"<"<===r-   c                     t        j                  t        dddd      gd      } d}| j                  |       t        j                  |      }t        | |d       t        j                  t        j                  j                  |             y )Nr   rm   	epsg:4326rn   z~/test_file.parquetTr  )
r<   r   r   r(   r   r   r   remover   
expanduser)ry   	test_filer   s      r+   #test_write_read_parquet_expand_userr>    sj    

 
 3q!R+<*=;
OC%INN9""9-Ec5D9IIbgg  +,r-   c                     t        j                  t        dddd      gd      } d}| j                  |       t        j                  |      }t        | |d       t        j                  t        j                  j                  |             y )Nr   rm   r:  rn   z~/test_file.featherTr  )
r<   r   r   r)   r   r   r   r;  r   r<  )ry   r=  f_dfs      r+   #test_write_read_feather_expand_userrA    sj    

 
 3q!R+<*=;
OC%INN9!!),Dc448IIbgg  +,r-   r/   c                 "   t        j                  ddgt        |      z  i|      }|j                  | dz         ddlm}  || dz        }t        j                  |j                  j                  d         }d|d	   d
   v sJ d|d	   d
   vsJ y )NcolrM   r/   r   r   
read_table   geor7   r5   r/   r9   )
r<   r   lenr(   r   rF  jsonloadsr   rH   )r   r/   ry   rF  r   rH   s         r+   test_write_empty_bboxrK    s     
 
 %!s8})<!=
QCNN6N*+*v./Ezz%,,//78H),Z8888),Z8888r-   formatc                    t         j                  j                  t        |       d|       }t	        dddd      }t        j                  |gdgdgd      }|dk(  r|j                  |       t        }n|j                  |       t        } ||dt        i	      }t        |t
        j                        sJ t        |j                  d
   t              sJ t        |j                  d   t              sJ y )Ntest.r   rm   rM   r|   )r/   isr#   types_mapper)to_pandas_kwargsrO  rP  )r   r   r   r   r   r<   r   r)   r   r(   r   r   r?   dtypes)r   rL  r   gry   	read_funcgdf_roundtrips          r+    test_write_read_to_pandas_kwargsrW    s    ww||CK5)9:HAq"bA

 
 qc3%!H
ICx  	x  	 h.*9UVMmY%;%;<<<m**3/<<<m**3/<<<r-   c                 Z   t        j                  d      }|dk(  rddlm} nddlm} t        j                  j                  t        |       d|       }t        j                  t        dddd      g      }t        |      }|j                  j                  }t!        |d	         }|d
   d   d= |j#                  d	t%        |      i       |j'                  |      } |||       t)        t        d|       }	 |	|      }
|
j*                  j-                  |j/                  d            sJ y )Nra   r#   r   )r   )r   rN  rm   rD  rG  r5   r/   r6   read_	OGC:CRS84)rf   rg   pyarrow.featherr   r   r   r   r   r   r   r<   r   r   r   r   rH   r   r   r   r   getattrr6   equalsrh   )r   rL  ra   writer   ry   r   rH   geo_metadatareadrG   s              r+   test_write_read_default_crsra    s     *F:8ww||CK5)9:H

 
 3q!R+<*=
>C$E ||$$H#HV$45LY
+E2OOV-l;<=))(3E	%9fX./D	hB66==K0111r-   )rO   rm   r   zrequires GEOS>=3.10)reasonc                    t        j                  t         j                  j                  dg            }|j	                  | dz         ddlm}  || dz        }|d   d   j                         j                         }|dk(  sJ y )NPOINT Z (1 2 3)rD  r   r   rE  r/   :01e9030000000000000000f03f00000000000000400000000000000840)	r<   r   	GeoSeriesfrom_wktr(   r   rF  as_pyhex)r   ry   rF  r   wkbs        r+   test_write_iso_wkbrk  ,  s    

 
 $$--/@.ABC NN6N*+*v./E


A

$
$
&
*
*
,C NNNNr-   ztests GEOS<3.10c                     t        j                  t         j                  j                  dg            }t	        j
                  t        d      5  |j                  | dz         d d d        y # 1 sw Y   y xY w)Nrd  rD  zCannot write 3Dro   r   )r<   r   rf  rg  rf   ru   rv   r(   )r   ry   s     r+   test_write_iso_wkb_old_geosrm  <  sa    

 
 $$--/@.ABC 
z):	; 0v./0 0 0s   A..A7zformat,schema_versionc                 J   |dk(  rddl m} nddlm} t        j                  j                  t        |       d|       }t        j                  t        dddd      gd      }t        |d|       } |||	       t        t        d
|       } ||      }t        ||       |xs t        } ||      }	t        j                  |	j                  j                   d         }
|
d   |k(  sJ t"        rb|dk(  r(|
d   d   d   |j$                  j'                         k(  s7J |j$                  j)                         }t+        |       |
d   d   d   |k(  sJ t-        |      t-        d      k  rd|
d   d   v sJ |
d   d   d   dk(  sJ y d|
d   d   v sJ |
d   d   d   dgk(  sJ y )Nr#   r   rE  rN  rm   rb   rn   to_rr   rY  rG  r3   r   r5   r/   r6   r   geometry_typer   r8   )r[  rF  r   r   r   r   r   r<   r   r   r\  r   r   rI  rJ  r   rH   r   r6   to_wktrA   r   r   )r   rL  rs   rF  r   ry   r^  r`  rG   r   rH   rI   s               r+   test_write_spec_versionrr  E  s   
 ..ww||CK5)9:H

 
 3q!R+<*=;
OCC3vh(E	(>2 9fX./D	hBb#& $7'7Nx Ezz%,,//78HI.000 W$I&z259SWW^^=MMMM 77//1L/=I&z259\III ~''"22(9"5j"AAAA	":.?9LLL8I#6z#BBBB	":./?@YKOOOr-   r3   )r   r   r   c                 n   t        j                  ddgddgddgdt        t        dddd      t        ddd	d	      g      t        d
d
dd      gd      }t        j                  t
        dz  d|  dz        }t        ||d       t        j                  t
        dz  d|  dz        }t        ||d       y)a  
    Verify that files for different metadata spec versions can be read
    created for each supported version:

    # small dummy test dataset (not naturalearth_lowres, as this can change over time)
    from shapely.geometry import box, MultiPolygon
    df = geopandas.GeoDataFrame(
        {"col_str": ["a", "b"], "col_int": [1, 2], "col_float": [0.1, 0.2]},
        geometry=[MultiPolygon([box(0, 0, 1, 1), box(2, 2, 3, 3)]), box(4, 4, 5,5)],
        crs="EPSG:4326",
    )
    df.to_feather(DATA_PATH / 'arrow' / f'test_data_v{METADATA_VERSION}.feather')
    df.to_parquet(DATA_PATH / 'arrow' / f'test_data_v{METADATA_VERSION}.parquet')
    r|   r}   rM   rN   皙?皙?col_strcol_int	col_floatr   rO      rZ   rb   rn   arrowtest_data_vz.featherTr  z.parquetN)r<   r   r	   r   r   	DATA_PATHr   r   )r3   r   rG   s      r+   test_read_versioned_filer~  r  s      %%#JAq6c
KAq!QQ1aABC1aQROTH 
			G 3G9H6U U	VBb(d;				G 3G9H6U U	VBb(d;r-   c                  f   t        j                  d       t        j                  ddgddgddgdt	        t        d	d	dd      t        ddd
d
      g      t        dddd      gd      } t        j                  t        dz  dz        }t        || d       t        j                  t        dz  dz        }t        || d       t        j                  t        dz  dz        }| j                  d      } t        || d       t        j                  t        dz  dz  d      }t        |      dk(  sJ y)a0  
    Verify that files written by GDAL can be read by geopandas.
    Since it is currently not yet straightforward to install GDAL with
    Parquet/Arrow enabled in our conda setup, we are testing with some
    generated files included in the repo (using GDAL 3.5.0):

    # small dummy test dataset (not naturalearth_lowres, as this can change over time)
    from shapely.geometry import box, MultiPolygon
    df = geopandas.GeoDataFrame(
        {"col_str": ["a", "b"], "col_int": [1, 2], "col_float": [0.1, 0.2]},
        geometry=[MultiPolygon([box(0, 0, 1, 1), box(2, 2, 3, 3)]), box(4, 4, 5,5)],
        crs="EPSG:4326",
    )
    df.to_file("test_data.gpkg", GEOMETRY_NAME="geometry")
    and then the gpkg file is converted to Parquet/Arrow with:
    $ ogr2ogr -f Parquet -lco FID= test_data_gdal350.parquet test_data.gpkg
    $ ogr2ogr -f Arrow -lco FID= -lco GEOMETRY_ENCODING=WKB test_data_gdal350.arrow test_data.gpkg

    Repeated for GDAL 3.9 which adds a bbox covering column:
    $ ogr2ogr -f Parquet -lco FID= test_data_gdal390.parquet test_data.gpkg
    ra   r|   r}   rM   rN   rt  ru  rv  r   rO   rz  rZ   rb   rn   r{  ztest_data_gdal350.parquetTr  ztest_data_gdal350.arrowztest_data_gdal390.parquetrZ  )r   r   rN   rN   r9   N)rf   rg   r<   r   r	   r   r   r}  r   r   to_crsrH  )r   rG   s     r+   test_read_gdal_filesr    s%   , !%%#JAq6c
KAq!QQ1aABC1aQROTH 
			G 36Q Q	RBb(d;				G 36O O	PBb(d;				G 36Q Q	RB {+Hb(d;			G99
B r7a<<r-   c                     t        |      }| dz  }|j                          |d d j                  |dz         |dd  j                  |dz         t        |      }t	        ||       y )Npartitioned_datasetd   data1.parquetdata2.parquet)r   mkdirr(   r   r   )r   rF   rG   basedirr   s        r+   %test_parquet_read_partitioned_datasetr    sk     
&	'B ,,GMMOtH/12stH/12'"Ffb)r-   c                    t        j                  d      }t        |      }|j                  d      }|j	                  d       |j                  dd      5 }|d d j                  |       d d d        |j                  dd      5 }|dd  j                  |       d d d        t        d      }t        ||       y # 1 sw Y   PxY w# 1 sw Y   -xY w)	Nr  r$  r  z!partitioned_dataset/data1.parquetr&  r  z!partitioned_dataset/data2.parquetzmemory://partitioned_dataset)	rf   rg   r   r)  r  r.  r(   r   r   )r   rF   r  rG   r0  r1  r   s          r+   ,test_parquet_read_partitioned_dataset_fsspecr    s      *F	&	'B h'E	KK%&	7	> !
4CA	7	> !
34A 89Ffb)  s   B9C9CCrp  )r=   
linestringpolygon
multipointmultilinestringmultipolygonc                     t        j                  t        dz  dz  d|  dz        }t        j                  t        dz  dz  d|  dz        }t        ||d       y )Nr{  
geoparquetdata-z-encoding_native.parquet-encoding_wkb.parquetTr  )r<   r   r}  r   )rp  r   r   s      r+   test_read_parquet_geoarrowr    s    
 ##
	
	 - 8
9	:F %%
	
	 - 5
6	7H fh$?r-   c                     t        j                  t        dz  dz  d| dz        }|j                  | dz  d       t        j                  | dz        }t	        ||d	       y )
Nr{  r  r  r  r   rt   r1   Tr  )r<   r   r}  r(   r   )rx   rp  rG   r   s       r+   test_geoarrow_roundtripr    ss    
 
		
	
	 - 5
6	7
B MM(^+zMJ##H~$=>FfbD9r-   c                 :   ddl m} t        |      }t        j                  j                  t        |       d      }|j                  |d       |j                  |      }t        j                  |j                  j                  d   j                  d            }|d   d	   d
   dddgddgddgddgdik(  sJ d|j                  j                  v sJ |j                  j                  d      j                   D cg c]  }|j"                   c}g dk(  sJ y c c}w )Nr   )r$   r   Tr   rG  zutf-8r5   r/   coveringr9   xminyminxmaxymaxr  r  r  r  )r"   r$   r   r   r   r   r   r(   rF  rI  rJ  r   rH   decodenamesfieldtyper   )r   rF   r$   rG   r   r   rH   r  s           r+   +test_to_parquet_bbox_structure_and_metadatar    s   	&	'Bww||CK3HMM(M5x(Ezz%,,//7>>wGHHIz*:6V$V$V$V$	
;    U\\'''''$)LL$6$6v$>$C$CD5EJJD I   Ds   :Dzgeometry, expected_bboxrM   rO   g      ?g      @r  rQ   )rO   rO   ))rN   rM   )rM   rN   )rN   rO   )rO   rN   rN   rz  rZ   g        g      @)r
   r   r   Multipolygon)idsc                 
   dd l m} t        ddggddg|g      }t        j                  j                  t        |       d      }|j                  |d	        |j                  |      j                         }|d
   d   |k(  sJ y )Nr   rM   rN   r|   r}   r   r   Tr  r9   )
r   r$   r   r   r   r   r   r(   rF  	to_pandas)r   r/   expected_bboxr   rG   r   r   s          r+   test_to_parquet_bbox_valuesr    sy    * !	QF8c3Z8*	MBww||CK3HMM(M5R]]8$..0F&>!---r-   c                 .   t        ddggddgt        dd      g      }t        j                  j	                  t        |       d      }|j                  |d       t        |d	
      }t        |      dk(  sJ |j                  d   t        dd      k(  sJ y )NrM   rN   r|   r}   r   r   Tr  )rM   rM   rM   rM   r  r   )
r   r
   r   r   r   r   r(   r   rH  r/   r   s       r+   #test_read_parquet_bbox_single_pointr  >  s    	QF8c3Z5A;-	PBww||CK3HMM(M55Eu:??>>!a+++r-   geometry_namecustum_geom_colc                     t        |      }|dk7  r|j                  |      }t        j                  j	                  t        |       d      }|j                  |d       t        |d      }|d   j                  j                         g dk(  sJ y )	Nr/   r   Tr  r   r   rm   rm   r  r   	FranceBeninNigeriaCameroonTogoGhanaBurkina FasoGabonz
Eq. Guinea)
r   rename_geometryr   r   r   r   r(   r   r   tolist)r   rF   r  rG   r   r   s         r+   test_read_parquet_bboxr  H  s     
&	'B
".ww||CK3HMM(M57E=&&( 
- 
 
 
r-   c                 6   t        |      }|dk7  r|j                  |      }| dz  }|j                          |d d j                  |dz  d       |dd  j                  |dz  d       t	        |d	      }|d
   j
                  j                         g dk(  sJ y )Nr/   r  r  r  Tr  r  r  r  r   r  )r   r  r  r(   r   r   r  )r   rF   r  rG   r  r   s         r+   "test_read_parquet_bbox_partitionedr  a  s     
&	'B
". ,,GMMOtH/1tLstH/1tL~6E=&&( 
- 
 
 
r-   zgeometry, bbox)rS   rS         @r  )rO   rO   rO   rO   rS   rS         @r  )rP   )rz  r   )rz  rz  )r   rz  )rM   rM   rO   rO   )rM   rM   rZ   rZ   )rN   rN   rz  rz  )rz  rz  rz  rz  )rM   rM   rZ   rO   c                     t        ddggddg|g      }t        j                  j                  t	        |       d      }|j                  |d       t        ||	      }t        |      dk(  sJ y )
NrM   rN   r|   r}   r   r   Tr  r  )r   r   r   r   r   r(   r   rH  )r   r/   r9   rG   r   r   s         r+   2test_read_parquet_bbox_partial_overlap_of_geometryr  }  sb     
QF8c3Z8*	MBww||CK3HMM(M5-Eu:??r-   c                    t        |      }t        j                  j                  t	        |       d      }|j                  |       t        j                  t        d      5  t        |d       d d d        y # 1 sw Y   y xY w)Nr   Specifying 'bbox' not supportedro   r   r      r  r  )
r   r   r   r   r   r(   rf   ru   rv   r   r   s       r+   test_read_parquet_no_bboxr    sa     
&	'Bww||CK3HMM(	z)J	K 4XN34 4 4s   !A88Bc                    t        |      }| dz  }|j                          |d d j                  |dz         |dd  j                  |dz         t        j                  t
        d      5  t        |d       d d d        y # 1 sw Y   y xY w)	Nr  r  r  r  r  ro   r  r  )r   r  r(   rf   ru   rv   r   )r   rF   rG   r  s       r+   %test_read_parquet_no_bbox_partitionedr    s     
&	'B ,,GMMOtH/12stH/12	z)J	K 3W>23 3 3s   *BB
c                      dd l m}  d} | j                  d      dkD   | j                  d      dkD  z   | j                  d      dk  z   | j                  d      dk  z   }|j                  t	        |d	            sJ y )
Nr   )r   r      #   )r9   r  r  )r9   r  r  )r9   r  )r9   r  r9   )pyarrow.computecomputer  r]  r   )pcr9   r   s      r+   #test_convert_bbox_to_parquet_filterr    s     D	"	#b	(288$%*	,288$%)	+ 288$%)	+H ??:4HIIIr-   c                    t        |      }t        j                  j                  t	        |       d      }|j                  |d       t        |      }d|vsJ t        |ddg      }d|vsJ t        |j                        ddgk(  sJ y )Nr   Tr  r9   r   r/   r   )	r   r   r   r   r   r(   r   r   r5   )r   rF   rG   r   result1result2s         r+   /test_read_parquet_bbox_column_default_behaviourr    s     
&	'Bww||CK3HMM(M58$G   8fj-ABG    VZ$8888r-   filters)r   > N  r   r  c                     t        |      }t        j                  j                  t	        |       d      }|j                  |d       t        ||d      }|d   j                  j                         g dk(  sJ y )Nr   Tr  r  )r  r9   r   )zDem. Rep. Congor  r  r  r  AlgeriaLibya	r   r   r   r   r   r(   r   r   r  r   rF   r  rG   r   r   s         r+   "test_read_parquet_filters_and_bboxr    so     
&	'Bww||CK3HMM(M5(G.IF&>  '') .   r-   )r   r  :  )r   <>  r  r  c                     t        |      }t        j                  j                  t	        |       d      }|j                  |d       t        ||      }|d   j                  j                         g dk(  sJ y )Nr   Tr  )r  r   )r  
MozambiqueAlbaniar  r  s         r+   &test_read_parquet_filters_without_bboxr    se     
&	'Bww||CK3HMM(M5(G4F&>  '')-VVVVr-   c                    dd l m} g dt        dd      t        dd      t        dd      gd}t        |      }t        j
                  j                  t        |       d      }t        |dd	
      }|j                  j                  }|j                  g d      }t        j                  |d         }ddgddgddgddgd|d   d   d   d<   |j                  dt        |      i       |j!                  |      } |j"                  ||        |j$                  |      }d|j                  j&                  v sJ t)        |d      }	|	d   j*                  j-                         dgk(  sJ y )Nr   )point1point2point3rM   rN   rO   )r   r/   r   r>   T)rs   r   )r   r/   custom_bbox_namerG  r  r  r  r  r  r  r5   r/   r  r9   r  r  r   r  )r   r$   r
   r   r   r   r   r   r   r   rH   rename_columnsrI  rJ  r   r   r   r   rF  r  r   r   r  )
r   r   r!   rG   r   r   rH   r_  pq_tabler   s
             r+   :test_read_parquet_file_with_custom_bbox_encoding_fieldnamer    se     /1a[%1+uQ{;D 
d	Bww||CK3H
 E
 ||$$H  !IJE::hv./L#V,#V,#V,#V,	?LJ'
3F; OOV-l;<=))(3EBNN5(#r}}X&H!6!6666(<=E=&&(XJ666r-   c                 0   t        |      }|j                  dgt        |      z        }t        j                  j                  t        |       d      }t        j                  t        d      5  |j                  |d       d d d        y # 1 sw Y   y xY w)Nr   r  r   z9An existing column 'bbox' already exists in the dataframero   Tr  )r   assignrH  r   r   r   r   rf   ru   rv   r(   r   s       r+   )test_to_parquet_with_existing_bbox_columnr    sx    	&	'B	c"g	&Bww||CK3H	U
 : 	hD9: : :s   /BBc           
      h   t        j                  dt        d      it        d      D cg c]  }t        ||       c}      }|j	                  | dz  d       t        j
                  | dz  d      }t        |      dk(  sJ t        j
                  | dz  d	      }t        |      d
k(  sJ y c c}w )NrC  rm   rD  r   rt   r1   r  r  )rO   rO   rZ   rZ   rO   )r<   r   ranger
   r(   r   rH  )rx   rO  rG   r   s       r+   test_read_parquet_bbox_pointsr  !  s    				b	59%EaeAqk%E
B MM(^+zMJ##H~$=NSFv;"##H~$=LQFv;! &Fs   B/
c                 *   t        j                  dg dit        j                  g dg d      d      }|d= |j                  | dz         t	        j
                  t        d      5  t        j                  | dz         d d d        y # 1 sw Y   y xY w)	NrC  r   rb   rn   r/   ztest_no_geometry.parquetr  ro   )r<   r   points_from_xyr(   rf   ru   rv   r   rw   s     r+   +test_non_geo_parquet_read_with_proper_errorr  .  s     
 
 		)))Y?C
 	JNN8889	P
 F 	x*DDEF F Fs   'B		B)rI  r   pathlib	itertoolsr   packaging.versionr   numpyrB   pandasr   r   r   r   shapelyshapely.geometryr   r	   r
   r   r   r<   r   r   r   geopandas._compatr   geopandas.arrayr   geopandas.io.arrowr   r   r   r   r   r   r   r   r   r   r   rf   geopandas.testingr   r   geopandas.tests.utilr   pandas.testingr    Pathr   dirname__file__r}  rg   r"   r  r  r  r   r$   r   r#   fixturer'   r,   rJ   r_   rk   rz   r   r   r   r   markparametrizer   r   r   patchr   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r  r  r2  r4  r8  r>  rA  rK  rW  ra  skipifgeos_versionrk  rm  rr  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+   <module>r     s    	   %  ( 2  J J  I I ( "     O % -GLL23f<	 &

i
(    	<6<<	#:;<5 =5 @F:z'$	W2*/, F K	HI  %6L	
  %=M	
 {3M	

  %L8	
  %%U.	
 #(!4T#BC&
 )	
 #(!4U#CD&
 )	
O/2f)g2f)

)
E ,- .$" S	"	" S))4@&C> D)) (GH) I)H,2( 
RS$R()G	

 $eU^45L	

6+(:+9$">J
>
-- b4&\2
9 3
9 Iy#9:= ;=& Iy#9:2 ;22 G((:5>STO UO G((J6?PQ0 R0 Y	"TF-?$?@&P	&PR $FG< H<8,^**" W@	@  W
:	
:6 	q!sCcJK'(#sC@	

 45#sC@	

 #aAq/3q!Q?C1aOLM#sC@	
 	;#  &
.'&
., :7H*IJ K0 :7H*IJ K6 	VV$	%';<	VV$	%|4	VV$	%';<	1	2LA	1	2LA	1	2LA	1	2LA	1	2LA	43J9 	#$&" 
$&@	A
"((<
 5
(XRXXl-Ce-K	LWW#7L:
Fr-   