
    huW                    p    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-m.Z. d dl/Z/	 d dl0Z1d dl2Z3d dl4m5Z5 d dl6Z6d dl7m8Z8 d dl9m:Z: d dl;m<Z<m=Z=  e/j~                  d        e/j                  dd e/j                  de-      g      d        ZB e/j                  d      d        ZCd ZDe/j                  j                  dd e/j                  dde-      ddg      d        ZGe/j                  j                   ej                         j                         dk(  d !      d"        ZKd# ZLd$ ZMe/j                  j                  d%d&g dd'fg dd fg      d(        ZNe/j                  j                  d)d*d+gd,g-      d.        ZOd/ ZPd0 ZQd1 ZRe/j                  j                  e d2!      d3        ZSd4 ZTd5 ZUd6 ZVe/j                  j                  d7      e/j                  jV                  d8               ZXe/j                  j                  d9      e/j                  jV                  d:               ZYe/j                  j                  d9      e/j                  jV                  d;               ZZd< Z[d= Z\d> Z]d? Z^d@ Z_dA Z`e/j                  j                  dBg dC      dD        Zae/j                  j                  dEdFg fdGdHdIgfdJdKgfg      dL        ZbdM ZcdN Zde/j                  j                  dOdPd d gdQdRdSg      dT        ZedU Zfe/j                  j                  dV e6jp                  dWdX      dKgf e6j                  dYdZd[d\      dHdIgf e6j                  d]d^gd_d`gdadbgdcddgdedfgd]d^gf      g dgf e6j                   e6jp                  dhdi       e6j                  dYdZd[d\      g      g djfg      dk        Zjdl Zkdm Zle/j                  j                  dng do e	j                  g doe	j                  p      g      dq        Zoe-dr        Zpe-e/j                  j                  edsk\  dt!      du               Zqdv Zre/j                  j                  dwd\dxg      dy        Zsdz Zte/j                  j                  dwg d{      e/j                  j                  d|d\d}g      d~               Zud Zvd Zwd Zxd Zyd Zzd Z{d Z|e,e/j                  j                  d,e(D  cg c]
  } | dk7  s	|  c} d,g-      d               Z}e,e/j                  j                  d,dgd,g-      d               Z~e/j                  j                  dd e/j                  dde+      ddg      d        Ze/j                  j                  dg d      e/j                  jV                  d               Ze/j                  j                  de(      e/j                  jV                  d               Ze/j                  j                  d      e/j                  j                  dddg      e/j                  j                  de(dgz   D  cg c]
  } | dk7  s	|  c}       e/j                  jV                  d                             Ze/j                  jV                  d        Ze/j                  j                  de(D  cg c]	  } | dvs|  c}       e/j                  j                  dg dfdge	j                  fdge	j                  fdgefg      e/j                  jV                  d                      Zd Ze/j                  jV                  d        Ze/j                  j                  dddg      e/j                  jV                  d               Ze/j                  jV                  d        Ze/j                  j                  de(      e/j                  jV                  d               Ze/j                  j                  dddg      e/j                  jV                  d               Ze/j                  jV                  d        Zd Ze/j                  jV                  d        Ze/j                  j                  ddddgdfdddgdfddddgdfddddgdfdddgdfddddgdfg      e/j                  jV                  d               Ze/j                  j                  dddddgdfdddddgdfdddddgdfdddddgdfdddddgdfdddPddgdfddddgdfdddddgdfddddgdfddddgdfddddgdfdddPdgdPfddddgdfdddddgdfdddddgdfdddddgdfdddddgdfdddddgdfg      e/j                  jV                  d               Ze/j                  j                  dg d      e/j                  jV                  d               Ze/j                  jV                  d        Ze/j                  j                  de(D  cg c]	  } | dvs|  c}       e/j                  jV                  d               Ze/j                  jV                  d        Ze/j                  j                  de(D  cg c]	  } | dvs|  c}       e/j                  j                  dd e6jp                  dd      g e6jp                  dd      dgd e6jp                  ddd      gddgg      e/j                  jV                  d                      Ze/j                  j                  d      e/j                  jV                  e.d                      Ze/j                  j                  dg d      e/j                  jV                  d               Zd Ze+d        Ze/j                  jV                  d        Ze/j                  jV                  d        Ze/j                  j                  ddddgfdddgfdddgfdddgfdddgfdddgfdddgfg      e/j                  jV                  dׄ               Ze/j                  j                  de(      e/j                  j                  dddddgfddddgfddddgfddddgfddddgfddddgfddddgfdddddgfdddddgfdddddgfdddddgfg      e/j                  jV                  d                      Ze/j                  j                  dg d      e/j                  j                  d      d               Zd Zd Zd Ze/j                  jV                  d        Ze/j                  j                  dg d      e/j                  jV                  d               Ze/j                  j                  dddg      e/j                  j                  dddiddiddig      e/j                  jV                  d                      Ze/j                  j                  dddg      e/j                  jV                  d               Ze/j                  j                  e d!      d        Ze-e/j                  j                  edk  d!      e/j                  j                  de(      d                      Ze-e/j                  j                  edk\  d!      e/j                  j                  de(      d                      Ze/j                  j                  d      e/j                  j                  dd dg      d               Zd Ze/j                  j                  dddg      d        Ze/j                  j                  dd dg      d        Zd Zd	 Ze/j                  j                  dd
dg      d        Ze-e/j                  j                  dd
dg      d               Zd Zd Zd Zd Ze/j                  jV                  d        Ze/j                  jV                  d        Zy# e>$ r Y ww xY wc c} w c c} w c c} w c c} w c c} w (      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GDAL_GE_352HAS_ARROW_WRITE_API
HAS_PYPROJPANDAS_GE_15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	START_FIDrequires_arrow_write_apirequires_gdal_geosrequires_pyarrow_apirequires_pyproj)from_wkt)Point)assert_geodataframe_equal)assert_index_equalassert_series_equal	geopandassessionFT)marks)scopeparamsc                     | j                   S N)param)requests    R/var/www/html/immo/lib/python3.12/site-packages/pyogrio/tests/test_geopandas_io.py	use_arrowr4   D   s     ==    )autousec                     d| j                   v r| j                  d      nd}|r9t        s2| j                  j	                  d      rt        j                  d       y y y y )Nr4   Fr!   z&GDAL>=3.8 required for Arrow write API)fixturenamesgetfixturevaluer   nodeget_closest_markerpytestskip)r2   r4   s     r3   skip_if_no_arrow_write_apir>   O   sb     '... 	,  	#LL++,FG<= H $ 	r5   c                 @    	 t        | dd      }y# t        $ r Y yw xY w)Nzselect spatialite_version();SQLITE)sqlsql_dialectTF)r   	Exception)path_s     r3   spatialite_availablerF   `   s0    4(
  s    	zencoding, arrow)utf-8FrG   )cp1252F)NFc                    | dz  }t        |d|      5 }|j                  d       |j                  d       ddd       t        |||      }t        |      dk(  sJ |j                  j                         d	d
gk(  sJ |j                  j                         dgk(  sJ |j                  j                         dgk(  sJ y# 1 sw Y   xY w)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rM   r4         nämecity   Zürich   Wilhelm Röntgen)openwriter   lencolumnstolistrS      näme)tmp_pathrM   arrowcsv_pathcsvdfs         r3   test_read_csv_encodingra   j   s      *$H	hh	/ 03		.!		./0 
8u	EBr7a<<::7F"333377>>	{***88??!3 44440 0s   #B??CzUTF-8z(test requires non-UTF-8 default platformreasonc                 8   | dz  }t        |dt        j                               5 }|j                  d       |j                  d       ddd       |r2t	        j
                  t        d      5  t        ||	      }ddd       yt        ||	      }t        |      d
k(  sJ |j                  j                         ddgk(  sJ |j                  j                         dgk(  sJ |j                  j                         dgk(  sJ y# 1 sw Y   xY w# 1 sw Y   yxY w)zVerify that read defaults to platform encoding; only works on Windows (CP1252).

    When use_arrow=True, reading an non-UTF8 fails.
    rJ   rK   rL   rN   rO   Nz; please use_arrow=Falsematchr4   rQ   rR   rS   rT   rU   )rV   localegetpreferredencodingrW   r<   raisesr   r   rX   rY   rZ   rS   r[   )r\   r4   r^   r_   r`   s        r3   test_read_csv_platform_encodingrk      s    *$H	hf&A&A&C	D 0		.!		./0 ]],
 	?  I>B		? 	? H	:2w!||zz  "w&7777ww~~I;...xx %7$8888!0 0
	? 	?s   #D.DDDc                     t        |       }t        r|j                  dk(  sJ t        |      dk(  sJ |j                  j                         g dk(  sJ y )N	EPSG:4326   )pop_est	continentnameiso_a3
gdp_md_estgeometry)r   r   crsrX   rY   rZ   )naturalearth_lowres_all_extr`   s     r3   test_read_dataframerw      sV    	3	4Bvv$$$r7c>>:: #   r5   c                 D    t        | d   |      }t        |      dk(  sJ y )NrQ   rg   rn   r   rX   )naturalearth_lowres_vsir4   r`   s      r3   test_read_dataframe_vsir{      s$    	/2i	HBr7c>>r5   zcolumns, fid_as_index, exp_len)NF   r|   c                 |    t        | |||      }t        |      t        j                  u sJ t	        |      |k(  sJ y )N)rY   fid_as_indexr4   )r   typepd	DataFramerX   )no_geometry_filerY   r~   r4   exp_lenresults         r3    test_read_layer_without_geometryr      sD     !	F <2<<'''v;'!!!r5   z!naturalearth_lowres, expected_ext).gpkgr   ).shpr   naturalearth_lowres)indirectc                 \    | j                   |k(  sJ t        |       }t        |      dk(  sJ y )Nrn   )suffixr   rX   )r   expected_extr`   s      r3    test_fixture_naturalearth_lowresr      s3     %%555	+	,Br7c>>r5   c                     t        | |d      }t        |t        j                        sJ t        |t        j
                        rJ y )NFr4   read_geometry)r   
isinstancer   r   gpGeoDataFramerv   r4   r`   s      r3   test_read_no_geometryr      s@    	#y
B b",,'''"boo....r5   c                     t        j                  t        d      5  t        | g dd|      }d d d        y # 1 sw Y   y xY w)Nz^at least one of read_geometry or return_fids must be True or columns must be None or non-emptyre   FrY   r   r~   r4   r<   rj   
ValueErrorr   )r   r4   rE   s      r3   (test_read_no_geometry_no_columns_no_fidsr      sF    	#
 
 

 
 
s   6?c                 L   | 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 y )N	test.gpkgr   rQ   rm   rt   ru   T)force_2dmax_featuresr4   )r   r   r&   r   r   ilocrt   has_zr\   r4   filenameexpectedr`   s        r3   test_read_force_2dr      s    +%H 1a.%1a.1{H Hh'		!B771:$$$$		
B wwqz""(((((r5   zGgdal >= 3.5.2 needed to use OGR_GEOJSON_MAX_OBJ_SIZE with a float valuec                     	 t        ddi       t        j                  t        d      5  t	        | |       d d d        t        dd i       y # 1 sw Y   xY w# t        dd i       w xY w)NOGR_GEOJSON_MAX_OBJ_SIZEg{Gz?z:Failed to read GeoJSON data; .* GeoJSON object too complexre   rg   )r
   r<   rj   r   r   )naturalearth_lowres_geojsonr4   s     r3   test_read_geojson_errorr     so    
D!;T BC]]N
 	M 6)L		M 	 !;T BC	M 	M 	 !;T BCs!   (A AA AA A)c                    | dz  }t        j                  t        dd      gd      }|r |j                  j	                  d      |_        t        ||d       t        j                  t        dd      gd      }|r |j                  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        t        |       t        |fdd	i|}t        ||       t        |fddi|}t        ||       y # 1 sw Y   JxY w)Nr   r   rm   r   strlayer1)layerrQ   layer2T)r   appendr&   )r4   r   zMore than one layer foundre   r   )r   r   r&   rY   astyper   nparray_equalr   r<   warnsUserWarningr   r'   )r\   r4   r   	expected1	expected2kwargsr`   s          r3   test_read_layerr     sU   +%H %1+KHI &--44U;	 %1+KHI%--44U;	IxxE>>H7 3h5HI   %a8F 
k)D	E 0H//0 b), 
	;	;F	;Bb), 
	4	4V	4Bb),0 0s   2EEc                     t        j                  t        d      5  t        | d|       d d d        y # 1 sw Y   y xY w)Nz!Layer 'wrong' could not be openedre   wrong)r   r4   )r<   rj   r   r   rv   r4   s     r3   test_read_layer_invalidr   B  s7    	~-P	Q X2'YWX X X   4=c                     t        | |      }t        r&|j                  j                  j                  dk(  sJ y |j                  j                  j                  dk(  sJ y )Nrg   zdatetime64[ms]zdatetime64[ns])r   r   coldtyperq   )datetime_filer4   r`   s      r3   test_read_datetimer   G  sK    		;Bvv||  $4444vv||  $4444r5   z6ignore: Non-conformant content for record 1 in column c                    t        |       }|j                  t        j                  ddg            }ddg}t        r't        j                  |d      j                  d      }nt        j                  |      }t        j                  |d	      }t        |j                  |d
       |dz  }t        |||       t        ||      }|r|j                  j                  d      }t        |j                  |       y )Nr      2020-01-01T09:00:00.123-05:002020-01-01T10:00:00-05:00ISO8601formatmsdatetime_colrq   F)check_indexr   rg   UTC)r   	set_indexr   arrayr   r   to_datetimeas_unitSeriesr)   r   r   dt
tz_convert)datetime_tz_filer\   r4   r`   raw_expectedr   fpathdf_reads           r3   test_read_datetime_tzr   P  s     
(	)B 
bhh1v&	'B35PQL>>,yAII$O>>,/yy7HuE{"EB3Ui8G;;))%0,,h7r5   z;ignore: Non-conformant content for record 1 in column datesc                    ddg}t        j                  t        j                  |      d      }|j                  j	                  d      }|j                  j                  d      }t        r|j                  j                  d      }t        j                  |t        dd      t        dd      gd	d
      }| dz  }t        |||       t        ||      }t        |d   |       y )Nz2023-01-01 11:00:01.111z2023-06-01 10:00:01.111datesr   zAustralia/Sydneyr   r   rQ   r   rt   rm   ru   r   rg   )r   r   r   r   tz_localizer   r   r   r   r   r&   r   r   r)   )	r\   r4   r   	naive_collocalised_colutc_colr`   r   r   s	            r3    test_write_datetime_mixed_offsetr   i  s     '(ABE		"../g>ILL,,-?@M))%0G**$$T*	eAqk5A;-GH
B {"EB3EY7F w1r5   c           	         ddt         j                  g}t        r't        j                  |d      j	                  d      }nt        j                  |      }t        j                  |t        dd      t        dd      t        dd      gdd	      }| d
z  }t        |||       t        ||      }|r!|d   j                  j                  d      |d<   t        ||       y )Nr   r   r   r   r   rQ   r   rm   r   r   rg   r   r   )r   NaTr   r   r   r   r   r&   r   r   r   r   r'   )r\   r4   	dates_rawr   r`   r   r   s          r3   &test_read_write_datetime_tz_with_nullsr     s    
 12MrvvVIy;CCDIy)	eAqk5A;a%LM
B {"EB3EY7Fknn//67b&)r5   c                     | dz  }t        j                  dd d gi      }t        ||       t        ||d      }|d   j	                         j                         sJ y )Nz!test_null_values_no_geometry.gpkgr   Fr   )r   r   r   r   isnaallr   s        r3   test_read_null_valuesr     s]    ==H ||UT4L12HHh'	IU	KB e9>>!!!r5   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                  |       y )
Nr   )r4   skip_featuresr   r   r~   FTr|   fidr   )r   r(   indexr   
RangeIndexIndexr    r   )rv   r4   r   r`   fids_expecteds        r3   test_read_fid_as_indexr     s    $q!LF 
3	>v	>Brxxq!!45	3	R%	R6	RBrxxq!!45	#

 
B
 HHaV%0MY:AABBMrxx/r5   c                     t        | g dd|      }|J t        |      dk(  sJ t        |j                        dk(  sJ y )NFTr   rn   r   )r   rX   rY   r   r4   r`   s      r3   test_read_fid_as_index_onlyr     sM    	
B >>r7c>>rzz?ar5   c                 l   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                  j                               j                  g d
            dk(  sJ t        | |d      }t        |      dk(  sJ |j                  j                         dk\  sJ |j                  j                         dk  sJ t        | |d      }t        |      dk(  sJ y )N r4   wherern   ziso_a3 = 'CAN'rQ   r   CANziso_a3 IN ('CAN', 'USA', 'MEX')r|   r   USAMEXz+POP_EST >= 10000000 AND POP_EST < 100000000K   逖  zISO_A3 = 'INVALID')
r   rX   r   rr   setunique
differencero   minmaxr   s      r3   test_read_wherer    s9   	3yPR	SBr7c>> 
#y@P
B r7a<<771:%%%	#/
B
 r7a<<s299##%&112GHIQNNN 
#;
B
 r7b==::>>x'''::>>i''' 
#y@T
B r7a<<r5   c                    |rH|j                   dk(  r9| j                  j                  t        j                  j                  d             |j                   dk(  r<t        dk\  r3t        j                  t        d      5  t        ||d       d d d        y t        j                  t        d	      5  t        ||d       d d d        y # 1 sw Y   y xY w# 1 sw Y   y xY w)
Nr   zGDAL doesn't error for GPGKrb   )r|      r   zno such columnre   invalidr   zInvalid SQL)r   r:   
add_markerr<   markxfailr   rj   r   r   r   )r2   rv   r4   s      r3   test_read_where_invalidr    s    0777B 1 19V 1 WX"))W49IZ9W]]>1AB 	+y		 	
 ]]:]; 	+y		 		 	
	 	s   >C	1C	CCc                 D    t        | ddg|      }t        |      dk(  sJ y )Nz "iso_a3" = 'CAN' rq   )r   rY   r4   r   ry   r   s      r3   test_read_where_ignored_fieldr    s.    
 
&	
B r7a<<r5   bbox))rQ   )rQ   r   rQ   r   r|   c                     t        j                  t        d      5  t        | ||       d d d        y # 1 sw Y   y xY w)NzInvalid bboxre   r4   r  r   )rv   r  r4   s      r3   test_read_bbox_invalidr    s6    	z	8 T2idST T Tr   zbbox,expected)r   r   h㈵>r     
   PANCRI)i6   7   r   c                     |r.t         dk  r%| j                  dk(  rt        j                  d       t	        | ||      }t        j                  |j                  |      sJ y )Nr|   r  r   r   3GDAL bug: https://github.com/OSGeo/gdal/issues/8347rb   r  )r   r   r<   r  r   r   r   rr   )rv   r4   r  r   r`   s        r3   test_read_bboxr$    sQ     	y('..'9QR	3yt	TB>>"))X...r5   c                     t        | |dd      }t        |      dk(  sJ t        j                  |j                  dg      sJ y )NL2   Z   DSELECT * from naturalearth_lowres where iso_a3 not in ('USA', 'RUS'))r4   r  rA   rQ   r   r   rX   r   r   rr   r   s      r3   test_read_bbox_sqlr-  '  sD    	#!R	
B r7a<<>>"))eW---r5   c                     t        | |dd      }t        |      dk(  sJ t        j                  |j                  dg      sJ y )Nr&  iso_a3 not in ('USA', 'RUS'))r4   r  r   rQ   r   r,  r   s      r3   test_read_bbox_wherer0  2  sD    	#!,	
B r7a<<>>"))eW---r5   maskr&   )r   coordinatesz({"type": "Point", "coordinates": [0, 0]}r
  c                     t        j                  t        d      5  t        | ||       d d d        y # 1 sw Y   y xY w)Nz+'mask' parameter must be a Shapely geometryre   r4   r1  r   )r   r4   r1  s      r3   test_read_mask_invalidr5  =  s9     
z)V	W L*idKL L Lr   c           
          t        j                  t        d      5  t        | |dt	        j
                  dd             d d d        y # 1 sw Y   y xY w)Nz!cannot set both 'bbox' and 'mask're   r  r  r   )r4   r  r1  )r<   rj   r   r   shapelyr&   r   r4   s     r3   test_read_bbox_mask_invalidr9  J  sE    	z)L	M 
"tR(		

 
 
s   $A		Azmask,expectedr  r   r  r  r  r  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 y )Nr"  r   r#  rb   r4  )	r   r   r<   r  r   rX   r   r   rr   )rv   r4   r1  r   r`   s        r3   test_read_maskr@  T  sh    B 	y('..'9QR	3yt	TBr7c(m###>>"))X...r5   c           
          t        | |t        j                  dddd      d      }t        |      dk(  sJ t	        j
                  |j                  dg      sJ y )	Nr'  r(  r)  r*  r+  )r4   r1  rA   rQ   r   r   r7  boxrX   r   r   rr   r   s      r3   test_read_mask_sqlrD    sS    	#[[r4,R	
B r7a<<>>"))eW---r5   c           
          t        | |t        j                  dddd      d      }t        |      dk(  sJ t	        j
                  |j                  dg      sJ y )	Nr'  r(  r)  r*  r/  )r4   r1  r   rQ   r   rB  r   s      r3   test_read_mask_whererF    sS    	#[[r4,,	
B r7a<<>>"))eW---r5   fids)rQ      r  r   c                     t        | |d|      }t        |      dk(  sJ t        j                  ||j                  j
                        sJ y )NT)rG  r~   r4   r|   )r   rX   r   r   r   values)rv   rG  r4   r`   s       r3   test_read_fidsrL    sE     
#$TY
B r7a<<>>$000r5   c                     d}t        |      }t        j                  t        d| d      5  t	        | |d      }d d d        y # 1 sw Y   y xY w)Ni  zerror applying filter for z fidsre   TrG  r4   )ranger<   rj   r   r   )r   nb_fidsrG  rE   s       r3   "test_read_fids_arrow_max_exceptionrQ    sR     G>D	z+EgYe)T	U K.TTJK K Ks   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        y # 1 sw Y   y xY w)N)r   .geojsonz=Using 'fids' and 'use_arrow=True' with GDAL < 3.8 can be slowre      TrN  rQ   )r   r<   r   r   
contextlibnullcontextr   rX   )rv   handlerr`   s      r3   %test_read_fids_arrow_warning_old_gdalrX    sp     #))1FF,,Q

 ((*	 7rddS2w!||  s    A++A4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 y )	Nr   r   rQ   rm   r   )rG  T)r   rG  )r   r   r&   r   r   r'   r   r   r   rt   rK  r7  r   )r\   r   r   r`   s       r3   test_read_fids_force_2drZ    s    +%H 1a.%1a.1{H Hh'	s	+Bb(--"34	4qc	:B>>
G,,X]]2A->-G-G-N-NO  r5   r      c                 4   | j                   }t        |       j                  |d  j                  d      }t        | ||      }t	        |      t	        |      k(  sJ |dv }|dk(  }|dk(  r|s|g d   j                  d      |g d<   t        |||d	| |
       y )NTdropr   r4   rS  	.geojsonlra  r[  )rp   rq   rr   r   Fcheck_less_precisecheck_index_typecheck_dtype	normalizer   r   r   reset_indexrX   r   r'   )rv   r4   r   extr   r`   is_jsonis_jsonss           r3   test_read_skip_featuresrl    s    
%
,
,C23	mn		$	  
#=I
B r7c(m### ..Gk!HI /1+/

&- 	*+ 
"Kr5   c                     t        j                  t        d      5  t        | d|       d d d        y # 1 sw Y   y xY w)Nz'skip_features' must be >= 0re   r_  r   r8  s     r3    test_read_negative_skip_featuresro    s7    	z)G	H S*"	RS S Sr   )r   r  r[  r   d   c                    | j                   }t        |       j                  |||z    j                  d      }t        | |||      }t	        |      t	        |      k(  sJ |dv }|dk(  }t	        |      dk(  rG|sE|d   j                  d      |d<   |d	   j                  d      |d	<   |d
   j                  d      |d
<   t        |||d| |       y )NTr]  )r   r   r4   r`  ra  r   rp   objectrq   rr   Frb  rg  )	rv   r4   r   r   ri  r   r`   rj  rk  s	            r3   test_read_max_featuresrs    s    
 &
,
,C23	mml:	<	$	 
 
##!	
B r7c(m### ..Gk!H
8}) !) 5 < <X F#F+228<%h/66x@
"Kr5   c                     t        j                  t        d      5  t        | d|       d d d        y # 1 sw Y   y xY w)Nz'max_features' must be >= 0re   rn  )r   r4   r   r8  s     r3   test_read_negative_max_featuresru  %  s7    	z)F	G R*yQR R Rr   c                 r   t        j                  t        d      5  t        d|        d d d        t        j                  t        d      5  t        d|        d d d        t        j                  t        d      5  t        d|        d d d        y # 1 sw Y   lxY w# 1 sw Y   GxY w# 1 sw Y   y xY w)NzNo such file or directoryre   znon-existent.shprg   z!does not exist in the file systemz/vsizip/non-existent.zipzzip:///non-existent.zip)r<   rj   r   r   rg   s    r3   test_read_non_existent_filerw  *  s    	.I	J @)Y?@ 
.Q	R H1YGH 
.Q	R G0IFG G@ @H HG Gs#   BB!>B-B!B*-B6c                    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                  j                         g dk(  sJ d}t        | |d|      }t        |j                        dk(  sJ t        |      dk(  sJ |j                  j                         g dk(  sJ d}t        | |d|      }t        |      dk(  sJ t        |j                        dk(  sJ |j                  j                         dk\  sJ |j                  j                         dk  sJ d}t        | |d|      }t        |      d	k(  sJ y )NGSELECT iso_a3 AS iso_a3_renamed, name, pop_est FROM naturalearth_lowresOGRSQLrA   rB   r4      rn   6SELECT * FROM naturalearth_lowres WHERE iso_a3 = 'CAN'rQ      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   rX   rY   r   rr   rZ   ro   r  r  rv   r4   rA   r`   s       r3   test_read_sqlr  6  s    TC	#(i
B rzz?ar7c>> CC	#(i
B r7a<<rzz?a771:%%%7C 
#(i
B rzz?ar7a<<99!6666C 
#(i
B rzz?ar7a<<99!6666CC 
#(i
B r7b==rzz?a::>>x'''::>>i''' GC	#(i
B r7a<<r5   c                    | j                   dk(  r3t        j                  t        d      5  t	        | d|       d d d        n2t        j                  t        d      5  t	        | d|       d d d        t        j                  t
        d      5  t	        | dd|	       d d d        y # 1 sw Y   =xY w# 1 sw Y   IxY w# 1 sw Y   y xY w)
Nr   zIn ExecuteSQL().*re   r
  rA   r4   zSQL Expression Parsing Errorz/'sql' parameter cannot be combined with 'layer'whatever)rA   r   r4   )r   r<   rj   rC   r   r   r   s     r3   test_read_sql_invalidr  r  s    "))W4]]9,?@ 	+i	 	
 ]]9,JK 	+i	
 
K
 
 	'		

 
	 	
	 	

 
s#   B)B5C)B25B>C
c                     d}t        | |dddgd|      }t        |j                        dk(  sJ t        |      dk(  sJ |j                  j	                         g dk(  sJ y )	Nry  rz  iso_a3_renamedrq   z'iso_a3_renamed IN ('CAN', 'USA', 'MEX'))rA   rB   rY   r   r4   r|   r   r   rX   rY   r  rZ   r  s       r3   test_read_sql_columns_wherer    sn    
SC	#!6*7
B rzz?ar7a<<##%)>>>>r5   c           	          d}t        | |dddgdd|      }t        |j                        dk(  sJ t        |      d	k(  sJ |j                  j	                         d
dgk(  sJ y )Nry  rz  r  rq   z iso_a3_renamed IN ('CRI', 'PAN')r  )rA   rB   rY   r   r  r4   r|   r   r  r  r  r  s       r3    test_read_sql_columns_where_bboxr    st    
SC	#!6*0
B rzz?ar7a<<##%%777r5   c                 F   d}t        | |ddd|      }t        |j                        dk(  sJ t        |      dk(  sJ |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 y )NzSELECT *
               FROM naturalearth_lowres
              WHERE iso_a3 IN ('CAN', 'MEX', 'USA')
              ORDER BY namerQ   rz  )rA   r   r   rB   r4   r~  r   z)SELECT * FROM naturalearth_lowres LIMIT 1r|   )rA   r   rB   r4   )rA   rB   r   r4   r   )r   rX   rY   rr   rZ   r  s       r3   test_read_sql_skip_maxr    s    C 
#
B rzz?ar7a<<99%(((
5C	#
B r7a<<
5C	#
B r7a<<r5   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                  |kD  sJ y )
Nr}  r@   r{  rQ   r~  r   r   zSELECT ST_Buffer(geometry, 5) AS geometry, name, pop_est, iso_a3
               FROM naturalearth_lowres
              WHERE ISO_A3 = 'CAN'r|  r   rX   rY   r   rr   rt   arear   r4   rA   r`   area_canadas        r3   #test_read_sql_dialect_sqlite_nogpkgr    s     CC	(i
B r7a<<rzz?a771:%%%''!*%%**K&C 
(i
B r7a<<rzz?a771:##k111r5   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                  |kD  sJ y )
Nr}  INDIRECT_SQLITEr{  rQ   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        r3   !test_read_sql_dialect_sqlite_gpkgr    s     CC	2Cy
B r7a<<rzz?a771:%%%''!*%%**K&C 
2Cy
B r7a<<rzz?a771:##k111r5   c                    | dz  }t        |d|      5 }|j                  d       |j                  d       ddd       t        j                  dgdgd	      }| d
z  }t	        ||||       t        ||      5 }|j                         }ddd       t        ||      5 }|j                         }	ddd       	k(  sJ t        |d      5 }|j                         }
ddd       t        |d      5 }|j                         }ddd       
k(  sJ y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   zxY w# 1 sw Y   ZxY w# 1 sw Y   AxY w)zjTest if write_dataframe uses the default encoding correctly.

    Arrow only supports utf-8 encoding.
    rJ   rK   rL   rN   rO   NrU   rT   )rR   rS   ztest_pyogrio.csvrP   rb)rV   rW   r   r   r   read)r\   rM   r]   r^   r_   r`   csv_pyogrio_pathcsv_strcsv_pyogriocsv_pyogrio_str	csv_bytescsv_pyogrio_bytess               r3   test_write_csv_encodingr    sZ     *$H	hh	/ 03		.!		./0 
!3 4ykJ	KB"44B(8uM 
h	* c((*		2 -k%**,-o%%% 
h	 HHJ			% /',,./))))/0 0 - - / /s;   #D:D D*D61EDD'*D36D?Ez ext, fid_column, fid_param_value))r   r   N)r   FIDN).sqliteogc_fidN)r   
fid_customr  )r   
FID_customr  )r  ogc_fid_customr  c                 D   t        j                  |dgit        j                  dd      gd      }i }|||d<   | d| z  }t	        ||fd|i| |j                         sJ t        |d	|
      }|j                         }|j                  |di      }	t        ||	       y)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.
    rH  r   z	epsg:4326r   Nr   testr4   T)r~   r4   )rY   )
r   r   r7  r&   r   existsr   rh  renamer'   )
r\   ri  
fid_columnfid_param_valuer4   	input_gdfr   rD   
output_gdfexpected_gdfs
             r3   test_write_custom_fidsr  4  s    . 	aSW]]1a%8$9{I F"'uSEl"DItCyCFC;;==49MJ'')J ##Z,?#@Lj,7r5   ri  c                    t        |      }| d| z  }|dk(  rt        |||d       nt        |||       |j                         sJ t        |      }|j                  j                  j                         }t        |   t        v rt        |      dgk(  sJ t        |      ddhk(  sJ |dv }|d	k(  }	t        |||d| |	
       y )Nr  .fgbFr4   spatial_indexrg   MultiPolygonPolygonr`  ra  rb  )r   r   r  rt   r   r  r   r   listr  r'   )
r\   r   ri  r4   r  output_path
result_gdfgeometry_typesrj  rk  s
             r3   test_write_dataframer  ^  s     23ItC5\)K
f}{iu	
 		;)D,J((--446Ns|44N#'7777>"~y&AAAA ..Gk!H"Kr5   zignore:.*No SRS set on layer.*write_geodf.xlsxr  c           	         t        |d      }|rt        j                  |      }|d| z  }|dk(  r|j                  d      }|dk7  r	t        |   nd}t        ||||       |j                         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                  j                  |	|d|
       yt        j                  |t        j                  dt        |            d      }t        |	|d|
       y)zTest writing a (geo)dataframe without a geometry column.

    FlatGeobuf (.fgb) doesn't seem to support this, and just writes an empty file.
    F)r   r  r   z.dbfr  XLSX)r4   driver)rS  ra  r  )r   r   r  )rd  re  N  r   )r   r   r   with_suffixr   r   r  r   r   r   testingassert_frame_equalr   repeatrX   r'   )r2   r\   r   r  ri  r4   input_dfr  r  	result_dfre  input_none_geom_gdfs               r3   test_write_dataframe_no_geomr    s?    1GH??8,tC5\)K f}!--f5 !G^WS\FHkYvN{+Ii... ??K
((i999h0||H-H


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

 !ooryys8}=4
 	""#		
r5   c                     t        |      }|j                  d      }| dz  }t        |||       t        |      }t        |j                  t
        j                        sJ t        ||j                  d             y )Nrr   test.shprg   Tr]  )	r   r   r   r   r   r   r   r'   rh  )r\   r   r4   r  r  r  s         r3   test_write_dataframe_indexr    sq     23I##H-IZ'KI{i@,Jj&&666j)*?*?T*?*JKr5   ra  zcolumns, dtypecol_int	col_float
col_objectc                    t        j                  g ||d      }| d| z  }t        |||       |j                         sJ t	        ||      }t
        rdnd}|r|t        u r|d   j                  d      |d<   t        |||	       y
)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.
    r  )rt   rY   r   ru   r  rg   TFr  r   rd  N)	r   r   r   r  r   r   rr  r   r'   )	r\   ri  rY   r   r4   r   r   r`   rd  s	            r3   test_write_empty_dataframer    s    " G5dSHD,&HHh)<??	I	6B
  ,t Uf_!),!7!>!>u!Eb(=MNr5   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        |j                         sJ t        |      }t        ||       y # 1 sw Y   3xY w)Nxr   zPOINT EMPTYr  r   r   errorignorez'crs' was not provided.)message)r   r   r%   warningscatch_warningssimplefilterr   r   filterwarningsr   r  r   r'   )r\   r   r   r`   s       r3   test_write_empty_geometryr    s    aSzHm_4MSWXH+%H 
	 	 	" ,g{3##H6OP(+	,
 ?? 
	!Bb(+, ,s   AB55B>c                    t        j                  ddgit        dd      gd      }| dz  }t        |||       |j	                         sJ t        ||      }t        r5|r3|j                  j                  dk(  sJ |d   j                  d      |d<   n|j                  j                  t        k(  sJ t        ||       y)	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   r  r   r   rg   r   )r   r   r&   r   r  r   r   r  r   r   rr  r'   )r\   r4   gdfr   r  s        r3   test_write_None_string_columnr     s     //<$0E!QK=d
SC+%HCY7??I>J	$$**e333-44U;L$$**f444j#.r5   	.geojsonsc                     t        j                  g d      }| d| z  }t        |||       |j                         sJ t	        j
                  t        d      5  t        ||      }d d d        y # 1 sw Y   y xY w)Nr  r   r  rg   z9.* not recognized as( being in)? a supported file format.re   )r   r   r   r  r<   rj   rC   r   )r\   ri  r4   r   r   rE   s         r3   +test_write_read_empty_dataframe_unsupportedr    su     5HD,&HHh)<??	T
 : 8y9: : :s   A22A;c                    t        |      }| dz  }t        ||dd|       |j                         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 y )Nr   firstT)r   promote_to_multir4   r  second)r   r   r  r   r   r   )r\   r   r4   r  r   s        r3   )test_write_dataframe_gpkg_multiple_layersr  (  s    23I+%H ??>>+h/7N2K1LMMM >>H
>	"X~$>?  r5   c                 
   |dk(  rt         dk  rt        j                  d       |dv rt         dk  rt        j                  d       |rJ|j                  d      r9| j                  j                  t        j                  j                  d	             t        |      }|d
| z  }t        |||       |j                          t        t        |            dk(  sJ t        |||d       t        t        |            dk(  sJ y )Nr  )r|   rH  r   z,Append to FlatGeobuf fails for GDAL <= 3.5.0)ra  r  r|   r~  r   z5Append to GeoJSONSeq only available for GDAL >= 3.6.0rS  z.Bugs with append when writing Arrow to GeoJSONrb   r  rg   rn   T)r4   r   ib  )r   r<   r=   
startswithr:   r  r  r  r   r   r  rX   )r2   r\   r   ri  r4   r  r   s          r3   test_write_dataframe_appendr  E  s     f})Y6BC
((-=-JKLS^^J/ 	KK%UV	
 23ID,&HIx9=OO~h'(C///Ix9TJ~h'(C///r5   r  c                 *   t        |      }| dz  }t        ||||rdnd       |j                         du sJ | dz  }|j                         |u sJ | dz  }t        |||d|i	       |j                         du sJ | d
z  }|j                         |u sJ y )Nz	test1.shpYESNO)r4   SPATIAL_INDEXTz	test1.qixz	test2.shpr  )r4   layer_optionsz	test2.qix)r   r   r  )	r\   r   r  r4   r`   outfilename1index_filename1outfilename2index_filename2s	            r3   !test_write_dataframe_gdal_optionsr  a  s    
 
+	,Bk)L
,e$	  D(((,O!!#}444 k)L
&6	  D(((,O!!#}444r5   c                     t        |      }| dz  }t        j                  t        d      5  t	        |||d       d d d        y # 1 sw Y   y xY w)Ntest.geojsonz#unrecognized option 'SPATIAL_INDEX're   Tr  r   r<   rj   r   r   )r\   r   r4   r`   outfilenames        r3   )test_write_dataframe_gdal_options_unknownr    sO    	+	,B ^+K	z)N	O RK9DQR R R   AAc                     dd l }|j                  |       }|j                         }|j                  d       |j	                         }|D cg c]  }|d   	 c}S c c}w )Nr   z2SELECT name FROM sqlite_master WHERE type='table';)sqlite3connectcursorexecutefetchall)rD   r  conr  r   ress         r3   _get_gpkg_table_namesr    sO    
//$
CZZ\F
NNGH__F$%sCF%%%s   A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 y )Nztest_default.gpkgrg   gpkg_ogr_contentsztest_no_contents.gpkgr  )r4   ADD_GPKG_OGR_CONTENTSztest_no_contents2.gpkgadd_gpkg_ogr_contentsF)r4   dataset_options)r   r   r  )r\   r   r4   r`   test_default_filenametest_no_contents_filenametest_no_contents_filename2s          r3   )test_write_dataframe_gdal_options_datasetr    s    	+	,B$'::B-C"78M"NNNN (+B B
!Yd &;<U&VVVV!),D!D
"0%8	 &;<V&WWWWr5   zFext, promote_to_multi, expected_geometry_types, expected_geometry_typer  r  UnknownrS  c                    t        |      }| d| z  }t        ||||       |j                         sJ t        |      }	t        |	j                  j
                  j                               }
|
|k(  sJ t        |      d   |k(  sJ y )Ntest_promote)r4   r  geometry_type)r   r   r  sortedrt   r   r  r	   )r\   r   ri  r  expected_geometry_typesexpected_geometry_typer4   r  r  r  r  s              r3   %test_write_dataframe_promote_to_multir    s    * 23I|C511K;)FV ,JJ//44;;=>N4444[!/26LLLLr5   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        |	j                         sJ t        |	      }t        |j                  j                  j                               }||k(  sJ t        |	      d   |k(  sJ y # 1 sw Y   nxY w)Ntest_promote_layer_geom_typer   )r  r&   z+A geometry of type MULTIPOLYGON is insertedre   r4   r  r  r  )r   r<   r   RuntimeWarningrU  rV  r   r  r  rt   r   r  r	   )r\   r   ri  r  r  r  r  r4   r  r  ctxr  r  s                r3   5test_write_dataframe_promote_to_multi_layer_geom_typer    s    F 23I;C5AAK
g~-+??ll"O
 $$&	 
-'	

 ,JJ//44;;=>N4444[!/26LLLL
 
s   CCz;ext, promote_to_multi, geometry_type, expected_raises_match))r  Fr  Mismatched geometry type)r  Fr  r  )r  Nr&   r  )r  Nr  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        y # 1 sw Y   y xY w)Nr  re   r  )r   r<   rj   r   r   r   )	r\   r   ri  r  r  expected_raises_matchr4   r  r  s	            r3   =test_write_dataframe_promote_to_multi_layer_geom_type_invalidr    s_    4 23ItC5\)K	n5=R	S 
-'	

 
 
s   AAc                     t        |      }| dz  }t        j                  t        d      5  t	        |||d       d d d        y # 1 sw Y   y xY w)Nr  z,Geometry type is not supported: NotSupportedre   NotSupportedr4   r  )r   r<   rj   r   r   )r\   r   r4   r`   r   s        r3   ,test_write_dataframe_layer_geom_type_invalidr#  4  sT     
+	,B.(H	K
 Y 	H	XY Y Yr  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       y )Nr   r   r   rQ   rQ   rQ   r   )r   r   )r|   r|   r|   r   )      ?       @      @g      @g      @g      @rm   r   r  r  Fr  rg   r  r  T)check_geom_type)r7  r&   
LineStringrC  
MultiPointMultiLineStringr  r   r   r   r	   r   r'   )r\   ri  r4   rt   r`   r   r   s          r3    test_write_dataframe_truly_mixedr.  A  sP    	aFF+,Aq!QGMM!Q/q!1DEF 0173E3EvvFV3WX	
 	gkk!Q15w{{1aA7NOP	H 
	./(
B D,&H
f}H	OH	: X/9<<<H%Ffb$?r5   c                 R   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        y # 1 sw Y   y xY w)Nr   )r'  r(  r)  r   r%  r&  rQ   rm   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.re   r  rg   )r   r   r7  r&   r+  rC  r<   rj   r   r   r   )r\   r4   r`   msgs       r3   (test_write_dataframe_truly_mixed_invalidr1  a  s    
 
	 MM!Q/0KK1a#

 
B	G  
n5S	A HHz1YGH H Hs   BB&geomsrQ   r   c                     | d| z  }t        j                  dddgi|d      }t        |||       t        |      }t	        ||       y )Nr  r   r'  r(  rm   r   rg   )r   r   r   r   r'   )r\   r2  ri  r4   r   r`   r   s          r3   .test_write_dataframe_infer_geometry_with_nullsr4  |  sO     D,&H	%#s,u+	NBBI6H%Ffb)r5   z=ignore: You will likely lose important projection informationc                    t        |      }|j                  |j                  dk(     j                  d      j	                  d      }| dz  }t        |||       |j                         sJ t        |      }|j                  j                         }|d   dk(  sJ |d	   d
k(  sJ |d   dk(  sJ |j                  j                  |j                        sJ y )NBelgiumTr]  z,+proj=aea +lat_1=49.5 +lat_2=51.5 +lon_0=4.3r  rg   lat_1g     H@lat_2g     I@lon_0g333333@)
r   locrq   rh  to_crsr   r  ru   to_dictequals)r\   rv   r4   r`   r   r   ru   s          r3   test_custom_crs_ior>    s     
3	4B 	rww)#$	$		>	? 
 *$HHh)<??		!B
&&..
Cw<4w<4w<366==&&&r5   )	.gpkg.zipz.shp.zipz.shzc                    |dk(  rt         st        j                  d       t        |      }| d| z  }t	        |||       |j                         sJ t        |      }|j                  j                  j                         }t        |   t        v rt        |      dgk(  sJ t        |      ddhk(  sJ t        ||d       y	)
zBRun a basic read and write test on some extra (zipped) extensions.r?  z&.gpkg.zip support requires GDAL >= 3.7r  rg   r  r  Fr  N)r   r<   r=   r   r   r  rt   r   r  r   r   r  r  r'   )r\   r   ri  r4   r  r  r  r  s           r3   test_write_read_zipped_extrA    s     k*<=23ItC5\)KI{i@,J((--446Ns|44N#'7777>"~y&AAAAj)eLr5   c                    dddt        j                         d t        j                  g}|D cg c]  }t	        j
                  dd       }}t        j                  ||dd      }| dz  }t        ||       t        |      }t        |      t        |      k(  sJ t        j                  |D cg c]#  }|d t        j                  fvrt        |      nd % c}d	
      }t        |d	   |       y c c}w c c}w )Nr  r'  rQ   r   rt   mixed
epsg:31370r   test_write_mixed_column.gpkgrD  r   )r   nowr   nanr7  r&   r   r   r   r   rX   r   r   r   r)   )	r\   mixed_valuesrE   r2  test_gdfr  r  valuer   s	            r3   #test_write_read_mixed_column_valuesrL    s    CHLLND"&&AL*67QW]]1a 7E7\2H ;;KHk*,Jx=C
O+++ yyJVWuT266N2U	<WH 
7+X6 8 	Xs   C/.(C4c                 ^   dddt        j                         d t        j                  g}|D cg c]  }t	        j
                  dd       }}t        j                  ||dd      }| dz  }t        j                  t        d	
      5  t        ||d       d d d        y c c}w # 1 sw Y   y xY w)Nr  r'  rQ   r   rC  rE  r   rF  z.*Conversion failed for columnre   Trg   )r   rG  r   rH  r7  r&   r   r   r<   rj   	TypeErrorr   )r\   rI  rE   r2  rJ  r  s         r3   )test_write_read_mixed_column_values_arrowrO    s     CHLLND"&&AL*67QW]]1a 7E7\2H ;;K	y(H	I ?+>? ? 8
? ?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 y )Nztest_write_nan.gpkgr   r'  r  )rt   float64
object_strrE  r   rg   rQ  rQ   r   rR  )r7  r&   r   rH  r   r   r   r   rX   r   r   )r\   r4   r  geom	test_datarJ  r  s          r3   test_write_read_nullrU    s(   22K==AD4&rvv&tRVV,I
 yl;HHkY?,Jx=C
O+++i #s***77:i(+,,,77:i(+,,,l#A&&00077:l+A.///77:l+A.///r5   c                     | \  }}d|j                    }t        ||      }t        |      dk(  sJ 	 t        |||       t        ||      }t        |      dk(  sJ 	 t	        |       y # t	        |       w xY w)N/vsimem/rg   rn   )rq   r   rX   r   r   )rz   r4   rD   rE   mem_pathinputr   s          r3   test_write_read_vsimemrZ    sy    %GD!$))%H495Eu:x9=I>6{c!!!8
8s   +A+ +A8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 ](  }t        ||||       t	        |      }t        ||       * y )Nztest.fgbrm   r   r"  )r   r   r%   r   r   r'   )r\   wkt
geom_typesr4   r   r  	geom_typer`   s           r3   test_write_geometry_z_typesrd  	  sU    . *$H
//8SE?
DC +	X)TH%!"c*+r5   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(  r/|dv rt        j                  d| d|        n|dk(  rd}n|dk(  rd}i }|gt        |      z  |d	<   t        t        |            D cg c]  }t	        |       c}|d
<   t        j                  |t        |      d      }	| d| z  }
|dk(  r?|	j                  |	j                  j                         |	j                  j                  z      }	|rBt        |   t        v r3t        j                  t        d      5  t!        |	|
|       d d d        y t!        |	|
|       t#        |
      }|d   |k(  sJ t%        |
      }|dk(  rd|_        t)        |	|       y c c}w # 1 sw Y   y xY w)Nr   )r_  r  zext z doesn't support r]  r[  r^  r\  
test_descridxrm   r   r  r  z0Mixed 2D and 3D coordinates are not supported byre   rg   r  ra  )r<   r=   rX   rO  r   r   r   r%   r:  rt   r   is_emptyr   r   rj   r   r   r	   r   ru   r'   )r\   ri  rf  exp_geometry_typemixed_dimensionsra  r4   column_datarg  r  r   infor  s                r3    test_write_geometry_z_types_autorm  (  s   l f} CCKK$se#45F4GHI"55 ."22 +K!+s3x 7K.3CHo>s#c(>K
//+;
OCD,&H
f} gg))+cll.C.CCDEGCL,GG]]E
 	@ CY?		@
 	X;XD $5555)J
k$
c:.5 ?	@
 	s   E/E44E=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                 z   |dk(  rt         st        j                  d       |dk(  r0t        j                  t        j
                  j                  |      }nC|dk(  rt        j                  |      }n'|dv rt        j                         }nt        d|       d}| d	z  }t        |d
      5 }|j                  |      }	d d d        |5  t        |||      }
||
j                  j                  d   *J |
j                  j                  d   j                   |k(  sJ d d d        y # 1 sw Y   hxY w# 1 sw Y   y xY w)Nrp  z.on_invalid=fix not available for Shapely < 2.1ro  re   rn  )rp  r  zunknown value for on_invalid: a>  {
        "type": "FeatureCollection",
        "features": [
            {
                "type": "Feature",
                "properties": {},
                "geometry": {
                    "type": "Polygon",
                    "coordinates": [ [ [0, 0], [0, 1] ] ]
                }
            }
        ]
    }r  rK   )r4   
on_invalidr   )r   r<   r=   rj   r7  errorsGEOSExceptionr   rU  rV  r   rV   rW   r   rt   r   ra  )r\   r4   rr  r  expected_wktrW  invalid_geojsonr   frE   r`   s              r3   test_read_invalid_poly_ringrx    s7     U=DEW-- < <GL	v	,,W-	(	(((*9*FGG	O .(H	h	 %GGO$% 
 	;!

 ;;##A&...;;##A&**l:::	; 	;% %	; 	;s   ,D%AD1%D.1D:c                 <   |rYt        j                  d       t        j                  t        j                  j
                        5  t        | d       d d d        y t        |       }|j                  j                  j                         dgk(  sJ y # 1 sw Y   y xY w)Nz5Shapely + GEOS 3.13 crashes in from_wkb for this caseTrg   r  )
r<   r=   rj   r7  rs  rt  r   rt   r   rZ   )multisurface_filer4   r`   s      r3   test_read_multisurfacer{    s     	KL]]7>>778 	> ,=	> 	>
 -. {{&&(^,<<<<	> 	>s   BBc                 x   t        | |      }t        j                  dgdgdt        j                  dd      gd      }t
        r|r|d   j                  t              |d<   t        ||       t        | |d	
      }t        j                  dgdgdt        j                  dd      gd      }t        ||       y )Nrg   Az{ "bottom_level": "B" })	top_levelintermediate_levelr   rm   r   r  r  )r4   FLATTEN_NESTED_ATTRIBUTESB)r~  intermediate_level_bottom_level)	r   r   r   r7  r&   r   r   rr  r'   )nested_geojson_filer4   r`   r   s       r3   test_read_dataset_kwargsr    s    	+y	AB#<"=	
 --1%&H y *22F)G)N)Nv)V%&b(+	yE
B 03u	
 --1%&H b(+r5   c                     t        j                  t        d      5  t        | |d       d d d        y # 1 sw Y   y xY w)Nz$does not support open option INVALIDre   r  )r4   INVALID)r<   r   r  r   r8  s     r3    test_read_invalid_dataset_kwargsr    s7    	n,R	S P*iO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        |      }|j                         }|d   j                  d      |d<   |d   j                  d      |d<   |d   j                  d      |d<   |d   j                  d      |d<   d |j                  d<   t        ||       y )Nztest_nullable_dtypes.gpkgr  int64rI  )rQ   r   NInt64)g?Ng333333?Float32)TFNboolean)aNbstring)col1col2col3col4col5r   r|   rE  r   rg   r  rQ  r  float32r  r  r   )rQ   r  )r   r   r   r   r7  r&   r   r   copyr   r:  r'   )r\   r4   rD   rT  r  r  r   s          r3   test_write_nullable_dtypesr    s-   11D		)73		,g6		*)<		-Y?		*(;I W]]1a01A5<I Ity9%J ~~H'..y9HV'..y9HV'..y9HV'..u5HV"HLLj(3r5   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 y )Nlevelr   r4   r  r  )r   r   r	   )r\   r   r  r4   r  r`   r   metadata_keys           r3   test_metadata_ior    sc    
 'H	+	,B+%HBSIS-9RS'4
'B#LX|,888r5   r  r  r  keyc                     t        |      }t        j                  t        d      5  t	        || dz  fd|i||i d d d        y # 1 sw Y   y xY w)Nzmust be a stringre   r   r4   r  )r\   r   r  r  r4   r`   s         r3   test_invalid_metadatar  $  sZ     
+	,B	z);	< 
;&	
2;	
@Mx?X	

 
 
s   AAc                 x    | dz  }t        t        |      |fd|i|ddii |dk(  rdn|}t        |      |   J y)zmetadata is silently ignoredr  r4   r  rK  r  r  N)r   r   r	   )r\   r   r  r4   r   r  s         r3   test_metadata_unsupportedr  8  sg    
 .(H*+  5'*
+	 (5
'B#LX|,444r5   zArrowDtype requires pandas 1.5+c                 Z   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   j                  d      |d<   t        ||       y )Npyarrowr   r   r'  r(  rQ   rm   r   Ttypes_mapperc                 ,    t        j                  |       S r0   )r   
ArrowDtype)pa_dtypes    r3   <lambda>z2test_read_dataframe_arrow_dtypes.<locals>.<lambda>Y  s    R]]8-D r5   )r4   arrow_to_pandas_kwargsrQ  )r<   importorskipr   r   r&   r   r   r   r   r   r  r   r'   )r\   r   r`   r   s       r3    test_read_dataframe_arrow_dtypesr  J  s     	"+%H		c
uQ{D&9{
B B!D 
F fUm))2==9995M((3F5Mfb)r5   )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k7         y )Nr  r  Fr  TFTFTr   rH  bool_colrt   rm   r   Trg   r   )re  )r   r   r&   r   r   r'   )r\   ri  r   r   r`   r   s         r3   test_arrow_bool_roundtripr  a  s~     D,&HF
f}"'	5E!QK=STCTU
B
 B+F+H5FfbcVmDr5   c                 :   | d| z  }t        j                  g dt        dd      gdz  dd      }t        ||       |dv r@t	        j
                  t        d	
      5  t        |d       d d d        t        |dg        y t        |d      }y # 1 sw Y   &xY w)Nr  r  r   rH  r  rm   r   >   r  r   zLGDAL < 3.8.3 does not correctly read boolean data values using the Arrow APIre   Trg   )r4   rY   )r   r   r&   r   r<   rj   RuntimeErrorr   )r\   ri  r   r`   rE   s        r3   test_arrow_bool_exceptionr  z  s     D,&H	5E!QK=STCTU
B
 B!
]]
 	5
 8t4	5 	x4< 8t4	5 	5s   BBz"ignore:File /vsimem:RuntimeWarningr  GeoJSONGPKGc                     t        |       }t               }t        |||d       t        |j	                               dkD  sJ t        |      }t        |      t        |      k(  sJ |dk(  }t        |||d|        t        dd	      g k(  sJ y )
Nr  r  r   r   r  F)rc  rd  re  rW  	pyogrio_*pattern)r   r   r   rX   	getbufferr'   r   )r   r  r`   bufferactualrj  s         r3   test_write_memoryr    s     
+	,BYFBvV<v!"Q&&&F#Fv;#b'!!!	!G
"K 
K8B>>>r5   c                     t        |       }t               }t        j                  t        d      5  t        |j                  d      |d d       d d d        t        dd      g k(  sJ y # 1 sw Y   xY w)	Nz2driver must be provided to write to in-memory filere   rQ   r  r  rW  r  r  )r   r   r<   rj   r   r   headr   r   r`   r  s      r3   !test_write_memory_driver_requiredr    sn    	+	,BYF	B
 G 	
F4vF	G 
K8B>>>G Gs   A++A4zESRI ShapefileOpenFileGDBc                    |dk(  rt         dk  rt        j                  d       t        |       }t	               }t        j
                  t        d|       5  t        |||d       d d d        t        dd	
      g k(  sJ y # 1 sw Y   xY w)Nr  r  z:OpenFileGDB write support only available for GDAL >= 3.6.0z/writing to in-memory file is not supported for re   r  r  rW  r  r  )	r   r<   r=   r   r   rj   r   r   r   r   r  r`   r  s       r3   $test_write_memory_unsupported_driverr    s    #3i#?PQ	+	,BYF	KF8T
 A 	F6@A 
K8B>>>A As   BBc                     t        |       }t               }t        j                  t        d      5  t        |j                  d      ||dd       d d d        t        dd	      g k(  sJ y # 1 sw Y   xY w)
Nz+append is not supported for in-memory filesre   rQ   r  T)r  r   r   rW  r  r  r   r   r<   rj   NotImplementedErrorr   r  r   r  s       r3   $test_write_memory_append_unsupportedr    sq    	+	,BYF	#P
 V 	
F6PTUV 
K8B>>>V Vs    A,,A5c                     t        |       }t        d      }t        j                  t        d      5  t        |j                  d      |dd       d d d        t        dd	
      g k(  sJ y # 1 sw Y   xY w)Ns   0000z5writing to existing in-memory object is not supportedre   rQ   r  r  r  rW  r  r  r  r  s      r3   &test_write_memory_existing_unsupportedr    sq    	+	,BWF	E
 L 	
F9FK	L 
K8B>>>L Ls   A,,A5c                 H   t        |      }t        j                  t        d      5  t	        | dz  d      5 }t        |j                  d      |       ddd       ddd       t        j                  t        d      5  t        | dz  d      5 }|j	                  dd      5 }t        |j                  d      |       ddd       ddd       ddd       t        d	d
      g k(  sJ y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   DxY w# 1 sw Y   HxY w# 1 sw Y   LxY w)zEVerify that writing to an open file handle is not currently supportedz3writing to an open file handle is not yet supportedre   r  wbrQ   Nztest.geojson.ziprK   rW  r  r  )	r   r<   rj   r  rV   r   r  r   r   )r\   r   r`   rw  zs        r3   test_write_open_file_handler    s    
+	,B 
#X
 + (^+T2 	+aBGGAJ*	++ 
#X
 / X 22C8 	/A, /
A./	// 
K8B>>>	+ 	++ +/ /	/ 	// /s^   C4C(C4>DD!D =DD(C1	-C44C= D	DD	DD!gpkggeojsonc           	      j   |\  }}| d| z  }t        j                  ||gdt        dd      gid      }t        |||       t	        j
                  t              5  t        |       ddd       t        ||      }|j                  d   |k(  sJ ||   j                  d   |k(  sJ y# 1 sw Y   BxY w)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.rt   r   rm   r   rL   N)
r   r   r&   r   r<   rj   UnicodeDecodeErrorr   rY   rK  )r\   ri  encoded_textrM   textr  r`   r  s           r3   test_non_utf8_encoding_ior  
	  s     "NHduSE]*K	$
U1a[MB	TBBh7 
)	* ${#$ K(;F>>!$$$$<q!T)))$ $s   B))B2c           	      v   |\  }}| d| z  }t        j                  ||gdt        dd      gid      }t        |||       t	        j
                  t              5  t        |       d d d        t	        j
                  t        d      5  t        ||d	
       d d d        y # 1 sw Y   <xY w# 1 sw Y   y xY w)Nr  rt   r   rm   r   rL   z-non-UTF-8 encoding is not supported for Arrowre   TrP   )	r   r   r&   r   r<   rj   r  r   r   )r\   ri  r  rM   r  r  r`   s          r3   )test_non_utf8_encoding_io_arrow_exceptionr  '	  s     "NHduSE]*K	$
U1a[MB	TBBh7 
)	* ${#$ 
I
 G 	{XFG G$ $G Gs   B#B/#B,/B8c           	      D   |\  }}| dz  }t        j                  ||gdt        dd      gid      }t        |||       t	        ||      }|j
                  d   |k(  sJ ||   j                  d   |k(  sJ |j                  d      j                          |j                  |      j                  d	      }|r2t        j                  t        d
      5  t	        |d       d d d        n8t	        |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 y # 1 sw Y   |xY w)Nr  rt   r   rm   r   rL   rg   z.cpgz
ISO-8859-1zCThe file being read is not encoded in UTF-8; please use_arrow=Falsere   TFrP   )r4   ENCODING)r   r   r&   r   r   rY   rK  r  unlinkencodedecoder<   rj   r   )
r\   r  r4   rM   r  r  r`   r  miscodedbads
             r3   #test_non_utf8_encoding_io_shapefiler  :	  s   !NHdZ'K	$
U1a[MB	TBBh7
 K9=F>>!$$$$<q!T))) F#**, {{8$++L9H]]W
 	8 ;$7		8 	8 [E:{{1~)))8}##A&(222 K(iPF>>!$$$$<q!T))) K9xPF>>!$$$$<q!T)))%	8 	8s   FFc                     t        j                  t        d      5  t        | dd|       ddd       y# 1 sw Y   yxY w)z^Providing both encoding parameter and ENCODING open option
    (even if blank) is not allowed.z<cannot provide both encoding parameter and "ENCODING" optionre   CP936r   )rM   r  r4   Nr   r8  s     r3   -test_encoding_read_option_collision_shapefiler  f	  s>     
X
 
 	'B)	

 
 
s   5>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       y# 1 sw Y   yxY w)zhProviding both encoding parameter and ENCODING layer creation option
    (even if blank) is not allowed.r  rt   r   rm   r   zKcannot provide both encoding parameter and "ENCODING" layer creation optionre   r  r   )rM   r  N)r   r   r&   r<   rj   r   r   )r\   r  rM   r  r  r`   s         r3   4test_encoding_write_layer_option_collision_shapefiler  r	  s{     "NHdZ'K	$
U1a[MB	TB	
 	
 	hz2>N	
	
 	
 	
s   A((A1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 y )Nr  r  u   中文rt   r   rm   r   rL   zselect * from test where "z" = ''r  )rA   rM   r4   )r   r   r&   r   r   rY   rK  )r\   r4   rM   r  mandarinr`   r  s          r3   $test_non_utf8_encoding_shapefile_sqlr  	  s    HZ'KH		8Z%1+7[
B Bh7)(6(1EF
 >>!((((""1%111)(6(1E	F >>!((((""1%111r5   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t               v rt        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 y y )Nr        (   r(  <   rm   r   ztest.kml	tmp_layerKML)r   r  r4   rg   LIBKML   r  	   r	     T)r   r  r4   r   )r4   r   )
r&   r   r   r   r   r   r   rt   rK  r   	r\   r4   pointsr  r  gdf_inpoints_append
gdf_appendgdf_in_appendeds	            r3   $test_write_kml_file_coordinate_orderr   	  s    BmU2r]E"bM:F
//6{
;CZ'K[EY K9=F>>&//00&999<>! q!eArlE"bMB__mM
	
 )9t
 ~~o66==v?UVVV) "r5   c           	      &   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 y )Nr  r  r  r  r(  r  rm   r   r  r  r  T)r   r  RFC7946r4   rg   F   P   r*  rp  n   x   )r   r  r  r4   r   )	r&   r   r   r   r   r   r   rt   rK  r  s	            r3   &test_write_geojson_rfc7946_coordinatesr  	  s    BmU2r]E"bM:F
//6{
;C^+K K9=F>>&//00&999 2r]E"cNE#sODM-[IJ %[IFO>>/22996M;QRRRr5   )rU  rh   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<   r*   r   pandasr   geopandas.arrayr%   r7  shapely.geometryr&   geopandas.testingr'   pandas.testingr(   r)   ImportErrorr  fixturer1   r4   r>   rF   r  parametrizera   skipifri   upperrk   rw   r{   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r  r  r  r  r$  r-  r0  r5  r9  rC  r  GeometryCollectionr@  rD  rF  r   r  rL  rQ  rX  rZ  rl  ro  rs  ru  rw  r  r  r  r  r  r  r  r  r  r  r  r  rQ  rr  r  r  r  r  r  r  r  r  r  r  r  r  r  r#  r.  r1  r4  r>  rA  rL  rO  rU  rZ  rd  rm  rx  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  )ri  s   0r3   <module>r     s           	 	 	 X W K K   	(&;   K   
T!56 > >  Wd*>?	55. F!'')W45  9	92 
 $'7"dAUTU&W
"
" ')*#$  

/
")* OT  	D		D)-XX
5 TU%%8 & V8. A %%2 &2* A %%* &*&
"0(
 "J" !:;T <T
 	!2&	UEN+	w'
/
/.. 
!Q02LL

 	tR	 5'*	S!S"	%u~6GOO&(9:&(9:&(:;&(:;&(:;&(9:	 "	
 'G&&tR(+'++c1c2*FG "		
!4/54/&.. *hbhhz.R!ST1 U1 K K 	!*O   $ 2s)4! 5!HS
 ,7"c3& 4 8&RR
	G9x
.?8 #L /SwS/#$  
2 2. G90E/F  2 22 Wd*BC	 * *F &
 %%8 &
8< )%%" & *"J <=u6G90D Vv VW%%2
 & X 7 >2
j %%
L &
L  SC{<R ST	T

bhh


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

 ^ "23	

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