
    rbi                    )   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
Zd dlmZmZmZmZmZmZmZ d dlmZmZmZmZmZmZmZmZ d dlmZmZm Z m!Z! d dl"m#Z#m$Z$m%Z% d d	l&m'Z'm(Z( d d
l)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2Z2	 d dl3Z4d dl5Z6d dl7m8Z8 d dl9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? d dl@Z@d dlAmBZB d dlCmDZD d dlEmFZFmGZG n# eH$ r Y nw xY w e2jI        d            e2jJ        dd e2jK        de0          g          d             ZL e2jJ        d          d             ZMe jN        d             ZOd ZPe2jQ        R                    dd e2jK        dde0          ddg          d              ZSe2jQ        T                     ejU                    V                                d!k    d"#          d$             ZWd% ZXd& ZYe2jQ        R                    d'd(g dd)fg dd fg          d*             ZZe2jQ        R                    d+d,d-gd.g/          d0             Z[d1 Z\d2 Z]d3 Z^d4 Z_e2jQ        T                    d5 e            vd6#          d7             Z`d8 Zad9 Zbe2jQ        R                    d:dg d;gg          d<             Zcd= Zde2jQ        R                    d:dg d>d?gg          d@             Zee2jQ        j.        e2jQ        T                    e, dA#          dB                         Zfe2jQ        j.        dC             Zge2jQ        h                    dD          e2jQ        j.        dE                         Zie2jQ        R                    dFddg          e2jQ        R                    dGddg          dH                         Zje2jQ        R                    dIdJ e*D                       e2jQ        R                    dFddg          e2jQ        R                    dGddg          e2jQ        j.        dK                                                 Zke2jQ        R                    dIdL e*D                       e2jQ        R                    dFddg          e2jQ        R                    dGddg          e2jQ        h                    dM          e2jQ        j.        dN                                                             Zle2jQ        R                    dIdO e*D                       e2jQ        R                    dFddg          e2jQ        R                    dGddg          e2jQ        h                    dD          e2jQ        j.        dP                                                             Zme2jQ        R                    dIdQ e*D                       e2jQ        R                    dFddg          e2jQ        R                    dGddg          e2jQ        h                    dD          e2jQ        j.        dR                                                             Zne2jQ        R                    dIdS e*D                       e2jQ        R                    dT e6jo        dU           e6jo        dV          ejp        f ejq        dU           ejq        dV          ejp        fg          e2jQ        R                    dFddg          e2jQ        R                    dGddg          e2jQ        h                    dD          e2jQ        j.        dW                                                                         Zre2jQ        R                    dIdX e*D                       e2jQ        R                    dFddg          e2jQ        R                    dGddg          e2jQ        j.        dY                                                 ZsdZ Ztd[ Zud\ Zvd] Zwd^ Zxd_ Zye2jQ        R                    d`g da          db             Zze2jQ        R                    dcddg fdedfdggfdhdigfg          dj             Z{dk Z|dl Z}e2jQ        R                    dmdnd d gdodpdqg          dr             Z~ds Ze2jQ        R                    dt e@jB        dudv          digf e@j        dwdxdydz          dfdggf e@j        d{d|gd}d~gddgddgddgd{d|gf          g df e@j         e@jB        dd           e@j        dwdxdydz          g          g dfg          d             Zd Zd Ze2jQ        R                    dg d ej        g dej                  g          d             Ze0d             Ze0e2jQ        T                    edk    d#          d                         Zd Ze2jQ        R                    ddzdg          d             Zd Ze2jQ        R                    dg d          e2jQ        R                    ddzdg          d                         Zd Zd Zd Zd Zd Zd Zd Ze/e2jQ        R                    d.d e*D             d.g/          d                         Ze/e2jQ        R                    d.dgd.g/          d                         Ze2jQ        R                    dd e2jK        dde.          ddg          d             Ze2jQ        R                    dg d          e2jQ        j.        d                         Ze2jQ        R                    dIe*          e2jQ        j.        d                         Ze2jQ        h                    d          e2jQ        R                    dddg          e2jQ        R                    dId e*dgz   D                       e2jQ        j.        d                                                 Ze2jQ        j.        d             Ze2jQ        R                    dId e*D                       e2jQ        R                    dg dfdgej        fdgej        fdgefg          e2jQ        j.        d                                     Zd Ze2jQ        j.        d             Ze2jQ        R                    dIddg          e2jQ        j.        d                         Ze2jQ        j.        d             Ze2jQ        R                    dIe*          e2jQ        j.        d                         Ze2jQ        R                    dddg          e2jQ        j.        d                         Ze2jQ        j.        d             ZdÄ Ze2jQ        j.        dĄ             Ze2jQ        R                    ddddgdfdddgdfddddgdfddddgdfdddgdfddddgdfg          e2jQ        j.        d˄                         Ze2jQ        R                    dddddgdfdddddgdfdddddgdfdddddgdfdddddgdfdddnddgdfddddgdfdddddgdfddddgdfddddgdfddddgdfdddndgdnfddddgdfdddddgdfdddddgdfdddddgdfdddddgdfdddddgdfg          e2jQ        j.        d΄                         Ze2jQ        R                    dg dТ          e2jQ        j.        dф                         Ze2jQ        j.        d҄             Ze2jQ        R                    dIdӄ e*D                       e2jQ        j.        dԄ                         Ze2jQ        j.        dՄ             Ze2jQ        R                    dIdք e*D                       e2jQ        R                    dd e@jB        ddئ          g e@jB        ddئ          dgd e@jB        ddd٦          gddgg          e2jQ        j.        dڄ                                     Ze2jQ        h                    dۦ          e2jQ        j.        e1d܄                                     Ze2jQ        R                    dIg dݢ          e2jQ        j.        dބ                         Zd߄ Ze.d             Ze2jQ        j.        d             Ze2jQ        j.        d             Ze2jQ        R                    ddddgfdddgfdddgfdddgfdddgfdddgfdddgfg          e2jQ        j.        d                         Ze2jQ        R                    dIe*          e2jQ        R                    dddddgfddddgfddddgfddddgfddddgfd dddgfddddgfdddddgfdddddgfdddddgfdddddgfg          e2jQ        j.        d                                     Ze2jQ        R                    d	g d
          e2jQ        h                    d          d                         Zd Zd Zd Ze2jQ        j.        d             Ze2jQ        R                    dg d          e2jQ        j.        d                         Ze2jQ        R                    dddg          e2jQ        R                    dddiddiddig          e2jQ        j.        d                                     Ze2jQ        R                    dddg          e2jQ        j.        d                         Ze2jQ        T                    e d#          d             Ze0e2jQ        T                    edk     d#          e2jQ        R                    dIe*          d                                     Ze0e2jQ        T                    edk    d#          e2jQ        R                    dIe*          d                                     Ze0d              Ze2jQ        h                    d!          e2jQ        R                    d"d#d$g          d%                         ZĐd& Ze2jQ        R                    d"d'd(g          d)             Ze2jQ        R                    d"d#d$g          d*             Zǐd+ ZȐd, Ze2jQ        R                    dId-d.g          d/             Ze0e2jQ        R                    dId-d.g          d0                         Zːd1 Z̐d2 Z͐d3 Zΐd4 Ze2jQ        j.        d5             Ze2jQ        j.        e2jQ        T                    d5 e            vd6#          d7                         Ze2jQ        j.        d8             Ze2jQ        j.        e2jQ        T                    e, dA#          d9                         ZdS (:      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                     | j         S N)param)requests    o/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/pyogrio/tests/test_geopandas_io.py	use_arrowr;   O   s     =    )autousec                     d| j         v r|                     d          nd}|r7t          s2| j                            d          rt          j        d           d S d S d S d S )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   s     '... 	,,,  	>#> L++,FGG>
 	<=====> > > > > >r<   c               #      K   t           j                            dd           } dt           j        d<   d V  | r| t           j        d<   d S t           j        d= d S )NPYOGRIO_USE_ARROW1)osenvironget)originals    r:   use_arrow_contextrM   k   s^      z~~1488H&)BJ"#	EEE ,*2
&'''J*+++r<   c                 *    t          | dd          }dS )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"    ;	 	 	AAAr<   zencoding, arrow)utf-8FrU   )cp1252F)NFc                    | dz  }t          |d|          5 }|                    d           |                    d           ddd           n# 1 swxY w Y   t          |||          }t          |          dk    sJ |j                                        d	d
gk    sJ |j                                        dgk    sJ |j                                        dgk    sJ dS )z` "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	/	/	/ 03		.!!!		.///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
8u	E	E	EBr77a<<<<:7F"333337>>	{****8??!3 4444444s   +AAAzUTF-8z(test requires non-UTF-8 default platformreasonc                 z   | dz  }t          |dt          j                              5 }|                    d           |                    d           ddd           n# 1 swxY w Y   |rGt	          j        t          d          5  t          ||	          }ddd           dS # 1 swxY w Y   dS t          ||	          }t          |          d
k    sJ |j	        
                                ddgk    sJ |j        
                                dgk    sJ |j        
                                dgk    sJ dS )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&C&C	D	D	D 0		.!!!		.///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  9],
 
 
 	? 	?  I>>>B		? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? H	:::2ww!||||z  ""w&77777w~~I;....x  %7$8888888s#   +A  A$'A$B''B+.B+c                     t          |           }t          r|j        dk    sJ t          |          dk    sJ |j                                        g dk    sJ d S )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      s|    	3	4	4B %v$$$$r77c>>>>: # # #      r<   c                 ^    t          | d         |          }t          |          dk    sJ d S )Nr_   ru   r|   r   rf   )naturalearth_lowres_vsir;   rn   s      r:   test_read_dataframe_vsir      s1    	/2i	H	H	HBr77c>>>>>>r<   zcolumns, fid_as_index, exp_len)NF   r   c                     t          | |||          }t          |          t          j        u sJ t	          |          |k    sJ d S )N)rg   fid_as_indexr;   )r   typepd	DataFramerf   )no_geometry_filerg   r   r;   exp_lenresults         r:    test_read_layer_without_geometryr      s\     !	  F <<2<''''v;;'!!!!!!r<   z!naturalearth_lowres, expected_ext).gpkgr   ).shpr   naturalearth_lowres)indirectc                 h    | j         |k    sJ t          |           }t          |          dk    sJ d S )Nr|   )suffixr   rf   )r   expected_extrn   s      r:    test_fixture_naturalearth_lowresr      s=     %5555	+	,	,Br77c>>>>>>r<   c                     t          | |d          }t          |t          j                  sJ t          |t          j                  rJ d S )NFr;   read_geometry)r   
isinstancer   r   gpGeoDataFramer   r;   rn   s      r:   test_read_no_geometryr      sU    	#y
 
 
B b",'''''"bo.......r<   c                     t          j        t          d          5  t          | g dd|          }d d d            d S # 1 swxY w Y   d S )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      s    	#
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   >AAc                 D   | dz  }t          j        t          ddd          t          ddd          gd          }t          ||           t	          |          }|j        d         j        j        sJ t	          |dd|          }|j        d         j        j        rJ d S )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 Hh'''		!	!B71:$$$$		
 
 
B wqz"((((((r<   c                     	 t          ddi           t          j        t          d          5  t	          | |           d d d            n# 1 swxY w Y   t          dd i           d S # t          dd i           w xY w)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     s    D!;T BCCC]N
 
 
 	M 	M 6)LLLL		M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	 !;T BCCCCC!;T BCCCCs.   ,A* A A* AA* AA* *A=LIBKMLzGLIBKML driver is not available and is needed to read simpledata elementc                 p    t          | |          }d|j        v sJ |d         j        d         dk    sJ dS )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   %  sO     Y
7
7
7C #+%%%%{ #u,,,,,,r<   c                    | dz  }t          j        t          dd          gd          }|r|j                            d          |_        t          ||d           t          j        t          dd          gd          }|r|j                            d          |_        t          ||d	d
           t          j        t          |          ddgd	dgg          sJ |dd}t          j
        t          d          5  t          |fi |}d d d            n# 1 swxY w Y   t          ||           t          |fdd	i|}t          ||           t          |fddi|}t          ||           d S )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  s   +%H %1++KHHHI < &-44U;;	    %1++KHHHI <%-44U;;	IxxEEEE>H7 3h5HI     %a88F 
k)D	E	E	E 0 0H////0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 b),,, 
	;	;	;F	;	;Bb),,, 
	4	4	4V	4	4Bb),,,,,s   DD"Dc                     t          j        t          d          5  t          | d|           d d d            d S # 1 swxY w Y   d S )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	Q	Q X X2'YWWWWX X X X X X X X X X X X X X X X X X   <A A rg   colc                 (   t          | ||          }|d|v r_d|j        v sJ t          |j        j                  sJ t
          r|j        j        j        dk    sJ d S |j        j        j        dk    sJ d S t          |j                  dk    sJ d S )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    	w)	L	L	LB %7**
"""""26<00000 	96<$(88888886<$(88888882:!######r<   c                 B   | j         dk    rt          st          j        d           t	          |           }| j         }t          | |          }d|j        v sJ |d         d         dk    sJ |d         d         dv sJ |d         d	                                         d	dgk    sJ |d         d                                         d
dgk    sJ |d         d
                                         g k    sJ |d         d         J |d         d         J d|j        v sJ |d         d
         dk    sJ |d         d
         dk    sJ |d         d	                                         ddgk    sJ |d         d                                         ddgk    sJ |d         d
                                         g k    sJ |d         d         J |d         d         J d|j        v sJ |d         d         dk    sJ |d         d         dk    sJ |d         d	                                         ddgk    sJ |d         d                                         g dk    sJ |d         d
                                         g k    sJ |d         d         J |d         d         dgk    sJ |dk    r	d}d}d	dg}nd}d}|rdt          j	        g}nd	d	g}d|j        v sJ |d         d         dk    sJ |d         d         |k    sJ |d          d         |k    sJ |d         d	         d	         d	k    sJ |d         d	k    r!|d         d	         d         |d         k    sJ n(t          j        |d         d	         d                   sJ |dk    r+|d         d         d
dgk    sJ |d         d
         g k    sJ nN|d         d                                         d
dgk    sJ |d         d
                                         g k    sJ t          j        |d         d                   sJ t          j        |d         d                   sJ |dk    rd}d}nd}d}d!|j        v sJ |d         d"         d!k    sJ |d         d"         |k    sJ |d          d"         |k    sJ |dk    rA|d!         d	         ddgk    sJ |d!         d         g dk    sJ |d!         d
         g k    sJ n~|sddgnddg}|d!         d	                                         |k    sJ |d!         d                                         g dk    sJ |d!         d
                                         g k    sJ t          j        |d!         d                   sJ |d!         d         dgk    sJ dS )#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  s0   %33<S3S	
 	
 	
 ,--D$+F3yIIIF ''''>!
****Q#IIIII*a ''))aV3333*a ''))aV3333*a ''))R////*a (((*a ((( FN****>!----Q=0000- #**,,c
::::- #**,,c
::::- #**,,2222- #+++- #+++ FN****>!----Q?2222- #**,,I0FFFFF- #**,,0J0J0JJJJJ- #**,,2222- #+++- #t++++ 
  ()4y$$ &  	2,/=((,-q6(
  6>1111>! 44444Q8++++"k1111&'*1-2222#A&!++*+A.q15QRS5TTTTTTwv23A6q9:::::*+A.1a&8888*+A."44444 *+A.5577Aq6AAAA*+A.55772====76./23333376./233333 
   # "fn4444>! 77777Q8++++"k1111-.q1i5FFFFF-.q15O5O5OOOOO-.q1R77777 ,5KYOO9d:K	-.q188::iGGGG-.q188::>X>X>XXXXX-.q188::b@@@@76121566666)*1-"555555r<   r   r   c                    |j         dk    rt          st          j        d           |rZ|rXt	          |          dk    rE|j         dk    r:d}| j                            t          j                            |                     t          |||          }|dnt	          |          d	z   }t	          |j
                  |k    sJ dS )
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3<S3S	
 	
 	
 	EE LLA#*j88
G 	 	 1 1 1 C CDDD9g  F
 !!CLL1,<Kv~+------r<   zParquet driver is not availablec                 P   |st          j        d           t          | |          }d|j        v sJ t	          j        |d                                         t	          j        g d                    sJ d|j        v sJ |d         j        t          k    sJ |d         d         
                                g dk    sJ |d         d         
                                g dk    sJ |d         d	         
                                g dk    sJ d
|j        v sJ |d
         j        t          k    sJ |d
         d         
                                dd	ddd	dgk    sJ |d
         d         
                                dd	ddd	dgk    sJ |d
         d	         
                                dd	ddd	dgk    sJ d|j        v sJ |d         j        t          k    sJ |d         d         dd	dk    sJ |d         d         dd	dk    sJ |d         d	         dd	dk    sJ dS )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    s     
R	
 	
 	

 ;yQQQF''''>&,5577)))9L9LMMMMM''''*#v----*a ''))YYY6666*a ''))YYY6666*a ''))YYY66666>)))),%////,"))++aa0@0@PQBRBR/SSSSS,"))++aa0@0@PQBRBR/SSSSS,"))++aa0@0@PQBRBR/SSSSS6>)))),%////,"AA&6&66666,"AA&6&66666,"AA&6&6666666r<   c                    ddt           j        dt          fd}t          ||          } |||           |rd}|                    dg          }n:d}| j                            t          j        	                    d	
                     |dz  }t          |||           t          ||          } ||||           dS )z=Test roundtripping a GeoJSON file containing many data types.Frn   r;   c                 4   d| j         v sJ t          | d         j                  sJ | d                                         dgk    sJ d| j         v sJ t	          | d         j                  sJ | d                                         dgk    sJ d| j         v sJ t          | d         j                  sJ | d                                         dgk    sJ d| j         v sJ t          | d         j                  sJ | d                                         dgk    sJ d	| j         v sJ |rbt          | d	         j                  sJ | d	                                         t          j	        d
          
                                gk    sJ nOt          | d	         j                  sJ | d	                                         t          j	        d
          gk    sJ d| j         v sJ t          | d         j                  sJ | d                                         t          j	        d          gk    sJ d| j         v sJ t          | d         j                  sJ | d         d                                         g dk    sJ d| j         v sJ t          | d         j                  sJ | d         d                                         g dk    sJ |s=d| j         v sJ t          | d         j                  sJ | d         d         g dk    sJ dS dS )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_resultzDtest_roundtrip_many_data_types_geojson_file.<locals>.validate_result9  s   
 BJ&&&&9 344444)}$$&&1#----bj((((bo344444+&&((SE1111BJ&&&&r)}233333)}$$&&8*4444RZ''''R
^122222*~%%''D61111RZ'''' 	L"2j>#788888j>))++\0J0J0O0O0Q0Q/RRRRRR 'r*~';<<<<<j>))++\0J0J/KKKKK ++++"2n#5#;<<<<<.!))++=R0S0S/TTTTT++++r.1788888.!!$++--::::++++r.1788888.!!$++--@@@@$ 	C#rz1111"2&6#7#=>>>>>&'*.B.B.BBBBB	C 	C CBr<   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_filer/  3  s    4C 4CBL 4CT 4C 4C 4C 4Cn :iPPPHOHi(((  

 $==*:);=<< %KL   	
 	
 	
 .(HHh)<<<< #8yAAAMOy8M     r<   z;ignore: Non-conformant content for record 1 in column datesc                    ddg}t          j        t          j        |          d          }|j                            d          }|j                            d          }t          r|j                            d          }d S d S )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;   r3  	naive_collocalised_colutc_cols         r:    test_write_datetime_mixed_offsetrA    s     '(ABE	".//g>>>IL,,-?@@M))%00G +*$$T**+ +r<   datetime_as_stringmixed_offsets_as_utcc           
      (   t          j                    }d}|s.t          s'|rt          rt	          j        t          d          }d}n?|r=t          s6t          s/t	          j        t          t          j        d                    }d}|5  t          | |||          }t          j        dgd	          }|r1t          |j        j                  sJ t%          |j        |           n|r1t          |j        j                  sJ t%          |j        |           nbt'          |j                  sJ |j        j        d
         t          j        ddddd
d
          k    sJ |j        j        d
         j        dk    sJ ddd           dS # 1 swxY w Y   dS )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;   rB  rC  z1670-01-01T09:00:00r  r4  r   i  r_   	   r7  N)
contextlibnullcontextr   r   rC   r   r   r   rx   	Exceptionreescaper   r   r8  r,   r  r   r0   r(   r   r$  unit)geojson_datetime_long_agor;   rC  rB  handleroverflow_occuredrn   exp_dates_strs           r:   test_read_datetime_long_agorQ    s    $&&G  l  I     ,W
 
 
  	  <     -)VWW
 
 
   
 < <%1!5	
 
 
 	#8"9OOO 	<"2?#899999????   <&r'<=====#BO]CCCC +2?;;;;;+A.",tQ1aQR2S2SSSSS+A.3t;;;;/< < < < < < < < < < < < < < < < < <s   C3FFFextc                     g | ]
}|d k    |S r    .0rR  s     r:   
<listcomp>rX         J J JC6MMMMMr<   c                 .   ddt           j        g}t          r*t          j        |d                              d          }nt          j        |          }t          j        |t          dd          gdz  dd	
          }| d| z  }t          |||           t          ||||          }	|r|dk    rt          dk     r|j        j                            d          }
|rT|
                    d          j                            dd          }
t           j        |
d<   t%          |	j        |
           dS |st%          |	j        |
           dS dS |rt'          |	j        j                  sJ |rNt          dk     rC|j                            d          j                            dd          }t           j        |d<   nt          j        |d          }t%          |	j        |           dS t-          |	j        j                  sJ t/          |	|           dS )zNTest writing/reading a column with naive datetimes (no time zone information).2020-01-01T09:00:00.123z2020-01-01T10:00:00ISO8601formatr7  r_   r   r3  r   r{   r   testru   rE  r   r      r   r6  r    Tr   r3  r4  N)r   r   r   r   r9  r=  r   r   r-   r   r   r   r3  r:  r;  r   r   replacer0   r,   r   r8  r(   r.   )rj   rR  rB  rC  r;   	dates_rawr3  rn   fpathr   	exp_dates	dates_strs               r:   test_write_read_datetime_no_tzrk    s<    +,A26JI *y;;;CCDIIy))	eAqkk]Q%677[
 
 
B |c||#EB3333-1	  F  .SG^^(8:(E(E
 HK++E22	 	9!((//3;;CEEI6IaLi88888% 	9i88888	9 	9 
 
.v|122222 	;)J66..2::3DDI6IaLL	)':::IFL)44444"6<#566666!&"-----r<   c                     g | ]
}|d k    |S rT  rU  rV  s     r:   rX  rX    rY  r<   z6ignore: Non-conformant content for record 1 in column c                    |rGt           dk     r<|dv r8| j                            t          j                            d                     ddt          j        g}t          r*t          j
        |d                              d	          }nt          j
        |          }t          j        |t          d
d
          gdz  dg dd          }t          |j        j        t          j                  sJ |d| z  }	t'          ||	|           t)          |	|||          }
|
j        j        j                            d          r)|
j                            |j        j                  |
_        |r|dv r~t           dk     rs|                                }||j                                                 j                            t4                    |_        t7          |
j        |j        d           d S |rt9          |
j        j                  sJ |rSt           dk     rH|j                            d          j                            dd          }t          j        |j        d<   nRt           dk     r1d |D             t          j        gz   }t          j        |d          }nt          j        |d          }t7          |
j        |d           d S t7          |
j        |j        d           d S )!zWrite 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:00r\  r]  r7  r_   r   r_  )r   r   r   r{   )indexr   ra  ru   rE  , pytz.FixedOffset(-300)].fgbr   rb  F)check_indexr   rd  re  r   r   r  r   c                 J    g | ] }t          j        |          |d d         !S )N)r   notna)rW  xs     r:   rX  z/test_write_read_datetime_tz.<locals>.<listcomp>G  s-    BBBAbhqkkB3B3BBBr<   r3  r4  N) r   rA   r  rC   r  r  r   r   r   r   r9  r=  r   r   r-   r   r3  r   DatetimeTZDtyper   r   r   endswithr   copyr|  r   r0   r,   rf  r   r8  )r9   rj   rR  rB  rC  r;   rg  r3  rn   rh  r   df_exprj  s                r:   test_write_read_datetime_tzr    s     
%
22s>W7W7W 	KS   	
 	
 	
 12MrvVI *y;;;CCDIIy)) 
eAqkk]Q%677ii
 
 
B
 bhnb&899999|c||#EB3333-1	  F |''(CDD ;|**28>:: GS---2BZ2O2Ofl002239@@EEFL&,EJJJJJJ	 Gv|122222 	;)J66..2::3DDI "IN1	))BBBBBbfXMI	)':::II	)':::IFL)GGGGGGFL"(FFFFFFr<   c                     g | ]
}|d k    |S rT  rU  rV  s     r:   rX  rX  P  rY  r<   c                 *   ddt           j        g}t          j        t          j        |          d          }|j                            d          }|                    t                    }|r]|j        	                    dd          }	|	j        	                    dd	          }	t          d
k     r|	j                            dd          }	nT|r<|j                            d          }	t          r|	j                            d          }	n|                    d           }	t!          j        |t%          dd          gdz  dd          }
| d| z  }t'          |
||           t)          ||||          }|r[t          dk     rO|dv r|j                            d          }t          r|j                            d          }|rNt+          |j        j                  sJ |                    t                    j        	                    dd          }t          j        |j        d                   sJ t3          |j                            d          |                    d                     dS |dv r^t          j        |j        d                   sJ t3          |j                            d          |                    d                     dS |rt+          |j        j                  sJ nD|r't7          |j        j        t          j                  sJ nt;          |j        j                  sJ t          j        |j        d                   sJ t3          |j                            d          |	                    d                     dS )zLTest with localized dates across a different summer/winter time zone offset.r1  r2  r3  r4  r5  rd  re  z.111000z.111ry  r   r{  r6  r7  c                 V    t          j        |           rt          j        |           nd S r7   )r   r|  r$  r}  s    r:   <lambda>zDtest_write_read_datetime_tz_localized_mixed_offset.<locals>.<lambda>l  s    !>bl1ooo$ r<   r_   r   r_  r{   r`  ra  ru   rE  rb  rp  r   Nr   rw  )r   r   r   r8  r9  r:  r;  r   r   rf  r   slicer<  r   r=  applyr   r   r-   r   r   r,   r3  r   r   r0   headr   r~  r+   )rj   rR  rB  rC  r;   rg  dates_naivedates_localdates_local_offsets_strri  rn   rh  r   	dates_utcs                 r:   2test_write_read_datetime_tz_localized_mixed_offsetr  P  s    +,ErvNI)BN955GDDDK.,,-?@@K)0055 
+/77SAA	M)))V<<	i''!++Ar22I	 
N--e44	 	3!,,T22I+11>>
 
	 
E!QKK=1+<==;
 
 
B |c||#EB3333-1	  F  %
22+++ $11%88I 7%L0066	! H&v|'9:::::%,,S115==c3GG	76<?+++++ 1 1! 4 4innQ6G6GHHHF%%%76<?+++++ 1 1! 4 46M6R6RST6U6UVVVF  3v|1222222	 3&,,b.@AAAAAAv|122222 76<?#####))!,,innQ.?.?@@@@@r<   c                     g | ]
}|d k    |S rT  rU  rV  s     r:   rX  rX    rY  r<   c                    t          j        d          t          j        d          t          j        g}t	          j        |t          dd          gdz  dd          }| d| z  }t          |||	           t          ||||
          }|r&t          dk     r|dv r|
                                }	t          j        |d          |	_        t          r$|	j        j                            d          |	_        |r8|	j                            d          j                            dd          |	_        t           j        |	j        d<   t+          ||	           dS |dv rX|
                                }	|	j                            d                              d          |	_        t+          ||	           dS |rst-          |j        j                  sJ |j                            d           }
t          dk     r|
j                            dd          }
t5          |j        |
           dS |ryt7          |j        j        t           j                  sJ t          j        |j        d          }t          r|j                            d          }t5          |j        |           dS t;          |j        j                  sJ t+          ||           dS )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   r_  r{   r`  ra  ru   rE  rb  rp  T)utcr7  r   rd  re  )r   r3  Nr  r  Oc                 n    t          j        |           r|                     d          nt          j        S )Nmilliseconds)timespec)r   r|  	isoformatr   r   r  s    r:   r  z;test_write_read_datetime_tz_mixed_offsets.<locals>.<lambda>  s(    bhqkkUakk>k:::rv r<   ry  r   r{  )r   r$  r   r   r   r   r-   r   r   r   r  r9  r3  r   r:  r=  r   r   rf  NAlocr.   r,   r   mapr  r0   r   r~  r+   )rj   rR  rB  rC  r;   r3  rn   rh  r   r  rj  ri  s               r:   )test_write_read_datetime_tz_mixed_offsetsr    s    	455
455
E 
eAqkk]Q%677[
 
 
B |c||#EB3333-1	  F  %
22+++ WWYYF>%T:::FL =%|66t<<! P%|22599=EEc3OO%'UFJz"%ff555F%%% WWYYF!<..x88??DDFL%ff555F .v|122222HLLUU
 
	 i''!++Ar22IFL)44444	 .&,,b.@AAAAAN28666	 	3!,,T22IFL)44444v|122222!&"-----r<   c                     g | ]
}|d k    |S rT  rU  rV  s     r:   rX  rX    rY  r<   rg  rr  rs  c                 V   t          j        |d          }t          j        |t	          dd          gdz  dd          }| d| z  }t          |||	           t          ||||
          }	t          r*t          j        |d          	                    d          }
nt          j        |          }
|
                                }t          j        |
d          |d<   |	j        j        j                            d          r'|	j                            |j        j                  |	d<   |rt           dk     r|dv r|r%t          j        ddt"          j        g          |d<   nI|j        t          j        d          z
  |d<   t          r"|j        j        	                    d          |d<   t+          |	|           dS |rEt           dk     r:|dv r6t          j        ddt"          j        g          |d<   t+          |	|           dS |rt-          |	j        j                  sJ |r0t           dk     r%t          j        ddt"          j        g          |d<   nt          j        ddt"          j        g          |d<   t           dk     r#|j        j                            d d!          |d<   nq|rIt3          |	j        j        t           j                  sJ t/          |	j        j        j                  d"v sJ n&t3          |	j        j        t           j                  sJ t+          |	|           dS )#z;Datetime objects with equal offsets are read as datetime64.r  r   r_   r   r_  r{   r`  ra  ru   rE  r\  r]  r7  r3  r4  ru  rn  rp  z 2020-01-01T04:00:00.123000-05:00z2020-01-01T05:00:00-05:00r   )hoursNrb  rv  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:00rs  rr  ry  r   r{  )z	UTC-05:00zpytz.FixedOffset(-300))r   r8  r   r   r-   r   r   r   r9  r=  r  r3  r   r   r  r   r   r   r   	Timedeltar:  r.   r,   r   r  r   r~  tz)rj   rg  rR  r;   rB  rC  r3  rn   rh  r   ri  exp_dfs               r:   #test_write_read_datetime_tz_objectsr    sa   4 Iis+++E	eAqkk]Q%677[
 
 
B |c||#EB3333-1	  F  .N9Y???GGMM		N9--	WWYYFi	888F7O |''(CDD B ,--fl.@AAw %
22s>W7W7W  	@ i6/F F7OO %lR\-B-B-BBF7O @"(,/"9"9$"?"?w!&&111 %
22s>O7O7O )/1LbfU
 
w 	"&&111 Bv|122222 	@)J66 i6/F F7OO !i02MrvV F7O  )++"(,"2"8"8B"?"?w	 B&,,b.@AAAAA6<%())-TTTTTT&,,b.@AAAAAff-----r<   c                     g | ]
}|d k    |S rT  rU  rV  s     r:   rX  rX  Z  rY  r<   c                    ddt           j        g}t          r*t          j        |d                              d          }nt          j        |          }t          j        |t          dd          gdz  dd	
          }|j	        j
        j        dv sJ | d| z  }t          |||           t          ||||          }	|r|dk    rt          dk     r|rUt          |	j	        j
                  sJ t          j        ddt           j        gd          }
t#          |	j	        |
           dS t#          |	j	        |j	        j                            d                     dS |rt          |	j	        j
                  sJ |rNt          dk     rC|j	                            d          j                            dd          }
t           j        |
d<   n<t          j        |d          }
t          dk     r|
j                            dd          }
t#          |	j	        |
           dS |	j	        j
        j        dv sJ t/          |	|           dS )z1Test writing/reading a column with UTC datetimes.z2020-01-01T09:00:00.123Zz2020-01-01T10:00:00Zr\  r]  r7  r_   r   r_  r{   r`  )zdatetime64[ms, UTC]zdatetime64[ns, UTC]ra  ru   rE  rw  rb  r[  z2020-01-01T10:00:00.000r3  r4  Nr   rd  re  r   ry  Zz+00)r   r   r   r   r9  r=  r   r   r-   r3  r   r   r   r   r   r,   r8  r0   r:  r;  r   r   rf  r.   )rj   rR  r;   rB  rC  rg  r3  rn   rh  r   rj  s              r:   test_write_read_datetime_utcr  Z  sp    ,-CRVLI *y;;;CCDIIy))	eAqkk]Q%677[
 
 
B 8>"PPPPP|c||#EB3333-1	  F  .SF]]'7*'D'D  	M"6<#566666	*,ErvN  I  i88888bhk.E.Ed.K.KLLLLL	 .v|122222 	>)J66..2::3DDI6IaLL	)':::I)++%M11#u==	FL)44444|!&*XXXXX!&"-----r<   c                     | dz  }t          j        dd d gi          }t          ||           t          ||d          }|d                                                                         sJ d S )Nz!test_null_values_no_geometry.gpkgr   Fr   )r   r   r   r   r   allr   s        r:   test_read_null_valuesr    sy    ==H |UT4L122HHh'''	IU	K	K	KB e9>>!!!!!!!r<   c                    |ddd}t          | fi |}t          |j        t          j        dd                     t          | fddi|}t          |j        t          j        dd                     t          | fddi|}t          j        ddgd	          }|t          | j                 z  }t          |j        |           d S )
Nr   )r;   skip_featuresr   r   r   FTr   fidr4  )r   r/   rt  r   
RangeIndexIndexr!   r   )r   r;   r   rn   fids_expecteds        r:   test_read_fid_as_indexr    s    $q!LLF 
3	>	>v	>	>Brxq!!4!4555	3	R	R%	R6	R	RBrxq!!4!4555	#
 

 
 
B
 HaV%000MY:ABBMrx/////r<   c                     t          | g dd|          }|J t          |          dk    sJ t          |j                  dk    sJ d S )NFTr   r|   r   )r   rf   rg   r   r;   rn   s      r:   test_read_fid_as_index_onlyr    sb    	
 
 
B >>>r77c>>>>rz??ar<   c                    t          | |d          }t          |          dk    sJ t          | |d          }t          |          dk    sJ |j        d         j        dk    sJ t          | |d          }t          |          d	k    sJ t          t	          |j                                                                      g d
                    dk    sJ t          | |d          }t          |          dk    sJ |j                                        dk    sJ |j        	                                dk     sJ t          | |d          }t          |          dk    sJ d S )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    s   	3yPR	S	S	SBr77c>>>> 
#y@P
 
 
B r77a<<<<71:%%%%	#/
 
 
B
 r77a<<<<s29##%%&&112G2G2GHHIIQNNNN 
#;
 
 
B
 r77b====:>>x'''':>>i'''' 
#y@T
 
 
B r77a<<<<<<r<   c                    |rC|j         dk    r8| j                            t          j                            d                     |j         dk    rSt          dk    rHt          j        t          d          5  t          ||d           d d d            d S # 1 swxY w Y   d S t          j        t          d	          5  t          ||d           d d d            d S # 1 swxY w Y   d S )
Nr   zGDAL doesn't error for GPGKrp   rb  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    Y077BB 1 19V 1 W WXXX")W449IZ9W9W]>1ABBB 	 	+y	   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 ]:];;; 	 	+y	   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s$   7BBB?CC#&C#c                 X    t          | ddg|          }t          |          dk    sJ d S )Nz "iso_a3" = 'CAN' r   )r  rg   r;   r   r   r  s      r:   test_read_where_ignored_fieldr    s?    
 
&	
 
 
B r77a<<<<<<r<   bbox))r_   )r_   r   r  c                     t          j        t          d          5  t          | ||           d d d            d S # 1 swxY w Y   d S )NzInvalid bboxrs   r;   r  r   )r   r  r;   s      r:   test_read_bbox_invalidr    s    	z	8	8	8 T T2idSSSST T T T T T T T T T T T T T T T T Tr   zbbox,expected)r   r   h㈵>r     ro  PANCRI)i6   7   r  c                     |r+t           dk     r | j        dk    rt          j        d           t	          | ||          }t          j        |j        |          sJ d S )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    so     	Sy(('.'99QRRRR	3yt	T	T	TB>")X.......r<   c                     t          | |dd          }t          |          dk    sJ t          j        |j        dg          sJ d S )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     sY    	#!R	
 
 
B r77a<<<<>")eW-------r<   c                     t          | |dd          }t          |          dk    sJ t          j        |j        dg          sJ d S )Nr  iso_a3 not in ('USA', 'RUS'))r;   r  r  r_   r  r  r   s      r:   test_read_bbox_wherer  +  sY    	#!,	
 
 
B r77a<<<<>")eW-------r<   maskr-   )r   coordinatesz({"type": "Point", "coordinates": [0, 0]}r  c                     t          j        t          d          5  t          | ||           d d d            d S # 1 swxY w Y   d S )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	W	W L L*idKKKKL L L L L L L L L L L L L L L L L Lr   c           
          t          j        t          d          5  t          | |dt	          j        dd                     d d d            d S # 1 swxY w Y   d S )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	M	M 
 
"tR((		
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   'AAAzmask,expectedr  r  r  r  r  ro  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                     |r+t           dk     r | j        dk    rt          j        d           t	          | ||          }t          |          t          |          k    sJ t          j        |j        |          sJ d S )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  s    B 	Sy(('.'99QRRRR	3yt	T	T	TBr77c(mm####>")X.......r<   c           
          t          | |t          j        dddd          d          }t          |          dk    sJ t	          j        |j        dg          sJ d S )	Nr  r  r  r  r  )r;   r  rP   r_   r  r   r  boxrf   r   r   r   r   s      r:   test_read_mask_sqlr  z  si    	#[r4,,R	
 
 
B r77a<<<<>")eW-------r<   c           
          t          | |t          j        dddd          d          }t          |          dk    sJ t	          j        |j        dg          sJ d S )	Nr  r  r  r  r  )r;   r  r  r_   r  r  r   s      r:   test_read_mask_wherer    si    	#[r4,,,	
 
 
B r77a<<<<>")eW-------r<   fids)r_   r   ro  r  c                     t          | |d|          }t          |          dk    sJ t          j        ||j        j                  sJ d S )NT)r  r   r;   r   )r   rf   r   r   rt  values)r   r  r;   rn   s       r:   test_read_fidsr    sX     
#$TY
 
 
B r77a<<<<>$0000000r<   c                     d}t          |          }t          j        t          d| d          5  t	          | |d          }d d d            d S # 1 swxY w Y   d S )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    s     G>>D	z)Tg)T)T)T	U	U	U K K.TTJJJK K K K K K K K K K K K K K K K K Ks   AAAr  z#GDAL >= 3.8.0 does not need to warnc                     | j         dvrt          j        t          d          }nt	          j                    }|5  t          | dgd          }t          |          dk    sJ 	 d d d            d S # 1 swxY w Y   d S )N)r   r   z=Using 'fids' and 'use_arrow=True' with GDAL < 3.8 can be slowrs      Tr  r_   )r   rC   r   r   rG  rH  r   rf   )r   rN  rn   s      r:   %test_read_fids_arrow_warning_old_gdalr
    s     #)1FFF,Q
 
 

 (**	  7rddSSS2ww!|||||                 s   )A22A69A6c                    | dz  }t          j        t          ddd          t          ddd          gd          }t          ||           t	          |dg          }t          ||j        d d                    t	          |ddg          }t          j        |j	        j
        t          j        |j        d d         j	        j
                            sJ d S )	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 Hh'''	s	+	+	+Bb(-"3444	4qc	:	:	:B>
G,X]2A2->-G-NOO      r<   r     c                 p   | j         }t          |           j        |d                              d          }t          | ||          }t	          |          t	          |          k    sJ |dv }|dk    }|dk    r$|s"|g d                             d          |g d<   t          |||d	| |
           d S )NTr*  r  r;   rp  rq  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  rR  r   rn   is_jsonis_jsonss           r:   test_read_skip_featuresr    s   
%
,C233	mnn		$		  
#=I
 
 
B r77c(mm#### ..Gk!HI /1+++/

&-- 	***+ 
"K     r<   c                     t          j        t          d          5  t          | d|           d d d            d S # 1 swxY w Y   d S )Nz'skip_features' must be >= 0rs   r  r   r  s     r:    test_read_negative_skip_featuresr    s    	z)G	H	H	H S S*"	RRRRS S S S S S S S S S S S S S S S S Sr   )r   ro  r  r   d   c                    | j         }t          |           j        |||z                                d          }t          | |||          }t	          |          t	          |          k    sJ |dv }|dk    }t	          |          dk    r\|sZ|d                             d          |d<   |d	                             d          |d	<   |d
                             d          |d
<   t          |||d| |           d S )NTr  )r  r   r;   rp  rq  r   r~   r  r   r   Fr  r  )	r   r;   r   r  rR  r   rn   r  r  s	            r:   test_read_max_featuresr     s<   
 &
,C233	mml::	<	$		 
 
##!	
 
 
B r77c(mm#### ..Gk!H
8}}) !) 5 < <X F F#F+228<<%h/66x@@
"K     r<   c                     t          j        t          d          5  t          | d|           d d d            d S # 1 swxY w Y   d S )Nz'max_features' must be >= 0rs   r  )r   r;   r   r  s     r:   test_read_negative_max_featuresr"    s    	z)F	G	G	G R R*yQQQQR R R R R R R R R R R R R R R R R Rr   c                    t          j        t          d          5  t          d|            d d d            n# 1 swxY w Y   t          j        t          d          5  t          d|            d d d            n# 1 swxY w Y   t          j        t          d          5  t          d|            d d d            d S # 1 swxY w Y   d S )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	J	J @ @)Y????@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ 
.Q	R	R	R H H1YGGGGH H H H H H H H H H H H H H H 
.Q	R	R	R G G0IFFFFG G G G G G G G G G G G G G G G G Gs1   :>> A>>BB$CC
Cc                 2   d}t          | |d|          }t          |j                  dk    sJ t          |          dk    sJ d}t          | |d|          }t          |          dk    sJ t          |j                  dk    sJ |j        d	         j        d
k    sJ d}t          | |d|          }t          |j                  dk    sJ t          |          dk    sJ |j                                        g dk    sJ d}t          | |d|          }t          |j                  dk    sJ t          |          dk    sJ |j                                        g dk    sJ d}t          | |d|          }t          |          dk    sJ t          |j                  dk    sJ |j                                        dk    sJ |j                                        dk     sJ d}t          | |d|          }t          |          d	k    sJ d S )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 rz??ar77c>>>> CC	#(i
 
 
B r77a<<<<rz??a71:%%%%7C 
#(i
 
 
B rz??ar77a<<<<9!6!6!66666C 
#(i
 
 
B rz??ar77a<<<<9!6!6!66666CC 
#(i
 
 
B r77b====rz??a:>>x'''':>>i'''' GC	#(i
 
 
B r77a<<<<<<r<   c                    | j         dk    rFt          j        t          d          5  t	          | d|           d d d            n# 1 swxY w Y   nEt          j        t          d          5  t	          | d|           d d d            n# 1 swxY w Y   t          j        t
          d          5  t	          | dd|	           d d d            d S # 1 swxY w Y   d S )
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   rI  r   r   r   s     r:   test_read_sql_invalidr0  k  s   ")W44]9,?@@@ 	 	+i   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 ]9,JKKK 	 	+i   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
 
K
 
 
 
 
 	'		
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s5   AA
A
-BBB2CCCc                     d}t          | |dddgd|          }t          |j                  dk    sJ t          |          dk    sJ |j                                        g dk    sJ d S )	Nr&  r'  iso_a3_renamedr   z'iso_a3_renamed IN ('CAN', 'USA', 'MEX'))rP   rQ   rg   r  r;   r   r  r   rf   rg   r2  rh   r+  s       r:   test_read_sql_columns_wherer4    s    
SC	#!6*7
 
 
B rz??ar77a<<<<##%%)>)>)>>>>>>>r<   c           	          d}t          | |dddgdd|          }t          |j                  dk    sJ t          |          d	k    sJ |j                                        d
dgk    sJ d S )Nr&  r'  r2  r   z iso_a3_renamed IN ('CRI', 'PAN')r  )rP   rQ   rg   r  r  r;   r   r   r  r  r3  r+  s       r:    test_read_sql_columns_where_bboxr6    s    
SC	#!6*0
 
 
B rz??ar77a<<<<##%%%777777r<   c                 ~   d}t          | |ddd|          }t          |j                  dk    sJ t          |          dk    sJ |j                                        dgk    sJ d}t          | |dd|	          }t          |          dk    sJ d}t          | |dd|
          }t          |          dk    sJ d S )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_maxr8    s    C 
#
 
 
B rz??ar77a<<<<9%((((
5C	#
 
 
B r77a<<<<
5C	#
 
 
B r77a<<<<<<r<   c                     g | ]
}|d k    |S )r   rU  rV  s     r:   rX  rX    s    ///SwSr<   c                    d}t          | |d|          }t          |          dk    sJ t          |j                  dk    sJ |j        d         j        dk    sJ |j        d         j        j        }d}t          | |d|          }t          |          dk    sJ t          |j                  d	k    sJ |j        d         j        j        |k    sJ d S )
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_nogpkgr?    s     CC	(i
 
 
B r77a<<<<rz??a71:%%%%'!*%*K&C 
(i
 
 
B r77a<<<<rz??a71:#k111111r<   r   c                    d}t          | |d|          }t          |          dk    sJ t          |j                  dk    sJ |j        d         j        dk    sJ |j        d         j        j        }d}t          | |d|          }t          |          dk    sJ t          |j                  d	k    sJ |j        d         j        j        |k    sJ d S )
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   r;  r=  s        r:   !test_read_sql_dialect_sqlite_gpkgrB    s     CC	2Cy
 
 
B r77a<<<<rz??a71:%%%%'!*%*K&C 
2Cy
 
 
B r77a<<<<rz??a71:#k111111r<   c                    | dz  }t          |d|          5 }|                    d           |                    d           ddd           n# 1 swxY w Y   t          j        dgdgd	          }| d
z  }t	          ||||           t          ||          5 }|                                }ddd           n# 1 swxY w Y   t          ||          5 }|                                }	ddd           n# 1 swxY w Y   ||	k    sJ t          |d          5 }|                                }
ddd           n# 1 swxY w Y   t          |d          5 }|                                }ddd           n# 1 swxY w Y   |
|k    sJ dS )zjTest 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_encodingrL    s     *$H	hh	/	/	/ 03		.!!!		.///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
!3 4ykJJ	K	KB"44B(8uMMMM 
h	*	*	* c((**              		2	2	2 -k%**,,- - - - - - - - - - - - - - -o%%%% 
h		 HHJJ	              		%	% /',,../ / / / / / / / / / / / / / /)))))))sY   +AAAB==CCC::C>C>D>>EEE::E>E>z ext, fid_column, fid_param_value))r   r  N)r   FIDN).sqliteogc_fidN)r   
fid_customrP  )r   
FID_customrP  )rN  ogc_fid_customrR  c                 l   t          j        |dgit          j        dd          gd          }i }|||d<   | d| z  }t	          ||fd|i| |                                sJ t          |d	|
          }|                                }|                    |di          }	t          ||	           dS )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  ra  r;   T)r   r;   r(  )
r   r   r  r-   r   existsr   r  renamer.   )
rj   rR  
fid_columnfid_param_valuer;   	input_gdfr   path
output_gdfexpected_gdfs
             r:   test_write_custom_fidsr\  -  s    . 	aSW]1a%8%8$9{  I F"'ulSll"DItCCyCFCCC;;==49MMMJ''))J ##Z,?#@@Lj,77777r<   c                    t          |          }| d| z  }|dk    rt          |||d           nt          |||           |                                sJ t          |          }|j        j                                        }t          |         t          v rt          |          dgk    sJ nt          |          ddhk    sJ |dv }|d	k    }	t          |||d| |	
           d S )Nra  rw  Fr;   spatial_indexru   MultiPolygonPolygonrp  rq  r  )r   r   rT  r   r   r  r   r   listr  r.   )
rj   r   rR  r;   rX  output_path
result_gdfgeometry_typesr  r  s
             r:   test_write_dataframerf  W  s<    233I\C\\)K
f}}{iu	
 	
 	
 	
 	
 		;)DDDD,,J(-4466Ns|444N##'777777>""~y&AAAAA ..Gk!H"K     r<   zignore:.*No SRS set on layer.*write_geodfc                     g | ]
}|d k    |S rw  rU  rV  s     r:   rX  rX    s     V V Vvr<   .xlsxc           	         t          |d          }|rt          j        |          }|d| z  }|dk    r|                    d          }|dk    rt          |         nd}t          ||||           |                                sJ t          |          }	t          |	t          j	                  sJ |d	v}
|d
v rot          |	t          j                  rJ t          |t          j                  rt          j	        |          }t          j
                            |	|d|
           dS t          j        |t          j        dt          |                    d          }t          |	|d|
           dS )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   ra  r   z.dbfrj  XLSX)r;   driver)r   rq  rj  )r   r   rj  )r  r  N  r   )r   r   r   with_suffixr   r   rT  r   r   r   testingassert_frame_equalr   repeatrf   r.   )r9   rj   r   rg  rR  r;   input_dfrc  rm  	result_dfr  input_none_geom_gdfs               r:   test_write_dataframe_no_geomrv  ~  s    1GGGH -?8,,\C\\)K f}}!--f55 !G^^WS\\FHkYvNNNN{++Ii..... ??K
(((i99999h00 	.|H--H

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

 !orys8}}==4
 
 
 	""#		
 	
 	
 	
 	
 	
r<   c                 $   t          |          }|                    d          }| dz  }t          |||           t          |          }t          |j        t
          j                  sJ t          ||                    d                     d S )Nr   test.shpru   Tr  )	r   	set_indexr   r   rt  r   r  r.   r  )rj   r   r;   rX  rc  rd  s         r:   test_write_dataframe_indexrz    s     233I##H--IZ'KI{i@@@@,,Jj&66666j)*?*?T*?*J*JKKKKKr<   c                     g | ]}|d v|	S )rq  rU  rV  s     r:   rX  rX    s"     S S SC{<R<R<R<R<Rr<   zcolumns, dtypecol_int	col_float
col_objectc                 D   t          j        g ||d          }| d| z  }t          |||           |                                sJ t	          ||          }t
          rdnd}|r'|t          u r|d                             d          |d<   t          |||	           d
S )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.
    rn  )r   rg   r   r   ra  ru   TFr~  r   r  N)	r   r   r   rT  r   r   r  r   r.   )	rj   rR  rg   r   r;   r   r   rn   r  s	            r:   test_write_empty_dataframer    s    " G5dSSSH,,,&HHh)<<<<??	I	6	6	6B
  ,6tt  FUf__!),!7!>!>u!E!Eb(=MNNNNNNr<   c                    t          j        ddgit          dg          d          }| dz  }t          j                    5  t          j        dt                     t          st          j        dd	
           t          ||           d d d            n# 1 swxY w Y   |
                                sJ t          |          }t          ||           d S )Nr}  r   zPOINT EMPTYrn  r   r   errorignorez'crs' was not provided.)message)r   r   r&   warningscatch_warningssimplefilterr   r   filterwarningsr   rT  r   r.   )rj   r   r   rn   s       r:   test_write_empty_geometryr    s   aSzHm_4M4MSWXXXH+%H 
	 	"	" , ,g{333 	Q#H6OPPPP(+++	, , , , , , , , , , , , , , ,
 ?? 
	!	!Bb(+++++s   ABBBc                    t          j        ddgit          dd          gd          }| dz  }t          |||           |                                sJ t          ||          }t          st          rIt          j	        j
        j        r3|r1|j        j        dk    sJ |d                             d          |d<   n|j        j        t          k    sJ t!          ||           dS )	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   rn  r   r   ru   r   )r   r   r-   r   rT  r   r   r   r   optionsfutureinfer_stringr  r   r   r  r.   )rj   r;   r   r   rd  s        r:   test_write_None_string_columnr    s     /<$0E!QKK=d
S
S
SC+%HCY7777??I>>>J5%5*,**;*H5
5 $*e3333-44U;;L$*f4444j#.....r<   rq  z	.geojsonsc                    t          j        g d          }| d| z  }t          |||           |                                sJ t	          j        t          d          5  t          ||          }d d d            d S # 1 swxY w Y   d S )Nrn  r   ra  ru   z9.* not recognized as( being in)? a supported file format.rs   )r   r   r   rT  rC   rx   rI  r   )rj   rR  r;   r   r   rS   s         r:   +test_write_read_empty_dataframe_unsupportedr    s     555H,,,&HHh)<<<<??	T
 
 
 : : 8y999: : : : : : : : : : : : : : : : : :s   "BBBc                 L   t          |          }| dz  }t          ||dd|           |                                sJ t          j        t          |          ddgg          sJ t          ||dd|           t          j        t          |          ddgddgg          sJ d S )Nr   firstT)r   promote_to_multir;   r`  second)r   r   rT  r   r   r   )rj   r   r;   rX  r   s        r:   )test_write_dataframe_gpkg_multiple_layersr  #  s    233I+%H    ??>+h//7N2K1LMMMMM    >H
>	"X~$>?      r<   c                    |rM|                     d          r8| j                            t          j                            d                     t          |          }|d| z  }t          |||           |                                 t          t          |                    dk    sJ t          |||d           t          t          |                    d	k    sJ d S )
Nr   z.Bugs with append when writing Arrow to GeoJSONrp   ra  ru   r|   T)r;   r   ib  )

startswithrA   r  rC   r  r  r   r   rT  rf   )r9   rj   r   rR  r;   rX  r   s          r:   test_write_dataframe_appendr  @  s      
S^^J// 
 	K%UVV	
 	
 	
 233I,,,&HIx9====OO~h''((C////Ix9TJJJJ~h''((C//////r<   r_  c                 d   t          |          }| dz  }t          ||||rdnd           |                                du sJ | dz  }|                                |u sJ | dz  }t          |||d|i	           |                                du sJ | d
z  }|                                |u sJ d S )Nz	test1.shpYESNO)r;   SPATIAL_INDEXTz	test1.qixz	test2.shpr_  )r;   layer_optionsz	test2.qix)r   r   rT  )	rj   r   r_  r;   rn   outfilename1index_filename1outfilename2index_filename2s	            r:   !test_write_dataframe_gdal_optionsr  V  s   
 
+	,	,Bk)L
,6ee$	      D((((,O!!##}4444 k)L
&6	      D((((,O!!##}444444r<   c                     t          |          }| dz  }t          j        t          d          5  t	          |||d           d d d            d S # 1 swxY w Y   d S )Ntest.geojsonz#unrecognized option 'SPATIAL_INDEX'rs   Tr^  r   rC   rx   r   r   )rj   r   r;   rn   outfilenames        r:   )test_write_dataframe_gdal_options_unknownr  u  s    	+	,	,B ^+K	z)N	O	O	O R RK9DQQQQR R R R R R R R R R R R R R R R R R   AAAc                     dd l }|                    |           }|                                }|                    d           |                                }d |D             S )Nr   z2SELECT name FROM sqlite_master WHERE type='table';c                     g | ]
}|d          S r   rU  )rW  ress     r:   rX  z)_get_gpkg_table_names.<locals>.<listcomp>  s    %%%sCF%%%r<   )sqlite3connectcursorexecutefetchall)rY  r  conr  r   s        r:   _get_gpkg_table_namesr    s_    NNN
//$

CZZ\\F
NNGHHH__F%%f%%%%r<   c                 (   t          |          }| dz  }t          |||           dt          |          v sJ | dz  }t          |||d           dt          |          vsJ | dz  }t          |||dd	i
           dt          |          vsJ d S )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CCC"78M"N"NNNNN (+B B
!Yd    &;<U&V&VVVVV!),D!D
"0%8	    &;<V&W&WWWWWWWr<   zFext, promote_to_multi, expected_geometry_types, expected_geometry_typerw  r`  ra  Unknownr   c                 @   t          |          }| d| z  }t          ||||           |                                sJ t          |          }	t          |	j        j                                                  }
|
|k    sJ t          |          d         |k    sJ d S )Ntest_promote)r;   r  geometry_type)r   r   rT  sortedr   r   r  r	   )rj   r   rR  r  expected_geometry_typesexpected_geometry_typer;   rX  rc  rZ  re  s              r:   %test_write_dataframe_promote_to_multir    s    * 233I1C111K;)FV    ,,JJ/4;;==>>N44444[!!/26LLLLLLLr<   zUext, promote_to_multi, geometry_type, expected_geometry_types, expected_geometry_typer   c                    t          |          }| d| z  }	|dk    r |dv rt          j        t          d          }
nt	          j                    }
|
5  t          ||	|||           d d d            n# 1 swxY w Y   |	                                sJ t          |	          }t          |j	        j
                                                  }||k    sJ t          |	          d         |k    sJ d S )Ntest_promote_layer_geom_typer   )ra  r-   z+A geometry of type MULTIPOLYGON is insertedrs   r;   r  r  r  )r   rC   r   RuntimeWarningrG  rH  r   rT  r  r   r   r  r	   )rj   r   rR  r  r  r  r  r;   rX  rc  ctxrZ  re  s                r:   5test_write_dataframe_promote_to_multi_layer_geom_typer    sf   F 233IACAAAK
g~~-+???l"O
 
 
 $&&	 
 
-'	
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ,,JJ/4;;==>>N44444[!!/26LLLLLLLs   A44A8;A8z;ext, promote_to_multi, geometry_type, expected_raises_match))rw  Fr`  Mismatched geometry type)rw  Fra  r  )rw  Nr-   r  )rw  Nra  r  )r   Nr-   zNCould not add feature to layer at index|Error while writing batch to OGR layerc                     t          |          }| d| z  }t          j        t          t          f|          5  t          |||||           d d d            d S # 1 swxY w Y   d S )Nra  rs   r  )r   rC   rx   r   r   r   )	rj   r   rR  r  r  expected_raises_matchr;   rX  rc  s	            r:   =test_write_dataframe_promote_to_multi_layer_geom_type_invalidr  	  s    4 233I\C\\)K	n5=R	S	S	S 
 
-'	
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   AA #A c                     t          |          }| dz  }t          j        t          d          5  t	          |||d           d d d            d S # 1 swxY w Y   d S )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  )	  s     
+	,	,B.(H	K
 
 
 Y Y 	H	XXXXY Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Yr  c                     g | ]}|d v|	S rT  rU  rV  s     r:   rX  rX  6	  "     N N NCv<M<M<M<M<Mr<   c                    t          j        dd          t          j        ddg          t          j        dddd          t          j        t          j        dd          t          j        dd          g          t          j        t          j        ddg          t          j        ddg          g          t          j        t          j        dddd          t          j        dddd          g          g}t          j        d	g d
i|d          }| d| z  }|dk    rt          |||d           nt          |||           t          |          d         dk    sJ t          |          }t          ||d           d S )Nr   r   r   r_   r_   r_   r   )r   r   )r   r   r   r   )r   r   r   g      @g      @g      @r{   r   ra  rw  Fr^  ru   r  r  T)check_geom_type)r  r-   
LineStringr  
MultiPointMultiLineStringr`  r   r   r   r	   r   r.   )rj   rR  r;   r   rn   r   r   s          r:    test_write_dataframe_truly_mixedr  6	  s    	aFF+,,Aq!QGM!Q//q!1D1DEFF 01173EvvFV3W3WX	
 	
 	gk!Q155w{1aA7N7NOPP	H 
	.../(
 
 
B ,,,&H
f}}H	OOOOOH	:::: X/9<<<<H%%Ffb$??????r<   c                 ^   t          j        dg dit          j        dd          t          j        ddg          t          j        dddd          gd          }d	}t          j        t          t          f|
          5  t          || dz  |           d d d            d S # 1 swxY w Y   d S )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   rx  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   
 
	 M!Q/00K1a##

 
 
 
B	G  
n5S	A	A	A H HHz1YGGGGH H H H H H H H H H H H H H H H H Hs   ?B""B&)B&c                     g | ]}|d v|	S ri  rU  rV  s     r:   rX  rX  q	  r  r<   geomsr_   r   c                     | d| z  }t          j        dddgi|d          }t          |||           t          |          }t	          ||           d S )Nra  r   r   r   r{   r   ru   )r   r   r   r   r.   )rj   r  rR  r;   r   rn   r   s          r:   .test_write_dataframe_infer_geometry_with_nullsr  q	  sk     ,,,&H	%#s,u+	N	N	NBBI6666H%%Ffb)))))r<   z=ignore: You will likely lose important projection informationc                    t          |          }|j        |j        dk                                 d                              d          }| dz  }t          |||           |                                sJ t          |          }|j                                        }|d         dk    sJ |d	         d
k    sJ |d         dk    sJ |j        	                    |j                  sJ d S )NBelgiumTr  z,+proj=aea +lat_1=49.5 +lat_2=51.5 +lon_0=4.3rx  ru   lat_1g     H@lat_2g     I@lon_0g333333@)
r   r  r   r  to_crsr   rT  r   to_dictequals)rj   r   r;   rn   r   r   r   s          r:   test_custom_crs_ior  	  s     
3	4	4B 	rw)#$	$			>	?	? 
 *$HHh)<<<<??		!	!B
&..

Cw<4w<4w<36==&&&&&&&r<   )	.gpkg.zipz.shp.zipz.shzc                    |dk    rt           st          j        d           t          |          }| d| z  }t	          |||           |                                sJ t          |          }|j        j                                        }t          |         t          v rt          |          dgk    sJ nt          |          ddhk    sJ t          ||d           d	S )
zBRun a basic read and write test on some extra (zipped) extensions.r  z&.gpkg.zip support requires GDAL >= 3.7ra  ru   r`  ra  Fr  N)r   rC   rD   r   r   rT  r   r   r  r   r   rb  r  r.   )rj   r   rR  r;   rX  rc  rd  re  s           r:   test_write_read_zipped_extr  	  s     k*<===233I\C\\)KI{i@@@@,,J(-4466Ns|444N##'777777>""~y&AAAAAj)eLLLLLLr<   c                    dddt          j                    d t          j        g}d |D             }t	          j        ||dd          }| dz  }t          ||           t          |          }t          |          t          |          k    sJ t          j
        d	 |D             d
          }t          |d
         |           d S )Nra  r   r_   c                 8    g | ]}t          j        d d           S r  r  r-   rW  rS   s     r:   rX  z7test_write_read_mixed_column_values.<locals>.<listcomp>	  $    777QW]1a  777r<   r   mixed
epsg:31370r`  test_write_mixed_column.gpkgc                 P    g | ]#}|d t           j        fvrt          |          nd $S r7   )r   r   r   )rW  values     r:   rX  z7test_write_read_mixed_column_values.<locals>.<listcomp>	  s2    WWWuT26N22UWWWr<   r  r4  )r   nowr   r   r   r   r   r   rf   r   r8  r0   )rj   mixed_valuesr  test_gdfrc  rZ  r   s          r:   #test_write_read_mixed_column_valuesr   	  s    CHLNND"&AL77,777E\22  H ;;KHk***,,Jx==C
OO++++ yWW,WWW  H 
7+X66666r<   c                 ,   dddt          j                    d t          j        g}d |D             }t	          j        ||dd          }| dz  }t          j        t          d	
          5  t          ||d           d d d            d S # 1 swxY w Y   d S )Nra  r   r_   c                 8    g | ]}t          j        d d           S r  r  r  s     r:   rX  z=test_write_read_mixed_column_values_arrow.<locals>.<listcomp>	  r  r<   r  r  r`  r  z.*Conversion failed for columnrs   Tru   )
r   r  r   r   r   r   rC   rx   	TypeErrorr   )rj   r  r  r  rc  s        r:   )test_write_read_mixed_column_values_arrowr  	  s     CHLNND"&AL77,777E\22  H ;;K	y(H	I	I	I ? ?+>>>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?s   )B		BBc                    | dz  }t          j        dd          }|||gdd t          j        gdd t          j        gd}t	          j        |d          }t          |||           t          |          }t          |          t          |          k    sJ |d	         d         dk    sJ t          j
        |d	         d
                   sJ t          j
        |d	         d                   sJ |d         d         dk    sJ t          j
        |d         d
                   sJ t          j
        |d         d                   sJ d S )Nztest_write_nan.gpkgr   r   ra  )r   float64
object_strr  r`  ru   r  r_   r   r  )r  r-   r   r   r   r   r   r   rf   r   r   )rj   r;   rc  geom	test_datar  rd  s          r:   test_write_read_nullr
  	  s]   22K=AD4&rv&tRV, I
 yl;;;HHkY????,,Jx==C
OO++++i #s****7:i(+,,,,,7:i(+,,,,,l#A&&00007:l+A./////7:l+A.///////r<   c                 *   | \  }}d|j          }t          ||          }t          |          dk    sJ 	 t          |||           t          ||          }t          |          dk    sJ 	 t	          |           d S # t	          |           w xY w)N/vsimem/ru   r|   )r   r   rf   r   r   )r   r;   rY  rS   mem_pathinputr   s          r:   test_write_read_vsimemr  	  s    %GD!%$)%%H49555Eu::x9====I>>>6{{c!!!!!8
8s   8B B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                     | dz  }t          j        t          |g          d          }|D ]4}t          ||||           t	          |          }t          ||           5d S )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  	  sz    . *$H
/8SE??
D
D
DC + +	X)TTTTH%%!"c****+ +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                 ,   |dk    r0|dv rt          j        d| d|            n|dk    rd}n|dk    rd}i }|gt          |          z  |d	<   d
 t          t          |                    D             |d<   t	          j        |t          |          d          }| d| z  }	|dk    r2|j        |j        	                                |j        j
        z            }|r[t          |         t          v rGt          j        t          d          5  t          ||	|           d d d            n# 1 swxY w Y   d S t          ||	|           t!          |	          }
|
d         |k    sJ t#          |	          }|dk    rd|_        t'          ||           d S )Nr   )r  r  zext z doesn't support r  r  r  r  
test_descrc                 ,    g | ]}t          |          S rU  )r   )rW  idxs     r:   rX  z4test_write_geometry_z_types_auto.<locals>.<listcomp>]
  s    >>>s#c((>>>r<   r  r{   r   ra  rw  z0Mixed 2D and 3D coordinates are not supported byrs   ru   r  rq  )rC   rD   rf   r  r   r   r&   r  r   r   is_emptyr   r   rx   r   r   r	   r   r   r.   )rj   rR  r  exp_geometry_typemixed_dimensionsr  r;   column_datar   r   r   rd  s               r:    test_write_geometry_z_types_autor"  
  s*   l f}} CCCKHsHH5FHHIIII"555 ."222 +K!+s3xx 7K>>eCHHoo>>>K
/+;
O
O
OC,,,&H
f}} g))++cl.CCDE <GCL,GGG]E
 
 
 	@ 	@ CY????		@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@
 	X;;;;XD $55555))J
k$
c:.....s   D,,D03D0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)r  NN)fixNzPOLYGON ((0 0, 0 1, 0 0))z.ignore:Non closed ring detected:RuntimeWarningc                 v   |dk    rt           st          j        d           |dk    r&t          j        t          j        j        |          }nF|dk    rt          j        |          }n*|dv rt          j	                    }nt          d|           d}| d	z  }t          |d
          5 }|                    |          }	d d d            n# 1 swxY w Y   |5  t          |||          }
||
j        j        d         J n|
j        j        d         j        |k    sJ d d d            d S # 1 swxY w Y   d S )Nr%  z.on_invalid=fix not available for Shapely < 2.1r$  rs   r#  )r%  r  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   rG  rH  r   rd   re   r   r   r   r  )rj   r;   r'  r  expected_wktrN  invalid_geojsonr   frS   rn   s              r:   test_read_invalid_poly_ringr-  z
  s     U=DEEEW- <GLLL	v		,W---	(	(	((**F*FFGGG	O .(H	h		 %GGO$$% % % % % % % % % % % % % % % 
 	; 	;!
 
 

 ;#A&....;#A&*l::::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s%   +CCCAD..D25D2c                 8   |rct          j        d           t          j        t          j        j                  5  t          | d           d d d            d S # 1 swxY w Y   d S t          |           }|j        j        	                                dgk    sJ d S )Nz5Shapely + GEOS 3.13 crashes in from_wkb for this caseTru   r`  )
rC   rD   rx   r  r(  r)  r   r   r   rh   )multisurface_filer;   rn   s      r:   test_read_multisurfacer0  
  s     = 	KLLL]7>788 	> 	> ,====	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>
 -.. {&&((^,<<<<<<<s   AA Ac                    t          | |          }t          j        dgddigdt          j        dd          gd          }t
          r%|r#|d	                             t                    |d	<   t          ||           t          | |d
          }t          j        dgdgdt          j        dd          gd          }t          ||           d S )Nru   Abottom_levelB)	top_levelintermediate_levelr   r{   r   r6  r  )r;   FLATTEN_NESTED_ATTRIBUTES)r5  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   	+y	A	A	AB$2C#8"9	
 	
 -1%%&  H  Wy W *22F)G)N)Nv)V)V%&b(+++	yE
 
 
B 03u	
 	
 -1%%&  H b(+++++r<   c                     t          j        t          d          5  t          | |d           d d d            d S # 1 swxY w Y   d S )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	S	S P P*iOOOOP P P P P P P P P P P P P P P P P Pr   c                    | dz  }t          j        g dd          t          j        g dd          t          j        g dd          t          j        g d	d
          t          j        g dd          d}t          j        |t	          j        dd          gdz  d          }t          |||           t          |          }|                                }|d         	                    d          |d<   |d         	                    d          |d<   |d         	                    d          |d<   |d         	                    d          |d<   d |j
        d<   t          ||           d S )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   rD  r  rE  float32rF  rG  r   )r_   rG  )r   r8  r   r   r  r-   r   r   r  r   r  r.   )rj   r;   rY  r	  rX  rZ  r   s          r:   test_write_nullable_dtypesrI  
  s   11D	)))7333	,,,g666	***)<<<	---Y???	***(;;; I W]1a001A5<  I Ity9999%%J ~~H'..y99HV'..y99HV'..y99HV'..u55HV"HLj(33333r<   metadata_type)dataset_metadatalayer_metadatametadatac                     d|i}t          |          }| dz  }t          ||fd|i||i |dk    rdn|}t          |          |         |k    sJ d S )Nlevelr   r;   rM  rL  )r   r   r	   )rj   r   rJ  r;   rM  rn   r   metadata_keys           r:   test_metadata_iorQ    s    
 'H	+	,	,B+%HBSSIS-9RSSS'4
'B'B##LX|,888888r<   rK  rL  rM  keyc                     t          |          }t          j        t          d          5  t	          || dz  fd|i||i d d d            d S # 1 swxY w Y   d S )Nzmust be a stringrs   r   r;   r  )rj   r   rJ  rM  r;   rn   s         r:   test_invalid_metadatarT    s     
+	,	,B	z);	<	<	< 
 
;&	
 	
2;	
@Mx?X	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   AAAc                     | dz  }t          t          |          |fd|i|ddii |dk    rdn|}t          |          |         J dS )zmetadata is silently ignoredr  r;   rR  r  rM  rL  N)r   r   r	   )rj   r   rJ  r;   r   rP  s         r:   test_metadata_unsupportedrV  -  s    
 .(H*++   5'*
+	   (5
'B'B##LX|,44444r<   zArrowDtype requires pandas 1.5+c                    t          j        d           | dz  }t          j        dddgit	          dd          d gd          }t          ||           t          |d	d
d i          }t          |d         j        t          j
                  sJ |d                             d          |d<   t          ||           d S )Npyarrowr   r   r   r   r_   r{   r   Ttypes_mapperc                 *    t          j        |           S r7   )r   
ArrowDtype)pa_dtypes    r:   r  z2test_read_dataframe_arrow_dtypes.<locals>.<lambda>N  s    R]8-D-D r<   )r;   arrow_to_pandas_kwargsr  )rC   importorskipr   r   r-   r   r   r   r   r   r[  r   r.   )rj   r   rn   r   s       r:    test_read_dataframe_arrow_dtypesr_  ?  s     	"""+%H		c
uQ{{D&9{
 
 
B B!!!DD 
  F fUm)2=999995M((33F5Mfb)))))r<   )r   r  r   z+Arrow bool value bug fixed in GDAL >= 3.8.3c                     | d| z  }i }|dk    rd|d<   t          j        g dt          dd          gdz  dd	
          }t          ||fi | t	          |d          }t          |||dk               d S )Nra  rw  Fr_  TFTFTr   r   r  r   r{   r`  Tru   r   )r  r   r   r-   r   r   r.   )rj   rR  r   r   rn   r   s         r:   test_arrow_bool_roundtriprd  V  s     ,,,&HF
f}}"'	555E!QKK=STCTUU
 
 
B
 B++F+++H555FfbcVmDDDDDDr<   c                 j   | d| z  }t          j        g dt          dd          gdz  dd          }t          ||           |dv rXt	          j        t          d	
          5  t          |d           d d d            n# 1 swxY w Y   t          |dg            d S t          |d          }d S )Nra  ra  r   r   rb  r{   r`  >   rw  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   rR  r   rn   rS   s        r:   test_arrow_bool_exceptionrg  o  s*    ,,,&H	555E!QKK=STCTUU
 
 
B
 B!!!
]
 
 
 	5 	5
 8t4444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	x4<<<<<< 8t444s   %BB
Bc           	         d}d}| dz  }t          j        ||gdt          dd          gid          }t          |||           t	          |d	          }|J t                      5  t          j        t          d          5  t	          |d	          }d
d
d
           n# 1 swxY w Y   d
d
d
           d
S # 1 swxY w Y   d
S )z9Test if arrow can be enabled via an environment variable.CP1252   ÿr   r   r   r{   r`  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_variablern    sn    HD;&I	$
U1a[[MB	T	T	TBB	H5555 I999F 
		 = =]M
 
 
 	= 	= y8<<<A	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	== = = = = = = = = = = = = = = = = =s6   )B;B#B;#B'	'B;*B'	+B;;B?B?z"ignore:File /vsimem:RuntimeWarningrm  GeoJSONGPKGc                 z   t          |           }t                      }t          |||d           t          |                                          dk    sJ t          |          }t          |          t          |          k    sJ |dk    }t          |||d|            t          dd	          g k    sJ d S )
Nra  rm  r   r   ro  F)r  r  r  r  	pyogrio_*pattern)r   r   r   rf   	getbufferr.   r   )r   rm  rn   bufferactualr  s         r:   test_write_memoryry    s     
+	,	,BYYFBvV<<<<v!!""Q&&&&F##Fv;;#b''!!!!	!G
"K    
K888B>>>>>>r<   c                     t          |           }t                      }t          j        t          d          5  t          |                    d          |d d           d d d            n# 1 swxY w Y   t          dd          g k    sJ d S )	Nz2driver must be provided to write to in-memory filers   r_   ra  rr  r  rs  rt  )r   r   rC   rx   r   r   r  r   r   rn   rw  s      r:   !test_write_memory_driver_requiredr|    s    	+	,	,BYYF	B
 
 
 G G 	

F4vFFFF	G G G G G G G G G G G G G G G 
K888B>>>>>>s   'A,,A03A0zESRI ShapefileOpenFileGDBc                     t          |           }t                      }t          j        t          d|           5  t          |||d           d d d            n# 1 swxY w Y   t          dd          g k    sJ d S )Nz/writing to in-memory file is not supported for rs   ra  rr  r  rs  rt  )r   r   rC   rx   r   r   r   r   rm  rn   rw  s       r:   $test_write_memory_unsupported_driverr    s    	+	,	,BYYF	TFTT
 
 
 A A 	F6@@@@A A A A A A A A A A A A A A A 
K888B>>>>>>s   AA #A c                 "   t          |           }t                      }t          j        t          d          5  t          |                    d          ||dd           d d d            n# 1 swxY w Y   t          dd	          g k    sJ d S )
Nz+append is not supported for in-memory filesrs   r_   ra  T)rm  r   r   r  rs  rt  r   r   rC   rx   NotImplementedErrorr   r  r   r  s       r:   $test_write_memory_append_unsupportedr    s    	+	,	,BYYF	#P
 
 
 V V 	

F6PTUUUUV V V V V V V V V V V V V V V 
K888B>>>>>>s   (A--A14A1c                 "   t          |           }t          d          }t          j        t          d          5  t          |                    d          |dd           d d d            n# 1 swxY w Y   t          dd	
          g k    sJ d S )Ns   0000z5writing to existing in-memory object is not supportedrs   r_   ro  ra  rr  r  rs  rt  r  r{  s      r:   &test_write_memory_existing_unsupportedr    s    	+	,	,BWF	E
 
 
 L L 	

F9FKKKK	L L L L L L L L L L L L L L L 
K888B>>>>>>s   'A--A14A1c                    t          |          }t          j        t          d          5  t	          | dz  d          5 }t          |                    d          |           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t          j        t          d          5  t          | dz  d          5 }|                    dd          5 }t          |                    d          |           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   t          d	d
          g k    sJ dS )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  rs  rt  )	r   rC   rx   r  rd   r   r  r   r   )rj   r   rn   r,  zs        r:   test_write_open_file_handler    s    
+	,	,B 
#X
 
 
 + + (^+T22 	+aBGGAJJ***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	++ + + + + + + + + + + + + + + 
#X
 
 
 / / X 22C88 	/A,, /

A.../ / / / / / / / / / / / / / /	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	// / / / / / / / / / / / / / / 
K888B>>>>>>s   B$A/#B/A3	3B6A3	7BB
B
,D5 D$D;DDDDDD5D"	"D5%D"	&D55D9<D9gpkggeojsonc           	         |\  }}| d| z  }t          j        ||gdt          dd          gid          }t          |||           t	          j        t                    5  t          |           ddd           n# 1 swxY w Y   t          ||          }|j        d         |k    sJ ||         j	        d         |k    sJ dS )a  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{   r`  rZ   N)
r   r   r-   r   rC   rx   UnicodeDecodeErrorr   rg   r  )rj   rR  encoded_textr[   rl  rc  rn   rx  s           r:   test_non_utf8_encoding_ior    s     "NHd]S]]*K	$
U1a[[MB	T	T	TBBh7777 
)	*	* $ ${###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ K(;;;F>!$$$$$<q!T))))))s   #A??BBc           	         |\  }}| d| z  }t          j        ||gdt          dd          gid          }t          |||           t	          j        t                    5  t          |           d d d            n# 1 swxY w Y   t	          j        t          d          5  t          ||d	
           d d d            d S # 1 swxY w Y   d S )Nr  r   r   r{   r`  rZ   rk  rs   Tr^   )	r   r   r-   r   rC   rx   r  r   r   )rj   rR  r  r[   rl  rc  rn   s          r:   )test_non_utf8_encoding_io_arrow_exceptionr  0  s    "NHd]S]]*K	$
U1a[[MB	T	T	TBBh7777 
)	*	* $ ${###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 
I
 
 
 G G 	{XFFFFG G G G G G G G G G G G G G G G G Gs$   #A??BB%CC	C	c           	         |\  }}| dz  }t          j        ||gdt          dd          gid          }t          |||           t	          ||          }|j        d         |k    sJ ||         j        d         |k    sJ |                    d                                           |	                    |          
                    d	          }|rEt          j        t          d
          5  t	          |d           d d d            n# 1 swxY w Y   n=t	          |d          }	|	j        d         |k    sJ |	|         j        d         |k    sJ t	          |||          }|j        d         |k    sJ ||         j        d         |k    sJ t	          |||          }|j        d         |k    sJ ||         j        d         |k    sJ d S )Nrx  r   r   r{   r`  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  ro  unlinkencodedecoderC   rx   r   )
rj   r  r;   r[   rl  rc  rn   rx  miscodedbads
             r:   #test_non_utf8_encoding_io_shapefiler  C  sS   !NHdZ'K	$
U1a[[MB	T	T	TBBh7777
 K9===F>!$$$$$<q!T)))) F##**,,, {{8$$++L99H 
3]W
 
 
 	8 	8 ;$7777		8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 [E:::{1~))))8}#A&(2222 K(iPPPF>!$$$$$<q!T)))) K9xPPPF>!$$$$$<q!T))))))s   0DDDc                     t          j        t          d          5  t          | dd|           ddd           dS # 1 swxY w Y   dS )z^Providing 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  s     
X
 
 
 
 
 	'B)	
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   =AAc           	          |\  }}| dz  }t          j        ||gdt          dd          gid          }t          j        t
          d          5  t          |||dd	i
           ddd           dS # 1 swxY w Y   dS )zhProviding both encoding parameter and ENCODING layer creation option
    (even if blank) is not allowed.rx  r   r   r{   r`  zKcannot provide both encoding parameter and "ENCODING" layer creation optionrs   r  r   )r[   r  N)r   r   r-   rC   rx   r   r   )rj   r  r[   rl  rc  rn   s         r:   4test_encoding_write_layer_option_collision_shapefiler  {  s     "NHdZ'K	$
U1a[[MB	T	T	TB	
 
 
 	
 	
 	hz2>N	
 	
 	
 	
	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
 	
s   A33A7:A7c           	         d}| dz  }d}t          j        ||dt          dd          gid          }t          |||           t	          |d	| d
| d|          }|j        d         |k    sJ ||         j        d         |k    sJ t	          |d	| d
| d||          }|j        d         |k    sJ ||         j        d         |k    sJ d S )Nr  rx  u   中文r   r   r{   r`  rZ   zselect * from test where "z" = ''r.  )rP   r[   r;   )r   r   r-   r   r   rg   r  )rj   r;   r[   rc  mandarinrn   rx  s          r:   $test_non_utf8_encoding_shapefile_sqlr    s4   HZ'KH		8Z%1++7[
 
 
B Bh7777E(EE(EEE  F
 >!((((("1%1111E(EE(EEE	  F >!((((("1%111111r<   c                 &   t          dd          t          dd          t          dd          g}t          j        |d          }| d	z  }t          ||d
d|           t	          ||          }t          j        |j        j        |          sJ d S )Nro        (   r  <   r{   r   test.kml	tmp_layerKMLr   rm  r;   ru   	r-   r   r   r   r   r   r   r   r  )rj   r;   pointsr   rc  gdf_ins         r:   $test_write_kml_file_coordinate_orderr    s     BmmU2r]]E"bMM:F
/6{
;
;
;CZ'K[EY    K9===F>&/0&9999999r<   z>LIBKML driver is not available and is needed to append to .kmlc                    t          dd          t          dd          t          dd          g}t          j        |d          }| d	z  }t          ||d
d|           t          dd          t          dd          t          dd          g}t          j        |d          }t          ||d
d|d           t	          ||d          }t          j        |j        j        ||z             sJ dS )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.
    ro  r  r  r  r  r  r{   r   r  r  r  r  r  r  rF  rc     T)r   rm  r;   r   )r;   r   Nr  )rj   r;   r  r   rc  points_append
gdf_appendgdf_in_appendeds           r:   test_write_kml_appendr    s    BmmU2r]]E"bMM:F
/6{
;
;
;CZ'K[EY    1a[[%2,,b">M-[IIIJ    %[IPTUUUO>/296M;QRRRRRRRr<   c           	      H   t          dd          t          dd          t          dd          g}t          j        |d          }| d	z  }t          ||d
dd|           t	          ||          }t          j        |j        j        |          sJ t          dd          t          dd          t          dd          g}t          j        |d          }t          ||d
dd|d           t	          ||          }t          j        |j        j        ||z             sJ d S )Nro  r  r  r  r  r  r{   r   r  r  ro  T)r   rm  RFC7946r;   ru   F   P   r  r  n   x   )r   rm  r  r;   r   r  )	rj   r;   r  r   rc  r  r  r  r  s	            r:   &test_write_geojson_rfc7946_coordinatesr    sA   BmmU2r]]E"bMM:F
/6{
;
;
;C^+K    K9===F>&/0&99999 2r]]E"cNNE#sOODM-[IIIJ    %[IFFFO>/296M;QRRRRRRRr<   c           	         t          j        g dt          dd          t          dd          t          dd          gdd          }| dz  }t          |||	           t	          ||	          }t          ||           d
S )zE
    Simple test verifying the Parquet driver works if available
    r  r   r_   r   )r   r   r{   r`  ztest.parquetru   Nrc  )rj   r;   r   rc  r   s        r:   test_parquet_driverr    s     /		aU1a[[%1++'NOO  C ^+KC	::::K9===Ffc*****r<   )rG  rv   rI   rJ  r  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   ImportErrorr^  fixturer8   r;   rE   contextmanagerrM   rT   r  parametrizero   skipifrw   upperry   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r/  r  rA  rQ  rk  r  r  r  r$  r   fromisoformatr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ra  GeometryCollectionr  r  r  r  r?  r  r  r
  r  r  r  r   r"  r$  r,  r0  r4  r6  r8  r?  rB  rL  r\  rf  rv  rz  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  r:  r=  rI  rQ  rT  rV  r_  rd  rg  rn  ry  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rU  r<   r:   <module>r     sA!        				 				                                        	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 X W W W W W W W W W W W K K K K K K K K K K       	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	((((((                NNN&&&&&&;;;;;;        
  	 	 	D	  K       
T!5666     > > >  , , ,   Wd*>???	 5 5 5. F!!''))W45   9 9	 92     
 $'7"dAUTU&W 
" 
" 
" ')*#$   
  
/ / /
 
 
") ) )*	D 	D 	D LLNN"T   	- 	-	 	-)- )- )-XX X X
 T2w$788$ $ 98$ u6 u6 u6p T2
M/J$KLL. . ML.: %(I   7 7  &%7D %S S &%Sl A  %+ + &% + -t}==/%??6< 6< @? >=6<r  J J J J JKK-t}==/%??%.. .. &% @? >= LK..b  J J J J JKK-t}==/%??TUU%@G @G &% VU @? >= LK
@GF  J J J J JKK-t}==/%??A  %EA EA &%  @? >= LKEAP  J J J J JKK-t}==/%??A  %A. A. &%  @? >= LKA.H  J J J J JKK BL899BL455F	
 #H"#BCC"H"#>??F	
  -t}==/%??A  %W. W. &%  @? >=  LK,W.t  J J J J JKK-t}==/%??%1. 1. &% @? >= LK1.h
" 
" 
"0 0 0(
  
  
 " " "J  "   !:!:!:;;T T <;T
 	!2&	UEN+	w' 
/ 
/ 
/. . .. . . 
!Q002 L L L

 
 
 	tR	 	 5'*	S!S"	%	%u~6GO&(9:&(9:&(:;&(:;&(:;&(9:	 	 "!!	
 'G&tR((+'+c1c2*F*FG  "!!		
! 4/ /5 4/&. . .. . . ***hbhzzz.R.R.R!STT1 1 UT1 K K K 	!*O        $ 2s)44! ! 54!HS S S
 ,,,77"c33& & 43 87&RR R R
	G 	G 	G9 9 9x
 
 
.? ? ?8 8 8 # # #L //H///#$   
2 2  2. G90E/F   2 2  22 Wd*BCCC	  *  *  *F &  
 
 %8 8 &%
 
8< ))%" " &% *)"J <==u66 V VG90D V V VWW%2
 2
 &% XW 76 >=2
j %
L 
L &%
L  S S S S STT	T

bh

#
 	  %O O &%  UTO0, , ," %/ / &%/. k :;;%: : &% <;:  %  &%8 ))%0 0 &% *)0( 5$-88%5 5 &% 985: %R R &%R& & & %X X &%X. L	'8	'8	3Y?	TNI6	B	TN+^<	U^Y7C
 
 %M 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 "M &%1 2"MJ A     %
 
 &%! "
, %	Y 	Y &%	Y  N N N N NOO%@ @ &% PO@< %H H &%H4  N N N N NOO	}w}Q""#	q!		d#	}w}Q1%%&	t	  %* * &%  PO* C  %' '  &% 
',  A A ABB%M M &% CBM,7 7 7( 	? 	? 	? %0 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M); ); NM );X= = =" ,  ,  ,FP P P
 %4 4 &%42 GGG  %
9 
9 &% 
9 +=?O*PQQ	
A		
  %
 
 &%  RQ
 +=?O*PQQ%5 5 &% RQ5  $-NOO* * PO*, y )V    ))E E *)  
E( 	!*W    ))5 5 *)  
54 = = =, @AAIv#677? ? 87 BA?2? ? ? $4m#DEE? ? FE? Iv#677? ? 87?? ? ?? ? ?0  344* * 54*8  344G G 54 G")* )* )*X	
 	
 	

 
 
(2 2 2: %: : &%: %LLNN"K   S S	  &%
SB %!S !S &%!SH %(I   + +  &%+ + +s   6B? ?CC