
    [j                    ,,   S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJr  S SKJ	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JrJrJrJrJrJrJrJr  S SKJrJrJ r J!r!  S SK"J#r#J$r$J%r%  S S	K&J'r'J(r(  S S
K)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1  S SK2r2 S SK3r4S SK5r6S SK7J8r8  S SK9J:r:J;r;J<r<J=r=J>r>J?r?  S SK@r@S SKAJBrB  S SKCJDrD  S SKEJFrFJGrG  \2R                  " S5        \2R                  " SS\2R                  " S\0S9/S9S 5       rL\2R                  " SS9S 5       rM\ R                  S 5       rOS rP\2R                  R                  SS\2R                  " SS\0S9SS/5      S  5       rS\2R                  R                  \R                  " 5       R                  5       S!:H  S"S#9S$ 5       rWS% rXS& rY\2R                  R                  S'S(/ SS)4/ SS 4/5      S* 5       rZ\2R                  R                  S+S,S-/S./S/9S0 5       r[S1 r\S2 r]S3 r^S4 r_\2R                  R                  S5\" 5       ;  S6S#9S7 5       r`S8 raS9 rb\2R                  R                  S:S/ S;//5      S< 5       rcS= rd\2R                  R                  S:S/ S>S?//5      S@ 5       re\2R                  R\                  \2R                  R                  \,(       + SAS#9SB 5       5       rf\2R                  R\                  SC 5       rg\2R                  R                  SD5      \2R                  R\                  SE 5       5       ri\2R                  R                  SFSS/5      \2R                  R                  SGSS/5      SH 5       5       rj\2R                  R                  SI\* V s/ s H  o SJ:w  d  M
  U PM     sn 5      \2R                  R                  SFSS/5      \2R                  R                  SGSS/5      \2R                  R\                  SK 5       5       5       5       rk\2R                  R                  SI\* V s/ s H  o SJ:w  d  M
  U PM     sn 5      \2R                  R                  SFSS/5      \2R                  R                  SGSS/5      \2R                  R                  SL5      \2R                  R\                  SM 5       5       5       5       5       rl\2R                  R                  SI\* V s/ s H  o SJ:w  d  M
  U PM     sn 5      \2R                  R                  SFSS/5      \2R                  R                  SGSS/5      \2R                  R                  SD5      \2R                  R\                  SN 5       5       5       5       5       rm\2R                  R                  SI\* V s/ s H  o SJ:w  d  M
  U PM     sn 5      \2R                  R                  SFSS/5      \2R                  R                  SGSS/5      \2R                  R                  SD5      \2R                  R\                  SO 5       5       5       5       5       rn\2R                  R                  SI\* V s/ s H  o SJ:w  d  M
  U PM     sn 5      \2R                  R                  SP\6R                  " SQ5      \6R                  " SR5      \R                  4\R                  " SQ5      \R                  " SR5      \R                  4/5      \2R                  R                  SFSS/5      \2R                  R                  SGSS/5      \2R                  R                  SD5      \2R                  R\                  SS 5       5       5       5       5       5       rr\2R                  R                  SI\* V s/ s H  o SJ:w  d  M
  U PM     sn 5      \2R                  R                  SFSS/5      \2R                  R                  SGSS/5      \2R                  R\                  ST 5       5       5       5       rsSU rtSV ruSW rvSX rwSY rxSZ ry\2R                  R                  S[/ S\Q5      S] 5       rz\2R                  R                  S^S_/ 4S`SaSb/4ScSd/4/5      Se 5       r{Sf r|Sg r}\2R                  R                  ShSiS S /Sj.SkSl/5      Sm 5       r~Sn r\2R                  R                  So\@R                  " SpSq5      Sd/4\@GR                   " SrSsStSu5      SaSb/4\@GR                  " SvSw/SxSy/SzS{/S|S}/S~S/SvSw/45      / SQ4\@GR                  " \@R                  " SS5      \@GR                   " SrSsStSu5      /5      / SQ4/5      S 5       rS rS r\2R                  R                  S/ SQ\GR                  " / SQ\GR                  S9/5      S 5       r\0S 5       r\0\2R                  R                  \S:  SS#9S 5       5       rS r\2R                  R                  SSuS/5      S 5       rS r\2R                  R                  S/ SQ5      \2R                  R                  SSuS/5      S 5       5       rS rS rS rS rS rS rS r\/\2R                  R                  S.\* V s/ s H  o S:w  d  M
  U PM     sn S./S/9S 5       5       r\/\2R                  R                  S.S/S./S/9S 5       5       r\2R                  R                  SS\2R                  " SS\.S9SS/5      S 5       r\2R                  R                  S/ SQ5      \2R                  R\                  S 5       5       r\2R                  R                  SI\*5      \2R                  R\                  S 5       5       r\2R                  R                  S5      \2R                  R                  SSS/5      \2R                  R                  SI\*S/-    V s/ s H  o S:w  d  M
  U PM     sn 5      \2R                  R\                  S 5       5       5       5       r\2R                  R\                  S 5       r\2R                  R                  SI\* V s/ s H  o S;  d  M
  U PM     sn 5      \2R                  R                  S/ S4S/\GR                  4S/\GR:                  4S/\4/5      \2R                  R\                  S 5       5       5       rS r\2R                  R\                  S 5       r\2R                  R                  SISS/5      \2R                  R\                  S 5       5       r\2R                  R\                  S 5       r\2R                  R                  SI\*5      \2R                  R\                  S 5       5       r\2R                  R                  SSS/5      \2R                  R\                  S 5       5       r\2R                  R\                  S 5       rS r\2R                  R\                  S 5       r\2R                  R                  SSSS/S4SSS/S4SSSS/S4SSSS/S4SSS/S4SSSS/S4/5      \2R                  R\                  S 5       5       r\2R                  R                  SSSSS/S4SSSSS/S4SSSSS/S4SSSSS/S4SSSSS/S4SSSiSS/S4SSSS/S4SSSSS/S4SSSS/S4SSSS/S4SSSS/S4SSSiS/Si4SSSS/S4SJSSSS/S4SJSSSS/S4SJSSSS/S4SJSSSS/S4SJSSSS/S4/5      \2R                  R\                  S 5       5       r\2R                  R                  S/ SQ5      \2R                  R\                  S 5       5       r\2R                  R\                  S 5       r\2R                  R                  SI\* V s/ s H  o SJ;  d  M
  U PM     sn 5      \2R                  R\                  S 5       5       r\2R                  R\                  S 5       r\2R                  R                  SI\* V s/ s H  o S;  d  M
  U PM     sn 5      \2R                  R                  SS\@R                  " SS5      /\@R                  " SS5      S/S\@R                  " SSS5      /SS//5      \2R                  R\                  S 5       5       5       r\2R                  R                  S5      \2R                  R\                  \1S 5       5       5       r\2R                  R                  SI/ SQ5      \2R                  R\                  S 5       5       rS r\.S 5       r\2R                  R\                  S 5       r\2R                  R\                  S 5       r\2R                  R                  SSSS/4SSS/4SSS/4SSS/4SSS/4SSS/4SSS/4/5      \2R                  R\                  S 5       5       r\2R                  R                  SI\*5      \2R                  R                  SSSSS/4SSSS/4SSSS/4SSSS/4SSSS/4SSSS/4SSSS/4SSSSS/4SSSSS/4SSSSS/4SSSSS/4/5      \2R                  R\                  S 5       5       5       r\2R                  R                  S/ SQ5      \2R                  R                  GS 5      GS 5       5       rGS rGS rGS r\2R                  R\                  GS 5       r\2R                  R                  GS/ GSQ5      \2R                  R\                  GS 5       5       r\2R                  R                  GSGS	GS
/5      \2R                  R                  GSSS0GSS0GSS0/5      \2R                  R\                  GS 5       5       5       r\2R                  R                  GSGS	GS
/5      \2R                  R\                  GS 5       5       r\2R                  R                  \(       + GSS#9GS 5       r\0\2R                  R                  \GS:  GSS#9\2R                  R                  SI\*5      GS 5       5       5       r\0\2R                  R                  \GS:  GSS#9\2R                  R                  SI\*5      GS 5       5       5       r\0GS 5       r\2R                  R                  GS5      \2R                  R                  GSGSGS/5      GS 5       5       rGS r\2R                  R                  GSGSGS/5      GS 5       r\2R                  R                  GSGSGS/5      GS 5       rGS  rGS! r\2R                  R                  SIGS"GS#/5      GS$ 5       r\0\2R                  R                  SIGS"GS#/5      GS% 5       5       rGS& rGS' rGS( rGS) r\2R                  R\                  GS* 5       r\2R                  R\                  \2R                  R                  S5\" 5       ;  GS+S#9GS, 5       5       r\2R                  R\                  GS- 5       r\2R                  R\                  \2R                  R                  \,(       + SAS#9GS. 5       5       rg! \H a     GNf = fs  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f s  sn f (/      N)datetime)BytesIO)ZipFile)__gdal_version__list_driverslist_layers	read_infoset_gdal_config_optionsvsi_listtree
vsi_unlink)
GDAL_GE_37GDAL_GE_311HAS_ARROW_WRITE_API
HAS_PYPROJPANDAS_GE_15PANDAS_GE_23PANDAS_GE_30SHAPELY_GE_21)DataLayerErrorDataSourceErrorFeatureErrorGeometryError)PANDAS_GE_20read_dataframewrite_dataframe)DRIVERS_NO_MIXED_DIMENSIONSDRIVERS_NO_MIXED_SINGLE_MULTI)ALL_EXTSDRIVERSGDAL_HAS_PARQUET_DRIVER	START_FIDrequires_arrow_write_apirequires_gdal_geosrequires_pyarrow_apirequires_pyproj)from_wkt)is_bool_dtypeis_datetime64_dtypeis_float_dtypeis_integer_dtypeis_object_dtypeis_string_dtype)Point)assert_geodataframe_equal)assert_index_equalassert_series_equal	geopandassessionFT)marks)scopeparamsc                     U R                   $ N)param)requests    b/var/www/html/Sattelite-Image/venv/lib/python3.13/site-packages/pyogrio/tests/test_geopandas_io.py	use_arrowr;   O   s     ==    )autousec                     SU R                   ;   a  U R                  S5      OSnU(       aD  [        (       d8  U R                  R	                  S5      (       a  [
        R                  " S5        g g g g )Nr;   Fr"   z&GDAL>=3.8 required for Arrow write API)fixturenamesgetfixturevaluer   nodeget_closest_markerpytestskip)r9   r;   s     r:   skip_if_no_arrow_write_apirE   Z   sh     '... 	,  	##LL++,FGG<= H $ 	r<   c               #      #    [         R                  R                  SS 5      n S[         R                  S'   S v   U (       a  U [         R                  S'   g [         R                  S	 g 7f)NPYOGRIO_USE_ARROW1)osenvironget)originals    r:   use_arrow_contextrM   k   sK     zz~~148H&)BJJ"#	*2

&'JJ*+s   A%A'c                     [        U SSS9ng)z?Check if SpatiaLite is available by running a simple SQL query.zselect spatialite_version();SQLITE)sqlsql_dialectN)r   )test_gpkg_nulls_s     r:   test_spatialite_availablerT   v   s    ;	Ar<   zencoding, arrow)utf-8FrU   )cp1252F)NFc                    U S-  n[        USUS9 nUR                  S5        UR                  S5        SSS5        [        X1US9n[        U5      S:X  d   eUR                  R                  5       S	S
/:X  d   eUR                  R                  5       S/:X  d   eUR                  R                  5       S/:X  d   eg! , (       d  f       N= f)zW"Test reading CSV files with different encodings.

Arrow only supports utf-8 encoding.
test.csvwencoding   näme,city
   Wilhelm Röntgen,Zürich
Nr[   r;         nämecity   Zürich   Wilhelm Röntgen)openwriter   lencolumnstolistra      näme)tmp_pathr[   arrowcsv_pathcsvdfs         r:   test_read_csv_encodingro   }   s      *$H	hh	/3		.!		./ 
0 
u	EBr7a<<::7F"333377>>	{***88??!3 4444 
0	/s   #B<<
C
zUTF-8z(test requires non-UTF-8 default platformreasonc                 F   U S-  n[        US[        R                  " 5       S9 nUR                  S5        UR                  S5        SSS5        U(       a,  [        R
                  " [        SS9   [        X!S	9nSSS5        g[        X!S	9n[        U5      S
:X  d   eUR                  R                  5       SS/:X  d   eUR                  R                  5       S/:X  d   eUR                  R                  5       S/:X  d   eg! , (       d  f       N= f! , (       d  f       g= f)zVerify that read defaults to platform encoding; only works on Windows (CP1252).

When use_arrow=True, reading an non-UTF8 fails.
rX   rY   rZ   r\   r]   Nz; please use_arrow=Falsematchr;   r_   r`   ra   rb   rc   )rd   localegetpreferredencodingre   rC   raisesr   r   rf   rg   rh   ra   ri   )rj   r;   rl   rm   rn   s        r:   test_read_csv_platform_encodingry      s     *$H	hf&A&A&C	D		.!		./ 
E ]],
  >B	
 
 H:2w!||zz  "w&7777ww~~I;...xx %7$8888! 
E	D

 
s   #D/
D
D
D c                     [        U 5      n[        (       a  UR                  S:X  d   e[        U5      S:X  d   eUR                  R                  5       / SQ:X  d   eg )N	EPSG:4326   )pop_est	continentnameiso_a3
gdp_md_estgeometry)r   r   crsrf   rg   rh   )naturalearth_lowres_all_extrn   s     r:   test_read_dataframer      sX    	3	4Bzvv$$$r7c>>:: #   r<   c                 @    [        U S   US9n[        U5      S:X  d   eg )Nr_   ru   r|   r   rf   )naturalearth_lowres_vsir;   rn   s      r:   test_read_dataframe_vsir      s$    	/2i	HBr7c>>r<   zcolumns, fid_as_index, exp_len)NF   r   c                 z    [        U UUUS9n[        U5      [        R                  L d   e[	        U5      U:X  d   eg )N)rg   fid_as_indexr;   )r   typepd	DataFramerf   )no_geometry_filerg   r   r;   exp_lenresults         r:    test_read_layer_without_geometryr      sD     !	F <2<<'''v;'!!!r<   z!naturalearth_lowres, expected_ext).gpkgr   ).shpr   naturalearth_lowres)indirectc                 `    U R                   U:X  d   e[        U 5      n[        U5      S:X  d   eg )Nr|   )suffixr   rf   )r   expected_extrn   s      r:    test_fixture_naturalearth_lowresr      s3     %%555	+	,Br7c>>r<   c                     [        XSS9n[        U[        R                  5      (       d   e[        U[        R
                  5      (       a   eg )NFr;   read_geometry)r   
isinstancer   r   gpGeoDataFramer   r;   rn   s      r:   test_read_no_geometryr      sD    	#
B b",,''''"boo.....r<   c           	          [         R                  " [        SS9   [        U / SSUS9nS S S 5        g ! , (       d  f       g = f)Nz^at least one of read_geometry or return_fids must be True or columns must be None or non-emptyrs   Frg   r   r   r;   rC   rx   
ValueErrorr   )r   r;   rS   s      r:   (test_read_no_geometry_no_columns_no_fidsr      sA    	#
 

 
 
s   1
?c                 T   U S-  n[         R                  " [        SSS5      [        SSS5      /SS9n[        X25        [	        U5      nUR
                  S   R                  R                  (       d   e[	        USSUS9nUR
                  S   R                  R                  (       a   eg )N	test.gpkgr   r_   r{   r   r   T)force_2dmax_featuresr;   )r   r   r-   r   r   ilocr   has_zrj   r;   filenameexpectedrn   s        r:   test_read_force_2dr     s    +%H 1a.%1a.1{H H'		!B771:$$$$		
B wwqz""(((((r<   c                      [        SS05        [        R                  " [        SS9   [	        XS9  S S S 5        [        SS 05        g ! , (       d  f       N= f! [        SS 05        f = f)NOGR_GEOJSON_MAX_OBJ_SIZEg{Gz?z:Failed to read GeoJSON data; .* GeoJSON object too complexrs   ru   )r
   rC   rx   r   r   )naturalearth_lowres_geojsonr;   s     r:   test_read_geojson_errorr     sd    D!;T BC]]N
 6L	
 	 !;T BC
 
 	 !;T BCs!   &A 
AA 
AA A(LIBKMLzGLIBKML driver is not available and is needed to read simpledata elementc                 j    [        XS9nSUR                  ;   d   eUS   R                  S   S:X  d   eg)zTest reading a KML file with a simpledata element.

Simpledata elements are only read by the LibKML driver, not the KML driver.
ru   	formationr   TonN)r   rg   r   )kml_filer;   gdfs      r:   test_read_kml_simpledatar   %  s@     
7C #++%%%{  #u,,,r<   c                    U S-  n[         R                  " [        SS5      /SS9nU(       a   UR                  R	                  S5      Ul        [        UUSS9  [         R                  " [        SS5      /SS9nU(       a   UR                  R	                  S5      Ul        [        XBS	S
S9  [        R                  " [        U5      SS/S	S//5      (       d   eUSS.n[        R                  " [        SS9   [        U40 UD6nS S S 5        [        WU5        [        U4SS	0UD6n[        Xd5        [        U4SS0UD6n[        Xd5        g ! , (       d  f       NM= f)Nr   r   r{   r   strlayer1)layerr_   layer2T)r   appendr-   )r;   r   zMore than one layer foundrs   r   )r   r   r-   rg   astyper   nparray_equalr   rC   warnsUserWarningr   r.   )rj   r;   r   	expected1	expected2kwargsrn   s          r:   test_read_layerr   5  sO   +%H %1+KHI &--44U;	 %1+KHI%--44U;	IxE>>H7 3h5HI    %a8F 
k)D	EH// 
F b), 
	;	;F	;Bb, 
	4	4V	4Bb, 
F	Es   5E		
Ec                     [         R                  " [        SS9   [        U SUS9  S S S 5        g ! , (       d  f       g = f)Nz!Layer 'wrong' could not be openedrs   wrong)r   r;   )rC   rx   r   r   r   r;   s     r:   test_read_layer_invalidr   a  s+    	~-P	Q2'YW 
R	Q	Q   /
=rg   colc                    [        XUS9nUb  SU;   a  SUR                  ;   d   e[        UR                  R                  5      (       d   e[
        (       a'  UR                  R                  R                  S:X  d   eg UR                  R                  R                  S:X  d   eg [        UR                  5      S:X  d   eg )N)rg   r;   r   zdatetime64[ms]zdatetime64[ns]r_   )r   rg   r(   r   dtyper   r   rf   )datetime_filerg   r;   rn   s       r:   test_read_datetime_columnsr   f  s    	)	LB %7*

""""266<<0000<66<<$$(888866<<$$(88882::!###r<   c                 R	   U R                   S:X  a!  [        (       d  [        R                  " S5        [	        U 5      nU R                   n[        XS9nSUR                  ;   d   eUS   S   S:X  d   eUS   S   S;   d   eUS   S	   R                  5       S	S/:X  d   eUS   S   R                  5       S
S/:X  d   eUS   S
   R                  5       / :X  d   eUS   S   b   eUS   S   b   eSUR                  ;   d   eUS   S
   S:X  d   eUS   S
   S:X  d   eUS   S	   R                  5       SS/:X  d   eUS   S   R                  5       SS/:X  d   eUS   S
   R                  5       / :X  d   eUS   S   b   eUS   S   b   eSUR                  ;   d   eUS   S   S:X  d   eUS   S   S:X  d   eUS   S	   R                  5       SS/:X  d   eUS   S   R                  5       / SQ:X  d   eUS   S
   R                  5       / :X  d   eUS   S   b   eUS   S   S/:X  d   eUS:X  a	  SnSnS	S/nO"SnSnU(       a  S[        R                  /nOS	S	/nSUR                  ;   d   eUS   S   S:X  d   eUS   S   U:X  d   eUS    S   U:X  d   eUS   S	   S	   S	:X  d   eUS   S	:X  a  US   S	   S   US   :X  d   eO&[        R                  " US   S	   S   5      (       d   eUS:X  a  US   S   S
S/:X  d   eUS   S
   / :X  d   eO:US   S   R                  5       S
S/:X  d   eUS   S
   R                  5       / :X  d   e[        R                  " US   S   5      (       d   e[        R                  " US   S   5      (       d   eUS:X  a  SnSnOSnSnS!UR                  ;   d   eUS   S"   S!:X  d   eUS   S"   U:X  d   eUS    S"   U:X  d   eUS:X  a/  US!   S	   SS/:X  d   eUS!   S   / SQ:X  d   eUS!   S
   / :X  d   eOeU(       d  SS/OSS/nUS!   S	   R                  5       U:X  d   eUS!   S   R                  5       / SQ:X  d   eUS!   S
   R                  5       / :X  d   e[        R                  " US!   S   5      (       d   eUS!   S   S/:X  d   eg)#9Test reading a geojson file containing fields with lists..parquetESkipping test for parquet as the GDAL Parquet driver is not availableru   list_intfieldsr_   	ogr_types)OFTIntegerListOFTInteger64Listr      r   N   list_doubleOFTRealListg              ?       @      @list_stringOFTStringListstring1string2)string3string4 r   .geojson	OFTStringOFSTJSONr   OFSTNonelist_int_with_nullogr_subtypeslist_string_with_null   )r   r    rC   rD   r	   r   rg   rh   r   nanr   isna)	list_field_values_filesr;   infor   r   exp_typeexp_subtypeexp_list_int_with_null_value	exp_values	            r:   test_read_list_typesr   w  sD   %%3<S<SS	
 ,-D$++F3IF '''>!
***Q#IIII*a '')aV333*a '')aV333*a '')R///*a (((*a ((( FNN***>!---Q=000- #**,c
:::- #**,c
:::- #**,222- #+++- #+++ FNN***>!---Q?222- #**,I0FFFF- #**,0JJJJ- #**,222- #+++- #t+++ 
  ()4y$ & ,/=(,-q6(
  6>>111>! 4444Q8+++"k111&'*1-222#A&!+*+A.q15QRS5TTTTwwv23A6q9::::*+A.1a&888*+A."444 *+A.557Aq6AAA*+A.5572===776./23333776./23333 
   # "fnn444>! 7777Q8+++"k111-.q1i5FFFF-.q15OOOO-.q1R777 ,5YO9d:K	-.q188:iGGG-.q188:>XXXX-.q188:b@@@77612156666)*1-"555r<   r   r   c                    UR                   S:X  a!  [        (       d  [        R                  " S5        U(       a^  U(       aW  [	        U5      S:X  aH  UR                   S:X  a8  SnU R
                  R                  [        R                  R                  US95        [        XUS9nUc  SO[	        U5      S	-   n[	        UR                  5      U:X  d   eg)
r   r   r   r   zyThis fails with 'pyarrow.lib.ArrowInvalid: ArrowArray struct has 1 children, expected 0 for type extension<geoarrow.wkb>'rp   r;   rg   N   r_   )r   r    rC   rD   rf   rA   
add_markermarkxfailr   rg   )r9   r   r;   rg   	error_msgr   exp_columnss          r:   test_read_list_types_columnsr    s     %%3<S<SS	
 	LA#**j8
G 	 	 1 1 1 CDgF
 !CL1,<Kv~~+---r<   zParquet driver is not availablec                    U(       d  [         R                  " S5        [        XS9nSUR                  ;   d   e[        R
                  " US   R                  5       [        R                  " / SQ5      5      (       d   eSUR                  ;   d   eUS   R                  [        :X  d   eUS   S   R                  5       / SQ:X  d   eUS   S   R                  5       / SQ:X  d   eUS   S	   R                  5       / SQ:X  d   eS
UR                  ;   d   eUS
   R                  [        :X  d   eUS
   S   R                  5       SS	S.SS	S./:X  d   eUS
   S   R                  5       SS	S.SS	S./:X  d   eUS
   S	   R                  5       SS	S.SS	S./:X  d   eSUR                  ;   d   eUS   R                  [        :X  d   eUS   S   SS	S.:X  d   eUS   S   SS	S.:X  d   eUS   S	   SS	S.:X  d   eg)zDTest reading a Parquet file containing nested struct and list types.zWhen use_arrow=False, gdal flattens nested columns to seperate columns. Not sure how we want to deal with this case, but for now just skip.ru   col_flat)r   r_   r   col_listr   r_   r   r   r_   r   
col_nested)ab
col_structN)rC   rD   r   rg   r   r   to_numpyarrayr   objectrh   )list_nested_struct_parquet_filer;   r   s      r:   )test_read_list_nested_struct_parquet_filer    s4    R	

 ;QF'''>>&,557)9LMMMM'''*##v---*a '')Y666*a '')Y666*a '')Y6666>>))),%%///,"))+aa0@PQBR/SSSS,"))+aa0@PQBR/SSSS,"))+aa0@PQBR/SSSS6>>))),%%///,"AA&6666,"AA&6666,"AA&6666r<   c                 B   SS[         R                  S[        4S jjn[        X#S9nU" XS5        U(       a  SnUR	                  S/S9nO8SnU R
                  R                  [        R                  R                  S	S
95        US-  n[        XWUS9  [        XsS9nU" XUS9  g)z=Test roundtripping a GeoJSON file containing many data types.Frn   r;   c                 l   SU R                   ;   d   e[        U S   R                  5      (       d   eU S   R                  5       S/:X  d   eSU R                   ;   d   e[	        U S   R                  5      (       d   eU S   R                  5       S/:X  d   eSU R                   ;   d   e[        U S   R                  5      (       d   eU S   R                  5       S/:X  d   eSU R                   ;   d   e[        U S   R                  5      (       d   eU S   R                  5       S/:X  d   eS	U R                   ;   d   eU(       a\  [        U S	   R                  5      (       d   eU S	   R                  5       [        R                  " S
5      R                  5       /:X  d   eOM[        U S	   R                  5      (       d   eU S	   R                  5       [        R                  " S
5      /:X  d   eSU R                   ;   d   e[        U S   R                  5      (       d   eU S   R                  5       [        R                  " S5      /:X  d   eSU R                   ;   d   e[        U S   R                  5      (       d   eU S   S   R                  5       / SQ:X  d   eSU R                   ;   d   e[        U S   R                  5      (       d   eU S   S   R                  5       / SQ:X  d   eU(       dB  SU R                   ;   d   e[        U S   R                  5      (       d   eU S   S   / SQ:X  d   egg)zFunction to validate the data of many_data_types_geojson_file.

Depending on arrow being used or not there are small differences.
int_colr_   	float_colg      ?str_colstringbool_colTdate_colz
2020-01-01datetime_colz2020-01-01T12:00:00list_int_colr   r  list_str_col)r  r  clist_mixed_col)r_   r  NTN)rg   r*   r   to_listr)   r,   r'   r+   r   	Timestampdater(   rh   )rn   r;   ignore_mixed_list_cols      r:   validate_resultDtest_roundtrip_many_data_types_geojson_file.<locals>.validate_result9  s   
 BJJ&&&9 3 34444)}$$&1#---bjj(((bo334444+&&(SE111BJJ&&&r)}223333)}$$&8*444RZZ'''R
^112222*~%%'D6111RZZ'''"2j>#7#78888j>))+\0J0O0O0Q/RRRR 'r*~';';<<<<j>))+\0J/KKKK +++"2n#5#;#;<<<<.!))+=R0S/TTTT+++r.1778888.!!$++-:::+++r.1778888.!!$++-@@@$#rzz111"2&6#7#=#=>>>>&'*.BBBB %r<   ru   Tr"  rg   z3roundtripping list types fails with use_arrow=Falserp   ztemp.geojson)r&  N)F)r   r   boolr   droprA   r  rC   r  r  r   )	r9   rj   many_data_types_geojson_filer;   r'  read_gdfr&  tmp_fileread_back_gdfs	            r:   +test_roundtrip_many_data_types_geojson_filer0  3  s    4CBLL 4CT 4Cn :PHH(  $==*:);=< %KKL  	
 .(HH)< #8AM8Mr<   z;ignore: Non-conformant content for record 1 in column datesc                    SS/n[         R                  " [         R                  " U5      SS9nUR                  R	                  S5      nUR                  R                  S5      n[        (       a  UR                  R                  S5      ng g )N2023-01-01 11:00:01.1112023-06-01 10:00:01.111datesr   Australia/SydneyUTCms)r   Seriesto_datetimedttz_localize
tz_convertr   as_unit)rj   r;   r4  	naive_collocalised_colutc_cols         r:    test_write_datetime_mixed_offsetrB    sq     '(ABE		"../g>ILL,,-?@M))%0G|**$$T* r<   datetime_as_stringmixed_offsets_as_utcc           
         [         R                  " 5       nSnU(       d9  [        (       d.  U(       a  [        (       a  [        R
                  " [        SS9nSnOLU(       aE  [        (       d:  [        (       d/  [        R                  " [        [        R                  " S5      S9nSnU   [        U UUUS9n[        R                  " S/SS	9nU(       a=  [        UR                   R"                  5      (       d   e[%        UR                   U5        OU(       a=  [        UR                   R"                  5      (       d   e[%        UR                   U5        O}['        UR                   5      (       d   eUR                   R(                  S
   [        R*                  " SSSSS
S
5      :X  d   eUR                   R(                  S
   R,                  S:X  d   eSSS5        g! , (       d  f       g= f)zTest writing/reading a column with a datetime far in the past.
Dates from before 1678-1-1 aren't parsed correctly by pandas < 3.0, so they
stay strings.
Reported in https://github.com/geopandas/pyogrio/issues/553.
Fz6Error parsing datetimes, original strings are returnedrs   Tz8Casting from timestamp[ms] to timestamp[ns] would resultr;   rC  rD  z1670-01-01T09:00:00r  r5  r   i  r_   	   r8  N)
contextlibnullcontextr   r   rC   r   r   r   rx   	Exceptionreescaper   r   r9  r,   r  r   r0   r(   r   r$  unit)geojson_datetime_long_agor;   rD  rC  handleroverflow_occuredrn   exp_dates_strs           r:   test_read_datetime_long_agorR    sv    $$&GllI ,,W
  	<< --))VW
   
%1!5	
 		#8"9O"2??#8#89999?  &r'<'<====#BOO]C +2??;;;;++A.",,tQ1aQR2SSSS++A.33t;;;/ 
s   &D(G
G%extr   c                 t   SS[         R                  /n[        (       a%  [        R                  " USS9R                  S5      nO[        R                  " U5      n[        R                  " U[        SS5      /S-  S.S	S
9nU SU 3-  n[        XxUS9  [        UUUUS9n	U(       a  US:X  a  [        S:  a  UR                  R                  R                  S5      n
U(       aU  U
R                  S5      R                   R#                  SS5      n
[         R                  U
S'   [%        U	R                  U
5        gU(       d  [%        U	R                  U
5        ggU(       a  ['        U	R                  R(                  5      (       d   eU(       aS  [        S:  aI  UR                  R                  S5      R                   R#                  SS5      n[         R                  US'   O[        R*                  " USS9n[%        U	R                  U5        g[-        U	R                  R(                  5      (       d   e[/        X5        g)zNTest writing/reading a column with naive datetimes (no time zone information).2020-01-01T09:00:00.123z2020-01-01T10:00:00ISO8601formatr8  r_   r   r4  r   r{   r   testru   rF  r   r      r   r7  r    Tr   r4  r5  N)r   r   r   r   r:  r>  r   r   r-   r   r   r   r4  r;  r<  r   r   replacer0   r,   r   r9  r(   r.   )rj   rS  rC  rD  r;   	dates_rawr4  rn   fpathr   	exp_dates	dates_strs               r:   test_write_read_datetime_no_tzre    s    +,A266JI|y;CCDIy)	eAqk]Q%67[
B cU|#EB3-1	F SG^(8:(E
 HHKK++E2	!((/33;;CEI66IaLi8%i8 & 
v||112222)J6.22::3DI66IaL		)':IFLL)4"6<<#5#56666!&-r<   z6ignore: Non-conformant content for record 1 in column c                    U(       aF  [         S:  a<  US;   a6  U R                  R                  [        R                  R                  SS95        SS[        R                  /n[        (       a%  [        R                  " USS9R                  S	5      nO[        R                  " U5      n[        R                  " U[        S
S
5      /S-  S./ SQSS9n[        UR                   R"                  [        R$                  5      (       d   eUSU 3-  n	['        XUS9  [)        U	UUUS9n
U
R                   R"                  R*                  R-                  S5      (       a4  U
R                   R/                  UR                   R"                  5      U
l        U(       a~  US;   ax  [         S:  an  UR1                  5       nXR                   R3                  5          R                   R/                  [4        5      Ul        [7        U
R                   UR                   SS9  gU(       Ga  [9        U
R                   R"                  5      (       d   eU(       a]  [         S:  aS  UR                   R/                  S5      R4                  R;                  SS5      n[        R                  UR<                  S'   Oz[         S:  a[  U Vs/ s H%  n[        R2                  " U5      (       d  M   USS PM'     sn[        R                  /-   n[        R>                  " USS 9nO[        R>                  " USS 9n[7        U
R                   USS9  g[7        U
R                   UR                   SS9  gs  snf )!zzWrite and read file with all equal time zones.

This should result in the result being in pandas datetime64 dtype column.
r   
   r   r   	.geojsonlz:Wrong datetimes read in GeoJSON with GDAL < 3.10 via arrowrp   2020-01-01T09:00:00.123-05:002020-01-01T10:00:00-05:00rV  rW  r8  r_   r   rY  )r   r   r   r{   )indexr   r[  ru   rF  , pytz.FixedOffset(-300)].fgbr   r\  F)check_indexr   r^  r_  r   r   r  r   Nr4  r5  ) r   rA   r  rC   r  r  r   r   r   r   r:  r>  r   r   r-   r   r4  r   DatetimeTZDtyper   r   r   endswithr   copynotnar   r0   r,   r`  r   r9  )r9   rj   rS  rC  rD  r;   ra  r4  rn   rb  r   df_exprd  xs                 r:   test_write_read_datetime_tzrz    s    %
2s>W7W 	KKS  	
 12MrvvVI|y;CCDIy) 
eAqk]Q%67
B
 bhhnnb&8&89999cU|#EB3-1	F ||''(CDD||**288>>:S--2BZ2Oll002399@@EFLL&,,EJ	v||112222)J6.22::3DI "INN1	))2BAbhhqk3BBbffXMI		)':I		)':IFLL)GFLL"((F Cs   0M	Mc                    SS[         R                  /n[        R                  " [        R                  " U5      SS9nUR
                  R                  S5      nUR                  [        5      nU(       a_  UR                  R                  SS5      n	U	R                  R                  SS	5      n	[        S
:  a  U	R                  R                  SS5      n	O[U(       aB  UR
                  R                  S5      n	[        (       a  U	R
                  R                  S5      n	OUR                  S 5      n	[         R"                  " U[%        SS5      /S-  S.SS9n
U SU 3-  n['        XUS9  [)        UUUUS9nU(       Gar  [        S:  Gag  US;   a  UR
                  R                  S5      n[        (       a  UR
                  R                  S5      nU(       aU  [+        UR,                  R.                  5      (       d   eUR                  [        5      R                  R                  SS5      n[        R0                  " UR,                  S   5      (       d   e[3        UR,                  R5                  S5      UR5                  S5      5        gUS;   a_  [        R0                  " UR,                  S   5      (       d   e[3        UR,                  R5                  S5      UR5                  S5      5        gU(       a'  [+        UR,                  R.                  5      (       d   eOcU(       a6  [7        UR,                  R.                  [        R8                  5      (       d   eO&[;        UR,                  R.                  5      (       d   e[        R0                  " UR,                  S   5      (       d   e[3        UR,                  R5                  S5      U	R5                  S5      5        g)zLTest with localized dates across a different summer/winter time zone offset.r2  r3  r4  r5  r6  r^  r_  z.111000z.111rr  r   rs  r7  r8  c                 h    [         R                  " U 5      (       a  [         R                  " U 5      $ S $ r7   )r   rw  r$  ry  s    r:   <lambda>Dtest_write_read_datetime_tz_localized_mixed_offset.<locals>.<lambda>l  s     !bll1o>$>r<   r_   r   rY  r{   rZ  r[  ru   rF  r\  ri  r   Nr   rp  )r   r   r   r9  r:  r;  r<  r   r   r`  r   slicer=  r   r>  applyr   r   r-   r   r   r,   r4  r   r   r0   headr   rt  r+   )rj   rS  rC  rD  r;   ra  dates_naivedates_localdates_local_offsets_strrc  rn   rb  r   	dates_utcs                 r:   2test_write_read_datetime_tz_localized_mixed_offsetr  P  s    +,ErvvNI))BNN95GDK..,,-?@K)005+//77SA	MM)))V<	i'!++Ar2I	NN--e4	<!,,T2I+11>
	 
E!QK=1+<=;
B cU|#EB3-1	F %
2++ $11%8I|%LL006	!&v||'9'9::::%,,S155==c3G	776<<?++++ 1 1! 4innQ6GH%%776<<?++++ 1 1! 46M6R6RST6UV v||112222	&,,,,b.@.@AAAAv||112222 776<<?####))!,innQ.?@r<   c                    [         R                  " S5      [         R                  " S5      [        R                  /n[        R
                  " U[        SS5      /S-  S.SS9nU SU 3-  n[        XgUS	9  [        UUUUS
9nU(       Ga+  [        S:  Ga   US;   a  UR                  5       n	[         R                  " USS9U	l        [        (       a*  U	R                  R                  R                  S5      U	l        U(       a:  U	R                  R!                  S5      R"                  R%                  SS5      U	l        [         R&                  U	R(                  S'   [+        X5        gUS;   aK  UR                  5       n	U	R                  R!                  S5      R!                  S5      U	l        [+        X5        gU(       a  [-        UR                  R.                  5      (       d   eUR                  R1                  S 5      n
[        S:  a  U
R"                  R3                  SS5      n
[5        UR                  U
5        gU(       a  [7        UR                  R.                  [         R8                  5      (       d   e[         R                  " UR                  SS9n[        (       a  UR                  R                  S5      n[5        UR                  U5        g[;        UR                  R.                  5      (       d   e[+        X5        g)z-Test with dates with mixed time zone offsets.z2023-01-01 11:00:01.111+01:00z2023-06-01 10:00:01.111+05:00r_   r   rY  r{   rZ  r[  ru   rF  r\  ri  T)utcr8  r   r^  r_  )r   r4  Nr  r  Oc                 v    [         R                  " U 5      (       a  U R                  SS9$ [        R                  $ )Nmilliseconds)timespec)r   rw  	isoformatr   r   r}  s    r:   r~  ;test_write_read_datetime_tz_mixed_offsets.<locals>.<lambda>  s'    bhhqkkakk>k:UrvvUr<   rr  r   rs  )r   r$  r   r   r   r   r-   r   r   r   rv  r:  r4  r   r;  r>  r   r   r`  NAlocr.   r,   r   mapr  r0   r   rt  r+   )rj   rS  rC  rD  r;   r4  rn   rb  r   rx  rd  rc  s               r:   )test_write_read_datetime_tz_mixed_offsetsr    sI    	45
45
E 
eAqk]Q%67[
B cU|#EB3-1	F %
2++ WWYF>>%T:FL|%||66t<!%||2259==EEc3O%'UUFJJz"%f5%% WWYF!<<..x8??DFL%f5v||112222HHLLU
	 i'!++Ar2IFLL)4	&,,,,b.@.@AAAANN2886	<!,,T2IFLL)4v||112222!&-r<   ra  rk  rl  c                 6   [         R                  " USS9n[        R                  " U[	        SS5      /S-  S.SS9nU SU 3-  n[        XxUS	9  [        UUUUS
9n	[        (       a%  [         R                  " USS9R                  S5      n
O[         R                  " U5      n
UR                  5       n[         R                  " U
SS9US'   U	R                  R                  R                  R                  S5      (       a2  U	R                  R                  UR                  R                  5      U	S'   U(       a  [         S:  a  US;   a  U(       a+  [         R                  " SS["        R$                  /5      US'   OWUR                  [         R&                  " SS9-
  US'   [        (       a(  UR                  R(                  R                  S5      US'   [+        X5        gU(       aF  [         S:  a<  US;   a6  [         R                  " SS["        R$                  /5      US'   [+        X5        gU(       a  [-        U	R                  R                  5      (       d   eU(       a5  [         S:  a+  [         R                  " SS["        R$                  /5      US'   O[         R                  " SS["        R$                  /5      US'   [         S:  a)  UR                  R.                  R1                  S S!5      US'   OU(       ae  [3        U	R                  R                  [         R4                  5      (       d   e[/        U	R                  R                  R6                  5      S";   d   eO5[3        U	R                  R                  [         R4                  5      (       d   e[+        X5        g)#z;Datetime objects with equal offsets are read as datetime64.r  r   r_   r   rY  r{   rZ  r[  ru   rF  rV  rW  r8  r4  r5  rn  rg  ri  z 2020-01-01T04:00:00.123000-05:00z2020-01-01T05:00:00-05:00r   )hoursNr\  ro  z 2020-01-01 09:00:00.123000-05:00z2020-01-01 10:00:00-05:00z 2020-01-01T09:00:00.123000-05:00rl  rk  rr  r   rs  )z	UTC-05:00zpytz.FixedOffset(-300))r   r9  r   r   r-   r   r   r   r:  r>  rv  r4  r   r   ru  r   r   r   r   	Timedeltar;  r.   r,   r   r  r   rt  tz)rj   ra  rS  r;   rC  rD  r4  rn   rb  r   rc  exp_dfs               r:   #test_write_read_datetime_tz_objectsr    s   4 IIis+E	eAqk]Q%67[
B cU|#EB3-1	F |NN9Y?GGM	NN9-	WWYFii	8F7O ||''(CDD ,,--fll.@.@Aw%
2s>W7W  ii6/FFF7O %llR\\-BBF7O|"(,,//"9"9$"?w!&1%
2s>O7O ))/1LbffU
w 	"&1v||112222)J6 ii6/FFF7O !ii02MrvvVF7O  )+"(,,"2"2"8"8B"?w	&,,,,b.@.@AAAA6<<%%(()-TTTT&,,,,b.@.@AAAAf-r<   c                    SS[         R                  /n[        (       a%  [        R                  " USS9R                  S5      nO[        R                  " U5      n[        R                  " U[        SS5      /S-  S.S	S
9nUR                  R                  R                  S;   d   eU SU 3-  n[        XxUS9  [        UUUUS9n	U(       a  US:X  a  [        S:  a  U(       ac  [        U	R                  R                  5      (       d   e[        R                   " SS[         R                  /SS9n
[#        U	R                  U
5        g[#        U	R                  UR                  R$                  R'                  S5      5        gU(       a  [        U	R                  R                  5      (       d   eU(       aS  [        S:  aI  UR                  R)                  S5      R*                  R-                  SS5      n
[         R                  U
S'   O;[        R                   " USS9n
[        S:  a  U
R*                  R-                  SS5      n
[#        U	R                  U
5        gU	R                  R                  R                  S;   d   e[/        X5        g)z1Test writing/reading a column with UTC datetimes.z2020-01-01T09:00:00.123Zz2020-01-01T10:00:00ZrV  rW  r8  r_   r   rY  r{   rZ  )zdatetime64[ms, UTC]zdatetime64[ns, UTC]r[  ru   rF  rp  r\  rU  z2020-01-01T10:00:00.000r4  r5  Nr   r^  r_  r   rr  Zz+00)r   r   r   r   r:  r>  r   r   r-   r4  r   r   r   r   r   r,   r9  r0   r;  r<  r   r   r`  r.   )rj   rS  r;   rC  rD  ra  r4  rn   rb  r   rd  s              r:   test_write_read_datetime_utcr  Z  s    ,-CRVVLI|y;CCDIy)	eAqk]Q%67[
B 88>>"PPPPcU|#EB3-1	F SF]'7*'D "6<<#5#56666		*,ErvvNI  i8bhhkk.E.Ed.KL	v||112222)J6.22::3DI66IaL		)':I)+%MM11#u=	FLL)4||!!&&*XXXX!&-r<   c                     U S-  n[         R                  " SS S /05      n[        X25        [        X!SS9nUS   R	                  5       R                  5       (       d   eg )Nz!test_null_values_no_geometry.gpkgr   Fr   )r   r   r   r   r   allr   s        r:   test_read_null_valuesr    s\    ==H ||UT4L12HH'	U	KB e9>>!!!!r<   c                    USSS.n[        U 40 UD6n[        UR                  [        R                  " SS5      5        [        U 4SS0UD6n[        UR                  [        R                  " SS5      5        [        U 4SS0UD6n[        R
                  " SS/SS	9nU[        U R                     -  n[        UR                  U5        g )
Nr   )r;   skip_featuresr   r   r   FTr   fidr5  )r   r/   rm  r   
RangeIndexIndexr!   r   )r   r;   r   rn   fids_expecteds        r:   test_read_fid_as_indexr    s    $q!LF 
3	>v	>Brxxq!!45	3	R%	R6	RBrxxq!!45	#

 
B
 HHaV%0MY:AABBMrxx/r<   c                     [        U / SSUS9nUc   e[        U5      S:X  d   e[        UR                  5      S:X  d   eg )NFTr   r|   r   )r   rf   rg   r   r;   rn   s      r:   test_read_fid_as_index_onlyr    sM    	
B >>r7c>>rzz?ar<   c                 Z   [        XSS9n[        U5      S:X  d   e[        XSS9n[        U5      S:X  d   eUR                  S   R                  S:X  d   e[        U USS9n[        U5      S	:X  d   e[        [	        UR                  R                  5       5      R                  / S
Q5      5      S:X  d   e[        U USS9n[        U5      S:X  d   eUR                  R                  5       S:  d   eUR                  R                  5       S:  d   e[        XSS9n[        U5      S:X  d   eg )Nr   r;   wherer|   ziso_a3 = 'CAN'r_   r   CANziso_a3 IN ('CAN', 'USA', 'MEX')r   r  USAMEXz+POP_EST >= 10000000 AND POP_EST < 100000000K   逖  zISO_A3 = 'INVALID')
r   rf   r   r   setunique
differencer}   minmaxr   s      r:   test_read_wherer    s3   	3PR	SBr7c>> 
#@P
B r7a<<771:%%%	#/
B
 r7a<<s299##%&112GHIQNNN 
#;
B
 r7b==::>>x'''::>>i''' 
#@T
B r7a<<r<   c                    U(       aF  UR                   S:X  a6  U R                  R                  [        R                  R                  SS95        UR                   S:X  a7  [        S:  a-  [        R                  " [        SS9   [        XSS9  S S S 5        g [        R                  " [        S	S9   [        XSS9  S S S 5        g ! , (       d  f       g = f! , (       d  f       g = f)
Nr   zGDAL doesn't error for GPGKrp   r\  zno such columnrs   invalidr  zInvalid SQL)r   rA   r  rC   r  r  r   rx   r   r   r   )r9   r   r;   s      r:   test_read_where_invalidr    s    0777B 1 19V 1 WX"))W49IZ9W]]>1AB+	 CB
 ]]:];+	 <; CB
 <;s   C.C
C
C!c                 @    [        U SS/US9n[        U5      S:X  d   eg )Nz "iso_a3" = 'CAN' r   )r  rg   r;   r   r   r  s      r:   test_read_where_ignored_fieldr    s.    
 
&	
B r7a<<r<   bbox))r_   )r_   r   r  c                 ~    [         R                  " [        SS9   [        XUS9  S S S 5        g ! , (       d  f       g = f)NzInvalid bboxrs   r;   r  r   )r   r  r;   s      r:   test_read_bbox_invalidr    s'    	z	82dS 
9	8	8   .
<zbbox,expected)r   r   h㈵>r     rh  PANCRI)i6   7   r  c                     U(       a.  [         S:  a$  U R                  S:X  a  [        R                  " SS9  [	        XUS9n[
        R                  " UR                  U5      (       d   eg )Nr   r  r   r   3GDAL bug: https://github.com/OSGeo/gdal/issues/8347rp   r  )r   r   rC   r  r   r   r   r   )r   r;   r  r   rn   s        r:   test_read_bboxr    sR     	y('..'9QR	3t	TB>>"))X....r<   c                     [        U USSS9n[        U5      S:X  d   e[        R                  " UR                  S/5      (       d   eg )NL2   Z   DSELECT * from naturalearth_lowres where iso_a3 not in ('USA', 'RUS'))r;   r  rP   r_   r  r   rf   r   r   r   r   s      r:   test_read_bbox_sqlr     sG    	#!R	
B r7a<<>>"))eW----r<   c                     [        U USSS9n[        U5      S:X  d   e[        R                  " UR                  S/5      (       d   eg )Nr  iso_a3 not in ('USA', 'RUS'))r;   r  r  r_   r  r  r   s      r:   test_read_bbox_wherer  +  sG    	#!,	
B r7a<<>>"))eW----r<   maskr-   )r   coordinatesz({"type": "Point", "coordinates": [0, 0]}r  c                 ~    [         R                  " [        SS9   [        XUS9  S S S 5        g ! , (       d  f       g = f)Nz+'mask' parameter must be a Shapely geometryrs   r;   r  r   )r   r;   r  s      r:   test_read_mask_invalidr  6  s+     
z)V	W*dK 
X	W	Wr  c           
          [         R                  " [        SS9   [        U US[        R
                  " SS5      S9  S S S 5        g ! , (       d  f       g = f)Nz!cannot set both 'bbox' and 'mask'rs   r  r  r  )r;   r  r  )rC   rx   r   r   shapelyr-   r   r;   s     r:   test_read_bbox_mask_invalidr  C  s=    	z)L	M"tR(		
 
N	M	Ms   "A
Azmask,expectedr  r  r  r  r  rh  g@*3`h@gؒD|I@g @gutI@g@NRd_@gmPBRI@g`}<@ghWI@g ΃
@g.WlI@)DEUBELNLDg5   )r  r  IRLc                    U(       a.  [         S:  a$  U R                  S:X  a  [        R                  " SS9  [	        XUS9n[        U5      [        U5      :X  d   e[        R                  " UR                  U5      (       d   eg )Nr  r   r  rp   r  )	r   r   rC   r  r   rf   r   r   r   )r   r;   r  r   rn   s        r:   test_read_maskr  M  si    B 	y('..'9QR	3t	TBr7c(m###>>"))X....r<   c           
          [        U U[        R                  " SSSS5      SS9n[        U5      S:X  d   e[        R
                  " UR                  S/5      (       d   eg )	Nr  r  r  r  r  )r;   r  rP   r_   r  r   r  boxrf   r   r   r   r   s      r:   test_read_mask_sqlr  z  sV    	#[[r4,R	
B r7a<<>>"))eW----r<   c           
          [        U U[        R                  " SSSS5      SS9n[        U5      S:X  d   e[        R
                  " UR                  S/5      (       d   eg )	Nr  r  r  r  r  )r;   r  r  r_   r  r  r   s      r:   test_read_mask_wherer    sV    	#[[r4,,	
B r7a<<>>"))eW----r<   fids)r_   r   rh  r  c                     [        XSUS9n[        U5      S:X  d   e[        R                  " XR                  R
                  5      (       d   eg )NT)r  r   r;   r   )r   rf   r   r   rm  values)r   r  r;   rn   s       r:   test_read_fidsr    sD     
#TY
B r7a<<>>$0000r<   c                     Sn[        U5      n[        R                  " [        SU S3S9   [	        XSS9nS S S 5        g ! , (       d  f       g = f)Ni  zerror applying filter for z fidsrs   Tr  r;   )rangerC   rx   r   r   )r   nb_fidsr  rS   s       r:   "test_read_fids_arrow_max_exceptionr    sD     G>D	z+EgYe)T	U.TJ 
V	U	Us	   ?
Ar  z#GDAL >= 3.8.0 does not need to warnc                     U R                   S;  a  [        R                  " [        SS9nO[        R
                  " 5       nU   [        U S/SS9n[        U5      S:X  d   e S S S 5        g ! , (       d  f       g = f)N)r   r   z=Using 'fids' and 'use_arrow=True' with GDAL < 3.8 can be slowrs      Tr  r_   )r   rC   r   r   rH  rI  r   rf   )r   rO  rn   s      r:   %test_read_fids_arrow_warning_old_gdalr    se     #))1FF,,Q

 ((*	7rddS2w!|| 
s   A**
A8c                    U S-  n[         R                  " [        SSS5      [        SSS5      /SS9n[        X!5        [	        US/S9n[        X2R                  S S 5        [	        USS/S9n[        R                  " UR                  R                  [        R                  " UR                  S S R                  R                  5      5      (       d   eg )	Nr   r   r_   r{   r   )r  T)r   r  )r   r   r-   r   r   r.   r   r   r   r   r  r  r   )rj   r   r   rn   s       r:   test_read_fids_force_2dr    s    +%H 1a.%1a.1{H H'	s	+Bb--"34	4qc	:B>>
G,,X]]2A->-G-G-N-NO   r<   r     c           	      8   U R                   n[        U 5      R                  US  R                  SS9n[        XUS9n[	        U5      [	        U5      :X  d   eUS;   nUS:H  nUS:X  a"  U(       d  U/ SQ   R                  S5      U/ SQ'   [        UUUS	U(       + US
9  g )NTr+  r  r;   ri  rj  r  )r~   r   r   r   Fcheck_less_precisecheck_index_typecheck_dtype	normalizer   r   r   reset_indexrf   r   r.   )r   r;   r  rS  r   rn   is_jsonis_jsonss           r:   test_read_skip_featuresr    s    
%
,
,C23	mn		$	  
#I
B r7c(m### ..Gk!HI /1+/

&- 	*+ 
"Kr<   c                     [         R                  " [        SS9   [        U SUS9  S S S 5        g ! , (       d  f       g = f)Nz'skip_features' must be >= 0rs   r  r   r  s     r:    test_read_negative_skip_featuresr    s+    	z)G	H*"	R 
I	H	Hr   )r   rh  r  r   d   c           	         U R                   n[        U 5      R                  X3U-    R                  SS9n[        U UUUS9n[	        U5      [	        U5      :X  d   eUS;   nUS:H  n[	        U5      S:X  aL  U(       dE  US   R                  S5      US'   US	   R                  S5      US	'   US
   R                  S5      US
'   [        UUUSU(       + US9  g )NTr  )r  r   r;   ri  rj  r   r~   r  r   r   Fr  r  )	r   r;   r   r  rS  r   rn   r  r  s	            r:   test_read_max_featuresr    s    
 &
,
,C23	ml:	<	$	 
 
##!	
B r7c(m### ..Gk!H
8}) !) 5 < <X F#F+228<%h/66x@
"Kr<   c                     [         R                  " [        SS9   [        U SUS9  S S S 5        g ! , (       d  f       g = f)Nz'max_features' must be >= 0rs   r  )r   r;   r   r  s     r:   test_read_negative_max_featuresr    s+    	z)F	G*yQ 
H	G	Gr   c                 r   [         R                  " [        SS9   [        SU S9  S S S 5        [         R                  " [        SS9   [        SU S9  S S S 5        [         R                  " [        SS9   [        SU S9  S S S 5        g ! , (       d  f       Ng= f! , (       d  f       NL= f! , (       d  f       g = f)NzNo such file or directoryrs   znon-existent.shpru   z!does not exist in the file systemz/vsizip/non-existent.zipzzip:///non-existent.zip)rC   rx   r   r   ru   s    r:   test_read_non_existent_filer  #  s    	.I	J)Y? 
K 
.Q	R1YG 
S 
.Q	R0IF 
S	R 
K	J 
S	R 
S	Rs#   BB2B(
B
B%(
B6c                    Sn[        XSUS9n[        UR                  5      S:X  d   e[        U5      S:X  d   eSn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S:X  d   eUR                  S	   R                  S
:X  d   eSn[        XSUS9n[        UR                  5      S:X  d   e[        U5      S:X  d   eUR                  R                  5       / SQ:X  d   eSn[        XSUS9n[        UR                  5      S:X  d   e[        U5      S:X  d   eUR                  R                  5       / SQ:X  d   eSn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S:X  d   eUR                  R                  5       S:  d   eUR                  R                  5       S:  d   eSn[        XSUS9n[        U5      S	:X  d   eg )NGSELECT iso_a3 AS iso_a3_renamed, name, pop_est FROM naturalearth_lowresOGRSQLrP   rQ   r;   r   r|   6SELECT * FROM naturalearth_lowres WHERE iso_a3 = 'CAN'r_      r   r  zdSELECT *
               FROM naturalearth_lowres
              WHERE iso_a3 IN ('CAN', 'USA', 'MEX')r   r  zSELECT *
               FROM naturalearth_lowres
              WHERE iso_a3 IN ('CAN', 'USA', 'MEX')
              ORDER BY name)r  r  r  zpSELECT *
               FROM naturalearth_lowres
              WHERE POP_EST >= 10000000 AND POP_EST < 100000000r  r  r  z:SELECT * FROM naturalearth_lowres WHERE ISO_A3 = 'INVALID')	r   rf   rg   r   r   rh   r}   r  r  r   r;   rP   rn   s       r:   test_read_sqlr#  /  s    TC	#(i
B rzz?ar7c>> CC	#(i
B r7a<<rzz?a771:%%%7C 
#(i
B rzz?ar7a<<99!6666C 
#(i
B rzz?ar7a<<99!6666CC 
#(i
B r7b==rzz?a::>>x'''::>>i''' GC	#(i
B r7a<<r<   c                    U R                   S:X  a.  [        R                  " [        SS9   [	        U SUS9  S S S 5        O-[        R                  " [        SS9   [	        U SUS9  S S S 5        [        R                  " [
        SS9   [	        U SSUS	9  S S S 5        g ! , (       d  f       N== f! , (       d  f       NN= f! , (       d  f       g = f)
Nr   zIn ExecuteSQL().*rs   r  rP   r;   zSQL Expression Parsing Errorz/'sql' parameter cannot be combined with 'layer'whatever)rP   r   r;   )r   rC   rx   rJ  r   r   r   s     r:   test_read_sql_invalidr'  k  s    "))W4]]9,?@+i A@
 ]]9,JK+i L
 
K
 	'		

 
 A@
 LK

 
s#   BB,B=
B),
B:=
Cc           	          Sn[        U USSS/SUS9n[        UR                  5      S:X  d   e[        U5      S:X  d   eUR                  R	                  5       / SQ:X  d   eg )	Nr  r  iso_a3_renamedr   z'iso_a3_renamed IN ('CAN', 'USA', 'MEX'))rP   rQ   rg   r  r;   r   r  r   rf   rg   r)  rh   r"  s       r:   test_read_sql_columns_wherer+    sn    
SC	#!6*7
B rzz?ar7a<<##%)>>>>r<   c           
          Sn[        U USSS/SSUS9n[        UR                  5      S:X  d   e[        U5      S	:X  d   eUR                  R	                  5       S
S/:X  d   eg )Nr  r  r)  r   z iso_a3_renamed IN ('CRI', 'PAN')r  )rP   rQ   rg   r  r  r;   r   r   r  r  r*  r"  s       r:    test_read_sql_columns_where_bboxr-    st    
SC	#!6*0
B rzz?ar7a<<##%%777r<   c           	      >   Sn[        U USSSUS9n[        UR                  5      S:X  d   e[        U5      S:X  d   eUR                  R	                  5       S/:X  d   eSn[        U USSUS	9n[        U5      S:X  d   eSn[        U USSUS
9n[        U5      S:X  d   eg )NzSELECT *
               FROM naturalearth_lowres
              WHERE iso_a3 IN ('CAN', 'MEX', 'USA')
              ORDER BY namer_   r  )rP   r  r   rQ   r;   r!  r  z)SELECT * FROM naturalearth_lowres LIMIT 1r   )rP   r   rQ   r;   )rP   rQ   r  r;   r   )r   rf   rg   r   rh   r"  s       r:   test_read_sql_skip_maxr/    s    C 
#
B rzz?ar7a<<99%(((
5C	#
B r7a<<
5C	#
B r7a<<r<   r   c                    Sn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S:X  d   eUR                  S   R                  S:X  d   eUR                  S   R
                  R                  nSn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S	:X  d   eUR                  S   R
                  R                  U:  d   eg )
Nr   rO   r  r_   r!  r   r  zSELECT ST_Buffer(geometry, 5) AS geometry, name, pop_est, iso_a3
               FROM naturalearth_lowres
              WHERE ISO_A3 = 'CAN'r   r   rf   rg   r   r   r   arear   r;   rP   rn   area_canadas        r:   #test_read_sql_dialect_sqlite_nogpkgr5    s     CC	(i
B r7a<<rzz?a771:%%%''!*%%**K&C 
(i
B r7a<<rzz?a771:##k111r<   c                    Sn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S:X  d   eUR                  S   R                  S:X  d   eUR                  S   R
                  R                  nSn[        XSUS9n[        U5      S:X  d   e[        UR                  5      S	:X  d   eUR                  S   R
                  R                  U:  d   eg )
Nr   INDIRECT_SQLITEr  r_   r!  r   r  zSELECT ST_Buffer(geom, 5) AS geometry, name, pop_est, iso_a3
               FROM naturalearth_lowres
              WHERE ISO_A3 = 'CAN'r   r1  r3  s        r:   !test_read_sql_dialect_sqlite_gpkgr8    s     CC	2Cy
B r7a<<rzz?a771:%%%''!*%%**K&C 
2Cy
B r7a<<rzz?a771:##k111r<   c                    U S-  n[        USUS9 nUR                  S5        UR                  S5        SSS5        [        R                  " S/S/S	.5      nU S
-  n[	        XVXS9  [        X1S9 nUR                  5       nSSS5        [        XaS9 nUR                  5       n	SSS5        WW	:X  d   e[        US5       nUR                  5       n
SSS5        [        US5       nUR                  5       nSSS5        W
W:X  d   eg! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       No= f! , (       d  f       N[= f)zbTest if write_dataframe uses the default encoding correctly.

Arrow only supports utf-8 encoding.
rX   rY   rZ   r\   r]   Nrc   rb   )r`   ra   ztest_pyogrio.csvr^   rb)rd   re   r   r   r   read)rj   r[   rk   rl   rm   rn   csv_pyogrio_pathcsv_strcsv_pyogriocsv_pyogrio_str	csv_bytescsv_pyogrio_bytess               r:   test_write_csv_encodingrB    s*     *$H	hh	/3		.!		./ 
0 
!3 4ykJ	KB"44B8M 
h	*c((* 
+		2k%**, 
3o%%% 
h	HHJ	 
		%',,. 
&))))/ 
0	/ 
+	*	2	2 
		%	%s;   #D/DD'>D8#E	
D
D$'
D58
E	
Ez ext, fid_column, fid_param_value))r   r  N)r   FIDN).sqliteogc_fidN)r   
fid_customrF  )r   
FID_customrF  )rD  ogc_fid_customrH  c                 <   [         R                  " US/0[        R                  " SS5      /SS9n0 nUb  X6S'   U SU 3-  n[	        XW4SU0UD6  UR                  5       (       d   e[        US	US
9nUR                  5       nUR                  US0S9n	[        X5        g)a  Test to specify FIDs to save when writing to a file.

Saving custom FIDs is only supported for formats that actually store the FID, like
e.g. GPKG and SQLite. The fid_column name check is case-insensitive.

Typically, GDAL supports using a custom FID column for these file formats via a
`FID` layer creation option, which is also tested here. If `fid_param_value` is
specified (not None), an `fid` parameter is passed to `write_dataframe`, causing
GDAL to use the column name specified for the FID.
r   r   z	epsg:4326r   Nr  r[  r;   T)r   r;   r)  )
r   r   r  r-   r   existsr   r  renamer.   )
rj   rS  
fid_columnfid_param_valuer;   	input_gdfr   path
output_gdfexpected_gdfs
             r:   test_write_custom_fidsrR  -  s    . 	aSW]]1a%8$9{I F"'uSEl"DICyCFC;;===49MJ'')J ##Z,?#@Lj7r<   c           	         [        U5      nU SU 3-  nUS:X  a  [        XEUSS9  O
[        XEUS9  UR                  5       (       d   e[        U5      nUR                  R                  R                  5       n[        U   [        ;   a  [        U5      S/:X  d   eO[        U5      SS1:X  d   eUS;   nUS	:H  n	[        UUUSU(       + U	S
9  g )Nr[  rp  Fr;   spatial_indexru   MultiPolygonPolygonri  rj  r  )r   r   rJ  r   r   r  r   r   listr  r.   )
rj   r   rS  r;   rN  output_path
result_gdfgeometry_typesr  r  s
             r:   test_write_dataframer\  W  s     23ItC5\)K
f}iu	
 		)D,J((--446Ns|44N#'7777>"~y&AAAA ..Gk!H"Kr<   zignore:.*No SRS set on layer.*write_geodf.xlsxrp  c           	         [        USS9nU(       a  [        R                  " U5      nUSU 3-  nUS:X  a  UR                  S5      nUS:w  a	  [        U   OSn[        XgXXS9  UR                  5       (       d   e[        U5      n	[        U	[        R                  5      (       d   eUS	;  n
US
;   av  [        U	[        R                  5      (       a   e[        U[        R                  5      (       a  [        R                  " U5      n[        R                  R                  XSU
S9  g[        R                  " U[        R                  " S[        U5      5      SS9n[        U	USU
S9  g)zTest writing a (geo)dataframe without a geometry column.

FlatGeobuf (.fgb) doesn't seem to support this, and just writes an empty file.
F)r   r[  r   z.dbfr^  XLSX)r;   driver)r   rj  r^  )r   r   r^  )r
  r  N  r   )r   r   r   with_suffixr   r   rJ  r   r   r   testingassert_frame_equalr   repeatrf   r.   )r9   rj   r   r]  rS  r;   input_dfrY  ra  	result_dfr  input_none_geom_gdfs               r:   test_write_dataframe_no_geomrj  ~  sE    1GH??8,tC5\)K f}!--f5 !G^WS\FHYN{+Ii.... ??K
((i9999h00||H-H


%%%[ 	& 	

 !ooryys8}=4
 	""#		
r<   c                     [        U5      nUR                  S5      nU S-  n[        X4US9  [        U5      n[        UR                  [
        R                  5      (       d   e[        XSR                  SS95        g )Nr   test.shpru   Tr  )	r   	set_indexr   r   rm  r   r  r.   r  )rj   r   r;   rN  rY  rZ  s         r:   test_write_dataframe_indexrn    sp     23I##H-IZ'KIi@,Jj&&6666j*?*?T*?*JKr<   rj  zcolumns, dtypecol_int	col_float
col_objectc                    [         R                  " / X#SS9nU SU 3-  n[        XVUS9  UR                  5       (       d   e[	        XdS9n[
        (       a  SOSnU(       a   U[        L a  US   R                  S5      US'   [        XuUS	9  g
)zTest writing dataframe with no rows.

With use_arrow, object type columns with no rows are converted to null type columns
by pyarrow, but null columns are not supported by GDAL. Added to test fix for #513.
rb  )r   rg   r   r   r[  ru   TFrq  r   r
  N)	r   r   r   rJ  r   r   r  r   r.   )	rj   rS  rg   r   r;   r   r   rn   r
  s	            r:   test_write_empty_dataframert    s    " GdSHD,&HH)<??		6B
  ,|t Uf_!),!7!>!>u!Eb=MNr<   c                    [         R                  " SS/0[        S/5      SS9nU S-  n[        R                  " 5          [        R
                  " S[        5        [        (       d  [        R                  " SS	S
9  [        X5        S S S 5        UR                  5       (       d   e[        U5      n[        X15        g ! , (       d  f       N<= f)Nry  r   zPOINT EMPTYrb  r   r   errorignorez'crs' was not provided.)message)r   r   r&   warningscatch_warningssimplefilterr   r   filterwarningsr   rJ  r   r.   )rj   r   r   rn   s       r:   test_write_empty_geometryr}    s    aSzHm_4MSWXH+%H 
	 	 	"g{3z##H6OP+	 
#
 ?? 
	!Bb+ 
#	"s   AB;;
C	c                    [         R                  " SS/0[        SS5      /SS9nU S-  n[        X#US9  UR	                  5       (       d   e[        X1S9n[        (       d4  [        (       ad  [        R                  R                  R                  (       a;  U(       a4  UR                  R                  S:X  d   eUS   R                  S5      US'   O UR                  R                  [        :X  d   e[!        XB5        g)	zTest pandas object columns with all None values.

With use_arrow, such columns are converted to null type columns by pyarrow, but null
columns are not supported by GDAL. Added to test fix for #513.

object_colNr   rb  r   r   ru   r   )r   r   r-   r   rJ  r   r   r   r   optionsfutureinfer_stringr  r   r   r  r.   )rj   r;   r   r   rZ  s        r:   test_write_None_string_columnr    s     //<$0E!QK=d
SC+%HCY7??>J"***;*;*H*H
$$**e333-44U;L$$**f444j.r<   z	.geojsonsc                     [         R                  " / SS9nU SU 3-  n[        X4US9  UR                  5       (       d   e[        R
                  " [        SS9   [        XBS9nS S S 5        g ! , (       d  f       g = f)Nrb  r   r[  ru   z9.* not recognized as( being in)? a supported file format.rs   )r   r   r   rJ  rC   rx   rJ  r   )rj   rS  r;   r   r   rS   s         r:   +test_write_read_empty_dataframe_unsupportedr    so     5HD,&HH)<??	T
 89
 
 
s   
A++
A9c                 4   [        U5      nU S-  n[        UUSSUS9  UR                  5       (       d   e[        R                  " [        U5      SS//5      (       d   e[        UUSSUS9  [        R                  " [        U5      SS/SS//5      (       d   eg )Nr   firstT)r   promote_to_multir;   rV  second)r   r   rJ  r   r   r   )rj   r   r;   rN  r   s        r:   )test_write_dataframe_gpkg_multiple_layersr  #  s    23I+%H ??>>+h/7N2K1LMMMM >>H
>	"X~$>?   r<   c                    U(       aL  UR                  S5      (       a6  U R                  R                  [        R                  R                  SS95        [        U5      nUSU 3-  n[        XVUS9  UR                  5         [        [        U5      5      S:X  d   e[        XVUSS9  [        [        U5      5      S	:X  d   eg )
Nr   z.Bugs with append when writing Arrow to GeoJSONrp   r[  ru   r|   T)r;   r   ib  )

startswithrA   r  rC   r  r  r   r   rJ  rf   )r9   rj   r   rS  r;   rN  r   s          r:   test_write_dataframe_appendr  @  s     S^^J// 	KK%UV	
 23ID,&HI9=OO~h'(C///I9TJ~h'(C///r<   rU  c                 0   [        U5      nU S-  n[        UUUU(       a  SOSS9  UR                  5       SL d   eU S-  nUR                  5       UL d   eU S-  n[        UUUSU0S	9  UR                  5       SL d   eU S
-  nUR                  5       UL d   eg )Nz	test1.shpYESNO)r;   SPATIAL_INDEXTz	test1.qixz	test2.shprU  )r;   layer_optionsz	test2.qix)r   r   rJ  )	rj   r   rU  r;   rn   outfilename1index_filename1outfilename2index_filename2s	            r:   !test_write_dataframe_gdal_optionsr  V  s    
 
+	,Bk)L
,e$	  D(((,O!!#}444 k)L
&6	  D(((,O!!#}444r<   c                     [        U5      nU S-  n[        R                  " [        SS9   [	        X4USS9  S S S 5        g ! , (       d  f       g = f)Ntest.geojsonz#unrecognized option 'SPATIAL_INDEX'rs   TrT  r   rC   rx   r   r   )rj   r   r;   rn   outfilenames        r:   )test_write_dataframe_gdal_options_unknownr  u  sA    	+	,B ^+K	z)N	O9DQ 
P	O	O	   ?
Ac                     SS K nUR                  U 5      nUR                  5       nUR                  S5        UR	                  5       nU Vs/ s H  oUS   PM	     sn$ s  snf )Nr   z2SELECT name FROM sqlite_master WHERE type='table';)sqlite3connectcursorexecutefetchall)rO  r  conr  r   ress         r:   _get_gpkg_table_namesr    sQ    
//$
CZZ\F
NNGH__F$%fsFf%%%s   Ac                     [        U5      nU S-  n[        X4US9  S[        U5      ;   d   eU S-  n[        X4USS9  S[        U5      ;  d   eU S-  n[        UUUSS	0S
9  S[        U5      ;  d   eg )Nztest_default.gpkgru   gpkg_ogr_contentsztest_no_contents.gpkgr  )r;   ADD_GPKG_OGR_CONTENTSztest_no_contents2.gpkgadd_gpkg_ogr_contentsF)r;   dataset_options)r   r   r  )rj   r   r;   rn   test_default_filenametest_no_contents_filenametest_no_contents_filename2s          r:   )test_write_dataframe_gdal_options_datasetr    s    	+	,B$'::BC"78M"NNNN (+B B
Yd &;<U&VVVV!),D!D
"0%8	 &;<V&WWWWr<   zFext, promote_to_multi, expected_geometry_types, expected_geometry_typerV  rW  Unknownr   c                    [        U5      nU SU 3-  n[        XxXcS9  UR                  5       (       d   e[        U5      n	[        U	R                  R
                  R                  5       5      n
X:X  d   e[        U5      S   U:X  d   eg )Ntest_promote)r;   r  geometry_type)r   r   rJ  sortedr   r   r  r	   )rj   r   rS  r  expected_geometry_typesexpected_geometry_typer;   rN  rY  rP  r[  s              r:   %test_write_dataframe_promote_to_multir    s    * 23I|C511K) ,JJ//44;;=>N444[!/26LLLLr<   zUext, promote_to_multi, geometry_type, expected_geometry_types, expected_geometry_typec           	         [        U5      nU SU 3-  n	US:X  a   US;   a  [        R                  " [        SS9n
O[        R
                  " 5       n
U
   [        UU	UUUS9  S S S 5        U	R                  5       (       d   e[        U	5      n[        UR                  R                  R                  5       5      nX:X  d   e[        U	5      S   U:X  d   eg ! , (       d  f       Ny= f)Ntest_promote_layer_geom_typer   )rW  r-   z+A geometry of type MULTIPOLYGON is insertedrs   r;   r  r  r  )r   rC   r   RuntimeWarningrH  rI  r   rJ  r  r   r   r  r	   )rj   r   rS  r  r  r  r  r;   rN  rY  ctxrP  r[  s                r:   5test_write_dataframe_promote_to_multi_layer_geom_typer    s    F 23I;C5AAK
g~-+??ll"O
 $$&	-'	
 
 ,JJ//44;;=>N444[!/26LLLL 
s   C
C z;ext, promote_to_multi, geometry_type, expected_raises_match))rp  FrV  Mismatched geometry type)rp  FrW  r  )rp  Nr-   r  )rp  NrW  r  )r   Nr-   zNCould not add feature to layer at index|Error while writing batch to OGR layerc           	          [        U5      nU SU 3-  n[        R                  " [        [        4US9   [        UUUUUS9  S S S 5        g ! , (       d  f       g = f)Nr[  rs   r  )r   rC   rx   r   r   r   )	rj   r   rS  r  r  expected_raises_matchr;   rN  rY  s	            r:   =test_write_dataframe_promote_to_multi_layer_geom_type_invalidr  	  sW    4 23ItC5\)K	n5=R	S-'	
 
T	S	Ss   A


Ac                     [        U5      nU S-  n[        R                  " [        SS9   [	        X4USS9  S S S 5        g ! , (       d  f       g = f)Nr  z,Geometry type is not supported: NotSupportedrs   NotSupportedr;   r  )r   rC   rx   r   r   )rj   r   r;   rn   r   s        r:   ,test_write_dataframe_layer_geom_type_invalidr  )	  sI     
+	,B.(H	K
 		X
 
 
r  c                    [         R                  " SS5      [         R                  " SS/5      [         R                  " SSSS5      [         R                  " [         R                  " SS5      [         R                  " SS5      /5      [         R
                  " [         R                  " SS/5      [         R                  " SS/5      /5      [         R                  " [         R                  " SSSS5      [         R                  " SSSS5      /5      /n[        R                  " S	/ S
Q0USS9nU SU 3-  nUS:X  a  [        XEUSS9  O
[        XEUS9  [        U5      S   S:X  d   e[        U5      n[        XdSS9  g )Nr   r   r   r_   r_   r_   r   )r   r   )r   r   r   r   )r   r   r   g      @g      @g      @r{   r   r[  rp  FrT  ru   r  r  T)check_geom_type)r  r-   
LineStringr  
MultiPointMultiLineStringrV  r   r   r   r	   r   r.   )rj   rS  r;   r   rn   r   r   s          r:    test_write_dataframe_truly_mixedr  6	  sJ    	aFF+,Aq!QGMM!Q/q!1DEF 0173E3EvvFV3WX	
 	gkk!Q15w{{1aA7NOP	H 
	./(
B D,&H
f}	O	: X/9<<<H%Ff$?r<   c                 R   [         R                  " S/ SQ0[        R                  " SS5      [        R                  " SS/5      [        R
                  " SSSS5      /SS9nS	n[        R                  " [        [        4US
9   [        X S-  US9  S S S 5        g ! , (       d  f       g = f)Nr   )r   r   r   r   r  r  r_   r{   r   zCould not add feature to layer at index 1: Attempt to write non-point \(LINESTRING\) geometry to point shapefile.|Error while writing batch to OGR layer: Attempt to write non-point \(LINESTRING\) geometry to point shapefile.rs   rl  ru   )r   r   r  r-   r  r  rC   rx   r   r   r   )rj   r;   rn   msgs       r:   (test_write_dataframe_truly_mixed_invalidr  V	  s    
 
	 MM!Q/0KK1a#

 
B	G  
n5S	Az1YG 
B	A	As   B
B&geomsr_   r   c                     U SU 3-  n[         R                  " SSS/0USS9n[        XTUS9  [        U5      n[	        Xe5        g )Nr[  r   r   r   r{   r   ru   )r   r   r   r   r.   )rj   r  rS  r;   r   rn   r   s          r:   .test_write_dataframe_infer_geometry_with_nullsr  q	  sK     D,&H	%#s,u+	NBBI6H%Ff)r<   z=ignore: You will likely lose important projection informationc                    [        U5      nUR                  UR                  S:H     R                  SS9R	                  S5      nU S-  n[        XEUS9  UR                  5       (       d   e[        U5      nUR                  R                  5       nUS   S:X  d   eUS	   S
:X  d   eUS   S:X  d   eUR                  R                  UR                  5      (       d   eg )NBelgiumTr  z,+proj=aea +lat_1=49.5 +lat_2=51.5 +lon_0=4.3rl  ru   lat_1g     H@lat_2g     I@lon_0g333333@)
r   r  r   r  to_crsr   rJ  r   to_dictequals)rj   r   r;   rn   r   r   r   s          r:   test_custom_crs_ior  	  s     
3	4B 	rww)#$	$		>	? 
 *$HH)<??		!B
&&..
Cw<4w<4w<366==&&&&r<   )	.gpkg.zipz.shp.zipz.shzc                    US:X  a!  [         (       d  [        R                  " S5        [        U5      nU SU 3-  n[	        XEUS9  UR                  5       (       d   e[        U5      nUR                  R                  R                  5       n[        U   [        ;   a  [        U5      S/:X  d   eO[        U5      SS1:X  d   e[        XdSS9  g	)
zBRun a basic read and write test on some extra (zipped) extensions.r  z&.gpkg.zip support requires GDAL >= 3.7r[  ru   rV  rW  Frs  N)r   rC   rD   r   r   rJ  r   r   r  r   r   rX  r  r.   )rj   r   rS  r;   rN  rY  rZ  r[  s           r:   test_write_read_zipped_extr  	  s     k**<=23ItC5\)KIi@,J((--446Ns|44N#'7777>"~y&AAAAjeLr<   c                    SSS[         R                  " 5       S [        R                  /nU Vs/ s H  n[        R
                  " SS5      PM     nn[        R                  " X1S.SS9nU S-  n[        XE5        [        U5      n[        U5      [        U5      :X  d   e[        R                  " U Vs/ s H%  owS [        R                  4;  a  [        U5      OS PM'     snS	S
9n[        US	   U5        g s  snf s  snf )Nr[  r   r_   r   r   mixed
epsg:31370rZ  test_write_mixed_column.gpkgr  r5  )r   nowr   r   r  r-   r   r   r   r   rf   r   r9  r   r0   )	rj   mixed_valuesrS   r  test_gdfrY  rP  valuer   s	            r:   #test_write_read_mixed_column_valuesr  	  s    CHLLND"&&AL*67,QW]]1a ,E72H ;;KH*,Jx=C
O+++ yyJVW,T266N2U	<,WH 
7+X6 8 	Xs   !C31,C8c                 `   SSS[         R                  " 5       S [        R                  /nU Vs/ s H  n[        R
                  " SS5      PM     nn[        R                  " X1S.SS9nU S-  n[        R                  " [        S	S
9   [        XESS9  S S S 5        g s  snf ! , (       d  f       g = f)Nr[  r   r_   r   r  r  rZ  r  z.*Conversion failed for columnrs   Tru   )r   r  r   r   r  r-   r   r   rC   rx   	TypeErrorr   )rj   r  rS   r  r  rY  s         r:   )test_write_read_mixed_column_values_arrowr  	  s     CHLLND"&&AL*67,QW]]1a ,E72H ;;K	y(H	I> 
J	I 8
 
J	Is   !BB
B-c                 h   U S-  n[         R                  " SS5      nX3U/SS [        R                  /SS [        R                  /S.n[        R
                  " USS9n[        XRUS9  [        U5      n[        U5      [        U5      :X  d   eUS	   S   S:X  d   e[        R                  " US	   S
   5      (       d   e[        R                  " US	   S   5      (       d   eUS   S   S:X  d   e[        R                  " US   S
   5      (       d   e[        R                  " US   S   5      (       d   eg )Nztest_write_nan.gpkgr   r   r[  )r   float64
object_strr  rZ  ru   r  r_   r   r  )r  r-   r   r   r   r   r   r   rf   r   r   )rj   r;   rY  geom	test_datar  rZ  s          r:   test_write_read_nullr  	  s0   22K==AD&rvv&tRVV,I
 yl;HHY?,Jx=C
O+++i #s***77:i(+,,,,77:i(+,,,,l#A&&00077:l+A.////77:l+A.////r<   c                     U u  p#SUR                    3n[        X!S9n[        U5      S:X  d   e [        XTUS9  [        XAS9n[        U5      S:X  d   e [	        U5        g ! [	        U5        f = f)N/vsimem/ru   r|   )r   r   rf   r   r   )r   r;   rO  rS   mem_pathinputr   s          r:   test_write_read_vsimemr  	  sq    %GD$))%H45Eu:9=>6{c!!!8
8s   $A   A-zwkt,geom_typeszPoint Z (0 0 0)z
2.5D PointzPoint ZzLineString Z (0 0 0, 1 1 0)z2.5D LineStringLineString Zz(Polygon Z ((0 0 0, 0 1 0, 1 1 0, 0 0 0))z2.5D Polygon	Polygon ZzMultiPoint Z (0 0 0, 1 1 0)z2.5D MultiPointzMultiPoint Zz2MultiLineString Z ((0 0 0, 1 1 0), (2 2 2, 3 3 2))z2.5D MultiLineStringMultiLineString ZzOMultiPolygon Z (((0 0 0, 0 1 0, 1 1 0, 0 0 0)), ((1 1 1, 1 2 1, 2 2 1, 1 1 1)))z2.5D MultiPolygonMultiPolygon Zz&GeometryCollection Z (Point Z (0 0 0))z2.5D GeometryCollectionGeometryCollection Zc                     U S-  n[         R                  " [        U/5      SS9nU H#  n[        XTX6S9  [	        U5      n[        Xu5        M%     g )Nztest.fgbr{   r   r  )r   r   r&   r   r   r.   )rj   wkt
geom_typesr;   r   r   	geom_typern   s           r:   test_write_geometry_z_typesr  	  sJ    . *$H
//8SE?
DC	TH%!"*  r<   z4test_descr, exp_geometry_type, mixed_dimensions, wktz	1 Point Zz1 LineString Zz1 Polygon Zz1 MultiPoint Zz1 MultiLineString Zz1 MultiLinePolygon Zz1 GeometryCollection ZzPoint Z + PointzPoint (0 0)zPoint Z + NonezPoint Z + LineString ZzPoint Z + LineStringzLineString (0 0, 1 1)c                    US:X  a4  US;   a  [         R                  " SU SU 35        OUS:X  a  SnOUS:X  a  Sn0 nU/[        U5      -  US	'   [        [        U5      5       Vs/ s H  n[	        U5      PM     snUS
'   [
        R                  " U[        U5      SS9n	U SU 3-  n
US:X  a?  U	R                  U	R                  R                  5       U	R                  R                  -  )    n	U(       a>  [        U   [        ;   a-  [         R                  " [        SS9   [!        XUS9  S S S 5        g [!        XUS9  [#        U
5      nUS   U:X  d   e[%        U
5      nUS:X  a  SUl        [)        X5        g s  snf ! , (       d  f       g = f)Nr   )r  r  zext z doesn't support r  r  r  r  
test_descridxr{   r   r[  rp  z0Mixed 2D and 3D coordinates are not supported byrs   ru   r  rj  )rC   rD   rf   r  r   r   r   r&   r  r   r   is_emptyr   r   rx   r   r   r	   r   r   r.   )rj   rS  r  exp_geometry_typemixed_dimensionsr  r;   column_datar  r   r   r   rZ  s                r:    test_write_geometry_z_types_autor	  
  s   l f} CCKK$se#45F4GHI"55 ."22 +K!+s3x 7K.3CHo>os#c(o>K
//+;
OCD,&H
f} gg))+cll.C.CCDEGCL,GG]]E
 CY?	

 	;XD $5555)J
k$
c.5 ?
 

 	s   %E5E::
Fz!on_invalid, message, expected_wkt))warnzyInvalid WKB: geometry is returned as None. IllegalArgumentException: Points of LinearRing do not form a closed linestringN)raisez4Points of LinearRing do not form a closed linestringN)rw  NN)fixNzPOLYGON ((0 0, 0 1, 0 0))z.ignore:Non closed ring detected:RuntimeWarningc                    US:X  a!  [         (       d  [        R                  " S5        US:X  a.  [        R                  " [        R
                  R                  US9nOEUS:X  a  [        R                  " US9nO*US;   a  [        R                  " 5       nO[        SU 35      eSnU S	-  n[        US
5       nUR                  U5      n	S S S 5        U   [        UUUS9n
Uc  U
R                  R                  S   b   eO)U
R                  R                  S   R                   U:X  d   eS S S 5        g ! , (       d  f       Nn= f! , (       d  f       g = f)Nr  z.on_invalid=fix not available for Shapely < 2.1r  rs   r
  )r  rw  zunknown value for on_invalid: a>  {
        "type": "FeatureCollection",
        "features": [
            {
                "type": "Feature",
                "properties": {},
                "geometry": {
                    "type": "Polygon",
                    "coordinates": [ [ [0, 0], [0, 1] ] ]
                }
            }
        ]
    }r  rY   )r;   
on_invalidr   )r   rC   rD   rx   r  errorsGEOSExceptionr   rH  rI  r   rd   re   r   r   r   r  )rj   r;   r  rx  expected_wktrO  invalid_geojsonr   frS   rn   s              r:   test_read_invalid_poly_ringr  z
  s'     U==DEW-- < <GL	v	,,W-	(	(((*9*FGG	O .(H	h	GGO$ 
 
!

 ;;##A&...;;##A&**l::: 
 
	 
s   4D.AD?.
D<?
Ec                 P   U(       aX  [         R                  " S5        [         R                  " [        R                  R
                  5         [        U SS9  S S S 5        g [        U 5      nUR                  R                  R                  5       S/:X  d   eg ! , (       d  f       g = f)Nz5Shapely + GEOS 3.13 crashes in from_wkb for this caseTru   rV  )
rC   rD   rx   r  r  r  r   r   r   rh   )multisurface_filer;   rn   s      r:   test_read_multisurfacer  
  s{     	KL]]7>>778 ,= 98
 -. {{&&(^,<<<< 98s   B
B%c                 x   [        XS9n[        R                  " S/SS0/S.[        R                  " SS5      /SS9n[
        (       a"  U(       a  US	   R                  [        5      US	'   [        X#5        [        XS
S9n[        R                  " S/S/S.[        R                  " SS5      /SS9n[        X#5        g )Nru   Abottom_levelB)	top_levelintermediate_levelr   r{   r   r  r  )r;   FLATTEN_NESTED_ATTRIBUTES)r  intermediate_level_bottom_level)	r   r   r   r  r-   r   r   r  r.   )nested_geojson_filer;   rn   r   s       r:   test_read_dataset_kwargsr!  
  s    	+	AB$2C#8"9	
 --1%&H {y *22F)G)N)Nv)V%&b+	E
B 03u	
 --1%&H b+r<   c                 ~    [         R                  " [        SS9   [        XSS9  S S S 5        g ! , (       d  f       g = f)Nz$does not support open option INVALIDrs   r  )r;   INVALID)rC   r   r  r   r  s     r:    test_read_invalid_dataset_kwargsr$  
  s)    	n,R	S*O 
T	S	Sr  c           	         U S-  n[         R                  " / SQSS9[         R                  " / SQSS9[         R                  " / SQSS9[         R                  " / S	QS
S9[         R                  " / SQSS9S.n[        R                  " U[        R
                  " SS5      /S-  SS9n[        XBUS9  [        U5      nUR                  5       nUS   R                  S5      US'   US   R                  S5      US'   US   R                  S5      US'   US   R                  S5      US'   S UR                  S'   [        XV5        g )Nztest_nullable_dtypes.gpkgr  int64r  )r_   r   NInt64)g?Ng333333?Float32)TFNboolean)r  Nr  r  )col1col2col3col4col5r   r   r  r   ru   r+  r  r,  float32r-  r.  r   )r_   r.  )r   r9  r   r   r  r-   r   r   rv  r   r  r.   )rj   r;   rO  r  rN  rP  r   s          r:   test_write_nullable_dtypesr0  
  s)   11D		)73		,g6		*)<		-Y?		*(;I W]]1a01A5<I Iy9%J ~~H'..y9HV'..y9HV'..y9HV'..u5HV"HLLj3r<   metadata_type)dataset_metadatalayer_metadatametadatac                     SU0n[        U5      nU S-  n[        XV4SU0X$0D6  US:X  a  SOUn[        U5      U   U:X  d   eg )Nlevelr   r;   r4  r3  )r   r   r	   )rj   r   r1  r;   r4  rn   r   metadata_keys           r:   test_metadata_ior8    s_    
 'H	+	,B+%HBSIS-9RS'4
'B#LX|,888r<   r2  r3  r4  keyc                     [        U5      n[        R                  " [        SS9   [	        XPS-  4SU0X#0D6  S S S 5        g ! , (       d  f       g = f)Nzmust be a stringrs   r   r;   r  )rj   r   r1  r4  r;   rn   s         r:   test_invalid_metadatar;    sM     
+	,B	z);	<;&	
2;	
@M?X	
 
=	<	<s   A
Ac                 |    U S-  n[        [        U5      U4SU0USS00D6  US:X  a  SOUn[        U5      U   b   eg)zmetadata is silently ignoredr  r;   r9  r  r4  r3  N)r   r   r	   )rj   r   r1  r;   r   r7  s         r:   test_metadata_unsupportedr=  -  sg    
 .(H*+  5'*
+	 (5
'B#LX|,444r<   zArrowDtype requires pandas 1.5+c                 X   [         R                  " S5        U S-  n[        R                  " SSS/0[	        SS5      S /SS9n[        X!5        [        US	S
S 0S9n[        US   R                  [        R                  5      (       d   eUS   R                  S5      US'   [        X25        g )Npyarrowr   r   r   r   r_   r{   r   Ttypes_mapperc                 .    [         R                  " U 5      $ r7   )r   
ArrowDtype)pa_dtypes    r:   r~  2test_read_dataframe_arrow_dtypes.<locals>.<lambda>N  s    R]]8-Dr<   )r;   arrow_to_pandas_kwargsr  )rC   importorskipr   r   r-   r   r   r   r   r   rB  r   r.   )rj   r   rn   r   s       r:    test_read_dataframe_arrow_dtypesrG  ?  s     	"+%H		c
uQ{D&9{
B B!D 
F fUm))2==99995M((3F5Mf)r<   )r   r  r   z+Arrow bool value bug fixed in GDAL >= 3.8.3c                     U SU 3-  n0 nUS:X  a  SUS'   [         R                  " / SQ[        SS5      /S-  S.S	S
9n[        XB40 UD6  [	        USS9n[        XTUS:g  S9  g )Nr[  rp  FrU  TFTFTr   r   r  r   r{   rZ  Tru   r   )r  r   r   r-   r   r   r.   )rj   rS  r   r   rn   r   s         r:   test_arrow_bool_roundtriprL  V  sz     D,&HF
f}"'	5E!QK=STCTU
B
 B+F+H5FfcVmDr<   c                 ,   U SU 3-  n[         R                  " / SQ[        SS5      /S-  S.SS9n[        X25        US;   a8  [        R
                  " [        S	S
9   [        USS9  S S S 5        [        US/ S9  g [        USS9ng ! , (       d  f       N%= f)Nr[  rI  r   r   rJ  r{   rZ  >   rp  r   zLGDAL < 3.8.3 does not correctly read boolean data values using the Arrow APIrs   Tru   r  )r   r   r-   r   rC   rx   RuntimeErrorr   )rj   rS  r   rn   rS   s        r:   test_arrow_bool_exceptionrO  o  s     D,&H	5E!QK=STCTU
B
 B!
]]

 8t4
 	x4< 8t4
 
s   B
Bc           	      R   SnSnU S-  n[         R                  " X"/S[        SS5      /0SS9n[        XCUS9  [	        US	S9nUc   e[        5          [        R                  " [        SS9   [	        US	S9nS
S
S
5        S
S
S
5        g
! , (       d  f       N= f! , (       d  f       g
= f)z9Test if arrow can be enabled via an environment variable.CP1252   ÿr   r   r   r{   rZ  rZ   rV   N-non-UTF-8 encoding is not supported for Arrowrs   )	r   r   r-   r   r   rM   rC   rx   r   )rj   r[   text	test_pathrn   r   rS   s          r:   +test_arrow_enable_with_environment_variablerV    s     HD;&I	$
U1a[MB	TBBH5 I9F 
	]]M
 y8<A
 
	
 
 
	s$   B+B6B
B	B
B&z"ignore:File /vsimem:RuntimeWarningra  GeoJSONGPKGc                    [        U 5      n[        5       n[        X#USS9  [        UR	                  5       5      S:  d   e[        U5      n[        U5      [        U5      :X  d   eUS:H  n[        UUUSU(       + S9  [        SSS	9/ :X  d   eg )
Nr[  ra  r   r   rW  F)r	  r
  r  r  	pyogrio_*pattern)r   r   r   rf   	getbufferr.   r   )r   ra  rn   bufferactualr  s         r:   test_write_memoryra    s     
+	,BYFBvV<v!"Q&&&F#Fv;#b'!!!	!G
"K 
K8B>>>r<   c                     [        U 5      n[        5       n[        R                  " [        SS9   [        UR                  S5      US SS9  S S S 5        [        SSS9/ :X  d   eg ! , (       d  f       N= f)	Nz2driver must be provided to write to in-memory filers   r_   r[  rZ  r  r[  r\  )r   r   rC   rx   r   r   r  r   r   rn   r_  s      r:   !test_write_memory_driver_requiredrd    se    	+	,BYF	B
 	
F4vF	
 
K8B>>>
 
   A$$
A2zESRI ShapefileOpenFileGDBc                     [        U 5      n[        5       n[        R                  " [        SU 3S9   [        X#USS9  S S S 5        [        SSS9/ :X  d   eg ! , (       d  f       N= f)Nz/writing to in-memory file is not supported for rs   r[  rZ  r  r[  r\  )r   r   rC   rx   r   r   r   r   ra  rn   r_  s       r:   $test_write_memory_unsupported_driverri    sb    	+	,BYF	KF8T
 	6@
 
K8B>>>
 
s   A
A%c           	          [        U 5      n[        5       n[        R                  " [        SS9   [        UR                  S5      X1SSS9  S S S 5        [        SSS	9/ :X  d   eg ! , (       d  f       N= f)
Nz+append is not supported for in-memory filesrs   r_   r[  T)ra  r   r   r  r[  r\  r   r   rC   rx   NotImplementedErrorr   r  r   rh  s       r:   $test_write_memory_append_unsupportedrm    sf    	+	,BYF	#P
 	
FPTU
 
K8B>>>
 
re  c                     [        U 5      n[        S5      n[        R                  " [        SS9   [        UR                  S5      USSS9  S S S 5        [        SS	S
9/ :X  d   eg ! , (       d  f       N= f)Ns   0000z5writing to existing in-memory object is not supportedrs   r_   rW  r[  rZ  r  r[  r\  rk  rc  s      r:   &test_write_memory_existing_unsupportedro    sh    	+	,BWF	E
 	
F9FK	
 
K8B>>>
 
s   A%%
A3c                 n   [        U5      n[        R                  " [        SS9   [	        U S-  S5       n[        UR                  S5      U5        SSS5        SSS5        [        R                  " [        SS9   [        U S-  S5       nUR	                  SS5       n[        UR                  S5      U5        SSS5        SSS5        SSS5        [        S	S
S9/ :X  d   eg! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       NQ= f! , (       d  f       NZ= f! , (       d  f       Nc= f)zEVerify that writing to an open file handle is not currently supportedz3writing to an open file handle is not yet supportedrs   r  wbr_   Nztest.geojson.ziprY   r  r[  r\  )	r   rC   rx   rl  rd   r   r  r   r   )rj   r   rn   r  zs        r:   test_write_open_file_handlers    s     
+	,B 
#X
 (^+T2aBGGAJ* 3
 
#X
 X 22C8A,
A. - 9
 
K8B>>> 32
 
 -, 98
 
s^   C3C"C3:D&
DD9DD&"
C0	,C33
D
DD
D#	D&&
D4gpkggeojsonc           	      `   Uu  p4U SU 3-  n[         R                  " XD/S[        SS5      /0SS9n[        XeUS9  [        R
                  " [        5         [        U5        SSS5        [        XSS9nUR                  S   U:X  d   eXt   R                  S   U:X  d   eg! , (       d  f       ND= f)au  Verify that we write non-UTF data to the data source

IMPORTANT: this may not be valid for the data source and will likely render
them unusable in other tools, but should successfully roundtrip unless we
disable writing using other encodings.

NOTE: FlatGeobuff driver cannot handle non-UTF data in GDAL >= 3.9

NOTE: pyarrow cannot handle non-UTF-8 characters in this way
test.r   r   r{   rZ  rZ   N)
r   r   r-   r   rC   rx   UnicodeDecodeErrorr   rg   r  )rj   rS  encoded_textr[   rT  rY  rn   r`  s           r:   test_non_utf8_encoding_iorz    s     "NHuSE]*K	$
U1a[MB	TBBh7 
)	*{# 
+ K;F>>!$$$<q!T))) 
+	*s   B
B-c           	      p   Uu  p4U SU 3-  n[         R                  " XD/S[        SS5      /0SS9n[        XeUS9  [        R
                  " [        5         [        U5        S S S 5        [        R
                  " [        SS9   [        XSS	S
9  S S S 5        g ! , (       d  f       N;= f! , (       d  f       g = f)Nrw  r   r   r{   rZ  rZ   rS  rs   Tr^   )	r   r   r-   r   rC   rx   rx  r   r   )rj   rS  ry  r[   rT  rY  rn   s          r:   )test_non_utf8_encoding_io_arrow_exceptionr|  0  s     "NHuSE]*K	$
U1a[MB	TBBh7 
)	*{# 
+ 
I
 	{F
 
 
+	*
 
s   BB'
B$'
B5c           	      (   Uu  p4U S-  n[         R                  " XD/S[        SS5      /0SS9n[        XeUS9  [	        XRS9nUR
                  S   U:X  d   eXt   R                  S   U:X  d   eUR                  S5      R                  5         UR                  U5      R                  S	5      nU(       a-  [        R                  " [        S
S9   [	        USS9  S S S 5        O6[	        USS9n	U	R
                  S   U:X  d   eX   R                  S   U:X  d   e[	        XSUS9nUR
                  S   U:X  d   eXt   R                  S   U:X  d   e[	        XRUS9nUR
                  S   U:X  d   eXt   R                  S   U:X  d   eg ! , (       d  f       N{= f)Nrl  r   r   r{   rZ  rZ   ru   z.cpgz
ISO-8859-1zCThe file being read is not encoded in UTF-8; please use_arrow=Falsers   TFr^   )r;   ENCODING)r   r   r-   r   r   rg   r  rc  unlinkencodedecoderC   rx   r   )
rj   ry  r;   r[   rT  rY  rn   r`  miscodedbads
             r:   #test_non_utf8_encoding_io_shapefiler  C  s   !NHZ'K	$
U1a[MB	TBBh7
 K=F>>!$$$<q!T))) F#**, {{8$++L9H]]W
 ;$7	
 
 [E:{{1~)))}##A&(222 KiPF>>!$$$<q!T))) KxPF>>!$$$<q!T)))%
 
s   F
Fc                     [         R                  " [        SS9   [        U SSUS9  SSS5        g! , (       d  f       g= f)zZProviding both encoding parameter and ENCODING open option
(even if blank) is not allowed.z<cannot provide both encoding parameter and "ENCODING" optionrs   CP936r   )r[   r~  r;   Nr   r  s     r:   -test_encoding_read_option_collision_shapefiler  o  s9     
X
 	'B)	

 
 
s   0
>c           	          Uu  p#U S-  n[         R                  " X3/S[        SS5      /0SS9n[        R                  " [
        SS9   [        XTUSS	0S
9  SSS5        g! , (       d  f       g= f)zdProviding both encoding parameter and ENCODING layer creation option
(even if blank) is not allowed.rl  r   r   r{   rZ  zKcannot provide both encoding parameter and "ENCODING" layer creation optionrs   r~  r   )r[   r  N)r   r   r-   rC   rx   r   r   )rj   ry  r[   rT  rY  rn   s         r:   4test_encoding_write_layer_option_collision_shapefiler  {  sp     "NHZ'K	$
U1a[MB	TB	
 	hz2>N	

 
 
s   A
A,c           	      j   SnU S-  nSn[         R                  " XDS[        SS5      /0SS9n[        XSUS9  [	        US	U S
U S3US9nUR
                  S   U:X  d   eXd   R                  S   U:X  d   e[	        US	U S
U S3UUS9nUR
                  S   U:X  d   eXd   R                  S   U:X  d   eg )Nr  rl  u   中文r   r   r{   rZ  rZ   zselect * from test where "z" = ''r%  )rP   r[   r;   )r   r   r-   r   r   rg   r  )rj   r;   r[   rY  mandarinrn   r`  s          r:   $test_non_utf8_encoding_shapefile_sqlr    s    HZ'KH		Z%1+7[
B Bh7)(6(1EF
 >>!(((""1%111)(6(1E	F >>!(((""1%111r<   c                    [        SS5      [        SS5      [        SS5      /n[        R                  " USS9nU S	-  n[        X4S
SUS9  [	        XAS9n[
        R                  " UR                  R                  U5      (       d   eg )Nrh        (   r  <   r{   r   test.kml	tmp_layerKMLr   ra  r;   ru   	r-   r   r   r   r   r   r   r   r  )rj   r;   pointsr   rY  gdf_ins         r:   $test_write_kml_file_coordinate_orderr    sz     BmU2r]E"bM:F
//6{
;CZ'KEY K=F>>&//00&9999r<   z>LIBKML driver is not available and is needed to append to .kmlc           	         [        SS5      [        SS5      [        SS5      /n[        R                  " USS9nU S	-  n[        X4S
SUS9  [        SS5      [        SS5      [        SS5      /n[        R                  " USS9n[        UUS
SUSS9  [	        XASS9n[
        R                  " UR                  R                  X%-   5      (       d   eg)zAppend features to an existing KML file.

Appending is only supported by the LIBKML driver, and the driver isn't
included in the GDAL ubuntu-small images, so skip if not available.
rh  r  r  r  r  r  r{   r   r  r  r  r  r  r  rG  r]     T)r   ra  r;   r   )r;   r   Nr  )rj   r;   r  r   rY  points_append
gdf_appendgdf_in_appendeds           r:   test_write_kml_appendr    s     BmU2r]E"bM:F
//6{
;CZ'KEY 1a[%2,b">M-[IJ %[PTUO>>/22996;QRRRRr<   c           
         [        SS5      [        SS5      [        SS5      /n[        R                  " USS9nU S	-  n[        UUS
SSUS9  [	        XAS9n[
        R                  " UR                  R                  U5      (       d   e[        SS5      [        SS5      [        SS5      /n[        R                  " USS9n[        UUS
SSUSS9  [	        XAS9n[
        R                  " UR                  R                  X&-   5      (       d   eg )Nrh  r  r  r  r  r  r{   r   r  r  rW  T)r   ra  RFC7946r;   ru   F   P   r  r  n   x   )r   ra  r  r;   r   r  )	rj   r;   r  r   rY  r  r  r  r  s	            r:   &test_write_geojson_rfc7946_coordinatesr    s    BmU2r]E"bM:F
//6{
;C^+K K=F>>&//00&9999 2r]E"cNE#sODM-[IJ %[FO>>/22996;QRRRRr<   c           	          [         R                  " / SQ[        SS5      [        SS5      [        SS5      /S.SS9nU S-  n[        X#US	9  [	        X1S	9n[        XB5        g
)z=
Simple test verifying the Parquet driver works if available
r  r   r_   r   )r   r   r{   rZ  ztest.parquetru   NrK  )rj   r;   r   rY  r   s        r:   test_parquet_driverr    s^     //aU1a[%1+'NOC ^+KC	:K=Ff*r<   )rH  rv   rI   rK  ry  r   ior   zipfiler   numpyr   pyogrior   r   r   r	   r
   r   r   pyogrio._compatr   r   r   r   r   r   r   r   pyogrio.errorsr   r   r   r   pyogrio.geopandasr   r   r   pyogrio.rawr   r   pyogrio.tests.conftestr   r   r    r!   r"   r#   r$   r%   rC   r1   r   pandasr   geopandas.arrayr&   pandas.api.typesr'   r(   r)   r*   r+   r,   r  shapely.geometryr-   geopandas.testingr.   pandas.testingr/   r0   ImportErrorrF  fixturer8   r;   rE   contextmanagerrM   rT   r  parametrizero   skipifrw   upperry   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r0  r|  rB  rR  re  rz  r  r  r$  r   fromisoformatr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rW  GeometryCollectionr  r  r  r  r&  r  r  r  r  r  r  r  r  r  r#  r'  r+  r-  r/  r5  r8  rB  rR  r\  rj  rn  r  r  rt  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r!  r$  r0  r8  r;  r=  rG  rL  rO  rV  ra  rd  ri  rm  ro  rs  rz  r|  r  r  r  r  r  r  r  r  )rS  s   0r:   <module>r     s     	 	       	 	 	 X W K K	 	 	 	(  &;   K   
T!56 > >  , , Wd*>?	55. 
!'')W45  9	92 
 $'7"dAUTU&W
"
" ')*#$  

/
")*	D LN"T  	-		-)-XX
 T2w$78$ 9$ u6p T2
M/J$KL. M.: %%(I  7 &7D %%S &Sl A %%+ &+ -t}=/%?6< @ >6<r  J6M JK-t}=/%?%%.. & @ > L..b  J6M JK-t}=/%?TU%%@G & V @ > L
@GF  J6M JK-t}=/%?A %%EA & @ > LEAP  J6M JK-t}=/%?A %%A. & @ > LA.H  J6M JK LL89LL45FF	
 ""#BC""#>?FF	
 -t}=/%?A %%W. & @ > L,W.t  J6M JK-t}=/%?%%1. & @ > L1.h
"0(
 "J" !:;T <T
 	!2&	UEN+	w'
/
/.. 
!Q02LL

 	tR	 5'*	S!S"	%u~6OO&(9:&(9:&(:;&(:;&(:;&(9:	 "	
 &&tR('++c1c2*FG "		
!4/54/&.. *bhhz.R!ST1 U1 K K 	!*O   $ 2s)4! 5!HS
 ,7"c3& 4 8&RR
	G9x
.?8 #L /HSwSH/#$  
2 2. G90E/F  2 22 Wd*BC	 * *F &
 %%8 &
8< )%%" & *"J <=u6G90D V0Dv0D VW%%2
 & X 7 >2
j %%
L &
L  S{<R ST	T

bhh


#
 	 %%O & UO0," %%/ &/. k :;%%: & <:  %% &8 )%%0 & *0( 5$-8%%5 & 95: %%R &R& %%X &X. L	'8	'8	3Y?	TNI6	B	TN+^<	U^Y7C
 %%M &
M. 6 
y>"2I>	UI	'BIN	T9~y&A9M	T9~y&A9M	T>NI+F	R	T7^Y$?K	T9~&6G	%^Y$?K	$	N#3Y?	$	N#3Y?	$(8.I	$.!17;	$	N#3Y?		NI#>	J	y>9"=yI	y>9"=yI	~	'BIN	y>9"=yI%0 %%"M &12"MJ A  %%
 &!"
, %%	Y &	Y  Nv<M NO%%@ & P@< %%H &H4  Nv<M NO	w}}Q"#	q!	d#	w}}Q1%&	t	 %%* & P* C %%'  &
',  AB%%M & CM,7( 	? 	? %%0 &0( %% & 	\956	&):N(KL	3nk5RS	&):N(KL@#%89	

 ^ "23	

 5&(>?	
* %%+ &+,+ ):	i):(;<	>53P2QR78		
 
>53P2QR!AB		
 #a		
 %"56		
 
It.?-OP	9e.?-FG$*,=>		
 #$&78		
M,/` %%(/ &a/ *d(/V '
 LM); N);X=" ,FP
 %%4 &42 G %%
9 &
9 +=?O*PQ	
A		
 %%
 & R
 +=?O*PQ%%5 & R5  $-NO* P*, y )V   )E * 
E( 	!*W   )5 * 
54 = =, @AIv#67? 8 B?2? $4m#DE? F? Iv#67? 8???0  34* 5*8  34G 5 G")*X	

(2: %%: &: %%LN"K  S	 &
SB %%!S &!SH %%(I  + &+Gf  		V !Kj !KP !K^ !KV !K` !K` 0l !WJ !Tb !Ov !Os   6AW +	AW
8AW
 	AW$
AW$
3	AW)
 AW)
&	AW.
3AW.
	AW3
&AW3
	AW8
AW8
&	AW=3AW=5	AXAX,	AX
9AX
-	AX
:AX
	AX
)AX
WAWWAW