
    jjT                     &   S SK r S SKJr  S SKrS SKrS SKrS SK	J
r
  S SKrS SKJr  S SKJr  S SKJr  S SKJrJr  / SQr " S	 S
5      r " S S5      r    S'S jrSSS.S\
\R0                     S\S\S-  S\\R6                  \R8                  4   4S jjrS(S jrS rS r S r!S r"S r# S(SSSS.S\
\R0                     S\$S-  S\S\S-  S\$S\\R6                  \R8                  4   4S jjjr%S  r&S)S! jr'S" r(S# r)S$\R8                  S%\4S& jr*g)*    N)Version)NDArray)GeometryType)GeoDataFrame)SHAPELY_GE_204)from_shapelyfrom_wkb)point
linestringpolygon
multipointmultilinestringmultipolygonc                   (    \ rS rSrSrS rSS jrSrg)
ArrowTable   a  
Wrapper class for Arrow data.

This class implements the `Arrow PyCapsule Protocol`_ (i.e. having an
``__arrow_c_stream__`` method). This object can then be consumed by
your Arrow implementation of choice that supports this protocol.

.. _Arrow PyCapsule Protocol: https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html

Example
-------
>>> import pyarrow as pa
>>> pa.table(gdf.to_arrow())  # doctest: +SKIP

c                     Xl         g N	_pa_table)selfpa_tables     Y/var/www/html/Sattelite-Image/venv/lib/python3.13/site-packages/geopandas/io/_geoarrow.py__init__ArrowTable.__init__.   s    !    Nc                 4    U R                   R                  US9$ )N)requested_schema)r   __arrow_c_stream__r   r   s     r   r   ArrowTable.__arrow_c_stream__1   s    ~~00BR0SSr   r   r   )__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes__ r   r   r   r      s     "Tr   r   c                   (    \ rS rSrSrS rSS jrSrg)GeoArrowArray5   a  
Wrapper class for a geometry array as Arrow data.

This class implements the `Arrow PyCapsule Protocol`_ (i.e. having an
``__arrow_c_array/stream__`` method). This object can then be consumed by
your Arrow implementation of choice that supports this protocol.

.. _Arrow PyCapsule Protocol: https://arrow.apache.org/docs/format/CDataInterface/PyCapsuleInterface.html

Example
-------
>>> import pyarrow as pa
>>> pa.array(ser.to_arrow())  # doctest: +SKIP

c                     X l         Xl        g r   	_pa_array	_pa_field)r   pa_fieldpa_arrays      r   r   GeoArrowArray.__init__F   s    !!r   Nc                     Ub  [        S5      eU R                  R                  5       U R                  R	                  5       S   4$ )Nz5Requested schema is not supported for geometry arrays   )NotImplementedErrorr/   __arrow_c_schema__r.   __arrow_c_array__r    s     r   r7   GeoArrowArray.__arrow_c_array__J   sI    '%G  NN--/NN,,.q1
 	
r   r-   r   )r"   r#   r$   r%   r&   r   r7   r'   r(   r   r   r*   r*   5   s     "
r   r*   Tc           	         U R                   S:H  nU R                  U   n[        R                  " U5      R	                  5       S   n[
        R                  " U R                  SS95      nU H  n	SX'   M	     [        R                  R                  XS9n
0 nUR                  5       S:X  a  [        Xv5       H  u  p[        [        R                  " X	   R                  5      UU	X	   R                  US9u  pU
R!                  XU5      n
UR"                  S	   R%                  5       R'                  S
5      X'   M     X4$ UR                  5       S:X  af  [        Xv5       HT  u  p[)        [        R                  " X	   R                  5      XU	   R                  S9u  pU
R!                  XU5      n
SX'   MV     X4$ [+        SU 35      e)a5  
Convert GeoDataFrame to a pyarrow.Table.

Parameters
----------
df : GeoDataFrame
    The GeoDataFrame to convert.
index : bool, default None
    If ``True``, always include the dataframe's index(es) as columns
    in the file output.
    If ``False``, the index(es) will not be written to the file.
    If ``None``, the index(ex) will be included as columns in the file
    output except `RangeIndex` which is stored as metadata only.
geometry_encoding : {'WKB', 'geoarrow' }, default 'WKB'
    The GeoArrow encoding to use for the data conversion.
interleaved : bool, default True
    Only relevant for 'geoarrow' encoding. If True, the geometries'
    coordinates are interleaved in a single fixed size list array.
    If False, the coordinates are stored as separate arrays in a
    struct type.
include_z : bool, default None
    Only relevant for 'geoarrow' encoding (for WKB, the dimensionality
    of the individual geometries is preserved).
    If False, return 2D geometries. If True, include the third dimension
    in the output (if a geometry has no third dimension, the z-coordinates
    will be NaN). By default, will infer the dimensionality from the
    input geometries. Note that this inference can be unreliable with
    empty geometries (for a guaranteed result, it is recommended to
    specify the keyword).

geometryr   F)deepN)preserve_indexgeoarrow)	include_z
field_namecrsinterleaved   ARROW:extension:name	geoarrow.wkbr?   r@   WKBz3Expected geometry encoding 'WKB' or 'geoarrow' got )dtypescolumnsnpasarraynonzeropd	DataFramecopypaTablefrom_pandaslowerzipconstruct_geometry_arrayarrayr@   
set_columnmetadatadecoderemoveprefixconstruct_wkb_array
ValueError)dfindexgeometry_encodingrA   r>   maskgeometry_columnsgeometry_indicesdf_attrcoltablegeometry_encoding_dictifieldgeom_arrwkb_arrs                   r   geopandas_to_arrowrj   U   s   L 99
"Dzz$'zz$'//1!4ll2777./G
     HH   ?E J.*=FA6'#GKK'OE $$Qx8E67k* #' >8 (( 
	 	 	"e	+*=FA0

27==)c#w{{NE $$Qw7E*/"' > (( ABSATU
 	
r   r:   rE   shapely_arrr?   r@   returnc                   [         R                  S:  a  SS0nO6[         R                  " U 5      R                  5       (       a  [	        S5      e0 n[         R
                  " U 40 UD6nSS0nUb*  [        R                  " SUR                  5       05      US'   OS	US'   [        R                  " U[        R                  " 5       S
US9n[        R                  " [        R                  " U5      [        R                  " 5       5      nXg4$ )N)   
   r   flavorisoz)Cannot write 3D geometries with GEOS<3.10ARROW:extension:namegeoarrow.wkbr@   ARROW:extension:metadata{}T)typenullablerW   )shapelygeos_versionhas_zanyr[   to_wkbjsondumpsto_json_dictrO   rg   binaryrU   rI   rJ   )rk   r?   r@   kwargsri   extension_metadatarg   parrs           r   rZ   rZ      s     j(E"==%))++HIInn[3F3G0.A
9=C$$&':
56 :>56HHt>PE 88BJJw'5D;r   c                 d   U(       a  [         R                  " U[         R                  " 5       SS9n[         R                  " U[	        U5      5      nUc.  [         R
                  R                  U R                  5       US9nU$ [         R
                  R                  U R                  5       XSS9n U$ US:X  a  [         R                  " S[         R                  " 5       SS9[         R                  " S[         R                  " 5       SS9/n[         R                  R                  U S S 2S4   R                  5       U S S 2S	4   R                  5       /XsS
9nU$ [         R                  " S[         R                  " 5       SS9[         R                  " S[         R                  " 5       SS9[         R                  " S[         R                  " 5       SS9/n[         R                  R                  U S S 2S4   R                  5       U S S 2S	4   R                  5       U S S 2S4   R                  5       /UUS
9nU$ )NFrw   rv   rv   r_   xyxyr   r4   )fieldsr_   z   )
rO   rg   float64list_lenFixedSizeListArrayfrom_arraysravelStructArrayrN   )coordsrA   dimsr_   coords_fieldtypr   r   s           r   _convert_inner_coordsr      s   xxbjjlUChh|SY/<((44V\\^#4ND2 K/ ((44S 5 D. K' 4<bjjlU;bjjlU;F >>--1""$fQTl&7&7&9:6 . D K bjjlU;bjjlU;bjjlU;F
 >>--1""$fQTl&7&7&96!Q$<;L;L;NO . D
 Kr   c                 V    [         R                  " [         R                  " SU SS95      $ )NverticesFr   rO   r   rg   
point_types    r   _linestring_typer      s    88BHHZeDEEr   c                     [         R                  " [         R                  " S[         R                  " [         R                  " SU SS95      SS95      $ )Nringsr   Fr   r   r   s    r   _polygon_typer      s>    88
HHRXXj*uEF	
 r   c                 V    [         R                  " [         R                  " SU SS95      $ )NpointsFr   r   r   s    r   _multipoint_typer      s    88BHHXzEBCCr   c                 h    [         R                  " [         R                  " S[        U 5      SS95      $ )NlinestringsFr   )rO   r   rg   r   r   s    r   _multilinestring_typer      s)    88
 0 <uM r   c                 h    [         R                  " [         R                  " S[        U 5      SS95      $ )NpolygonsFr   )rO   r   rg   r   r   s    r   _multipolygon_typer     s#    88BHHZz)BUSTTr   )r?   r@   rA   r>   rA   c                   [         R                  " U 5      n[        U 5      S:X  d  UR                  5       (       a  [	        S5      e[         R
                  " XS9u  pgnUR                  5       (       a  U[        R                  :X  a8  U(       a1  [        [        R                  5      [        S5      :  a  [        S5      e[        R                  " U[        R                  " 5       S9nU[        R                  :X  aj  [        (       d_  [         R"                  " U5      S   n	U	[         R$                  " [        U	5      5      -
  n	[         R&                  " Xy[         R(                  SS9nOS nUR*                  S   S	:X  a  S
n
O.UR*                  S   S:X  a  Sn
O[        SUR*                   35      e0 nUb*  [,        R.                  " SUR1                  5       05      US'   OSUS'   U[        R                  :X  a3  [3        XtXS9nSUS'   [        R4                  " UUR6                  SUS9nX4$ U[        R8                  :X  a  [        U5      S:X  d   S5       eUu  n[3        XtU
5      n[        R:                  R=                  [        R                  " U5      U[?        UR6                  5      US9nSUS'   [        R4                  " UUR6                  SUS9nX4$ U[        R@                  :X  a  [        U5      S	:X  d   S5       eUu  nn[3        XtU
5      n[        R:                  R=                  [        R                  " U5      U5      n[        R:                  R=                  [        R                  " U5      UUS9nURC                  [E        UR6                  5      5      nSUS'   [        R4                  " UUR6                  SUS9nX4$ U[        RF                  :X  a  [        U5      S:X  d   S5       eUu  n[3        XtU
5      n[        R:                  R=                  [        R                  " U5      U[I        UR6                  5      US9nSUS'   [        R4                  " UUR6                  SUS9nX4$ U[        RJ                  :X  a  [        U5      S	:X  d   S5       eUu  nn[3        XtU
5      n[        R:                  R=                  [        R                  " U5      U5      n[        R:                  R=                  [        R                  " U5      UUS9nURC                  [M        UR6                  5      5      nSUS'   [        R4                  " UUR6                  SUS9nX4$ U[        RN                  :X  Ga  [        U5      S:X  d   S5       eUu  nnn[3        XtU
5      n[        R:                  R=                  [        R                  " U5      U5      n[        R:                  R=                  [        R                  " U5      U5      n[        R:                  R=                  [        R                  " U5      UUS9nURC                  [Q        UR6                  5      5      nSUS'   [        R4                  " UUR6                  SUS9nX4$ [        S U 35      e)!Nr   z`Converting an empty or all-missing GeoDataFrame to the 'geoarrow' encoding is not yet supported.)r>   z15.0.0zConverting point geometries with missing values is not supported for interleaved coordinates with pyarrow < 15.0.0. Please upgrade to a newer version of pyarrow.r   )axisr   r   rn   xyzzUnexpected coords dimensions: r@   rt   ru   )r_   geoarrow.pointrr   T)rw   rW   r4   zExpected one offsets arraygeoarrow.linestringzExpected two offsets arraysgeoarrow.polygonr   geoarrow.multipointgeoarrow.multilinestringzExpected three offsets arraysgeoarrow.multipolygonzUnsupported type for geoarrow: ))rx   
is_missingr   allr5   to_ragged_arrayr{   r   POINTr   rO   __version__r[   rU   bool_r   rI   rK   arangeinsertnanshaper}   r~   r   r   rg   rv   
LINESTRING	ListArrayr   r   POLYGONcastr   
MULTIPOINTr   MULTILINESTRINGr   MULTIPOLYGONr   )rk   r>   r?   r@   rA   r_   	geom_typer   offsetsindicesr   r   r   rg   geom_offsets_parrring_offsets_parr1polygon_offsets_parr2s                       r   rT   rT   
  s    k*D
;1

!-
 	

 ")!8!8"Iw xxzz+++''(*;;9 
 xx288:.***>> jj&q)G		#g, 77GYYvQ?F ||B1	b	Q	9&,,HII)+
9=C$$&':
56 :>56L&&&$V$J5E12II'	
 {	l--	-7|q >">> !%f4@||''HH\"E+;EJJ+Gd ( 
 6K12II'	
 {	l**	*7|q ?"?? %,"l%f4@))"((<*@%H||''(>T'Ryyuzz235G12II'	
 {	l--	-7|q >">> !%f4@||''HH\"E0@0LSW ( 
 6K12II'	
 {	l22	27|q ?"?? %,"l%f4@))"((<*@%H||''(>T'Ryy.uzz:;5O12II'	
 {	l//	/7|q A"AA 6=3o|%f4@))"((<*@%H))"((?*CVL||''(>T'Ryy+EJJ785L12II'	
 { :9+FGGr   c                 T   U R                   =nbw  UR                  SS 5      =nbb  UR                  S5      (       aL  UR                  SS 5      =n b$  [        R                  " UR                  5       5      nUR                  5       U4$ [        U R                  [        R                  5      (       ay  U R                  R                  nUR                  S5      (       aM  U R                  R                  5       nU(       a'  [        R                  " UR                  5       5      nX#4$ S nX#4$ g )NrB   s	   geoarrow.s   ARROW:extension:metadatarC   )rW   get
startswithr}   loadsrX   
isinstancerv   rO   ExtensionTypeextension_name__arrow_ext_serialize__)rg   metaext_nameext_metaext_meta_sers        r   _get_arrow_geometry_fieldr     s    +!8$??HL""<00 $)Dd KKH  $zz(//*;<H((22%**b..//::,,{++ ::==?L::l&9&9&;< %%  %%r   c                 6   [        U [        R                  5      (       d  [        R                  " U 5      n / n[	        U R
                  5       H4  u  pE[        U5      nUc  M  UR                  XER                  /UQ75        M6     [        U5      S:X  a  [        S5      eU R                  U Vs/ s H  owS   PM	     sn5      nUc  0 nUR                  " S0 UD6n	U H  u  pJpSnUb  SU;   a  US   nUS:X  a!  [        [        R                  " X
   5      US9nOOUR!                  S5      S   ["        ;   a%  [%        ['        X
   R)                  5       U5      US9nO[+        S	U 35      eU	R-                  XJU5        M     [/        X=(       d    US   S   S
9$ s  snf )a  
Convert Arrow table object to a GeoDataFrame based on GeoArrow extension types.

Parameters
----------
table : pyarrow.Table
    The Arrow table to convert.
geometry : str, default None
    The name of the geometry column to set as the active geometry
    column. If None, the first geometry column found will be used.
to_pandas_kwargs : dict, optional
    Arguments passed to the `pa.Table.to_pandas` method for non-geometry columns.
    This can be used to control the behavior of the conversion of the non-geometry
    columns to a pandas DataFrame. For example, you can use this to control the
    dtype conversion of the columns. By default, the `to_pandas` method is called
    with no additional arguments.

Returns
-------
GeoDataFrame

Nr   z,No geometry column found in the Arrow table.r4   r@   rs   r@   .!Unknown GeoArrow extension type: )r:   r(   )r   rO   rP   rd   	enumerateschemar   appendnamer   r[   drop	to_pandasr	   rI   rU   splitGEOARROW_ENCODINGSr   construct_shapely_arraycombine_chunks	TypeErrorr   r   )rd   r:   to_pandas_kwargsgeom_fieldsrf   rg   geomf
table_attrr\   rc   r   r   r@   rh   s                  r   arrow_to_geopandasr     s   . eRXX&&Kell+(/::556 ,
 ;1GHH;7;aqT;78J				1 0	1B&1"EX$55/C~% 4#>H^^C #'99#'
(A(A(CXNTWH ?zJKK
		!(# '2  %BQ1BCC+ 8s   .Fc                 F   [        [        R                  5      [        S5      :  a  [        S5      eU R	                  5       u  p[        R
                  R                  U5      n[        R                  R                  UR                  5       U5      n[        U5      nUc  [        S5      eUu  pgSnUb  SU;   a  US   nUS:X  a   [        [        R                  " U5      US9n	U	$ UR                  S5      S	   [        ;   a  [        [!        XF5      US9n	U	$ [        S
U 35      e)z
Convert Arrow array object (representing single GeoArrow array) to a
geopandas GeometryArray.

Specifically for GeoSeries.from_arrow.
z14.0.0z.Importing from Arrow requires pyarrow >= 14.0.Nz!No GeoArrow geometry field found.r@   rs   r   r   r4   r   )r   rO   r   r[   r7   Field_import_from_c_capsuleArrayr6   r   r	   rI   rU   r   r   r   r   )
arrschema_capsulearray_capsulerg   pa_arr	geom_infor   r   r@   rh   s
             r   arrow_to_geometry_arrayr      s    r~~!22IJJ$'$9$9$;!NHH++N;EXX,,U-E-E-GWF)%0I<=="H
C 1uo>!BHHV,#6 O 
	Q	#5	5 7 IsS O <XJGHHr   c           	         [         R                  R                  U R                  5      (       a  U R                  R                  S:X  a`  [
        R                  " [
        R                  " U R                  S5      5      [
        R                  " U R                  S5      5      /5      nU$ [
        R                  " [
        R                  " U R                  S5      5      [
        R                  " U R                  S5      5      [
        R                  " U R                  S5      5      /5      nU$ [
        R                  " U R                  5      R                  [        U 5      S5      $ )Nr   r   r   r   r   )rO   types	is_structrv   
num_fieldsrI   column_stackrJ   rg   valuesreshaper   )r   r   s     r   _get_inner_coordsr  !  s    	xx#((##88!#__CIIcN+RZZ		#-GHF  __JJsyy~.JJsyy~.JJsyy~.F  zz#**%--c#h;;r   r   r   c                 "   [        U [        R                  5      (       a  U R                  n US:X  a3  [	        U 5      n[
        R                  " [        R                  US5      nGOUS:X  a_  [	        U R                  5      n[        R                  " U R                  5      nU4n[
        R                  " [        R                  X%5      nGOxUS:X  a  [	        U R                  R                  5      n[        R                  " U R                  5      n[        R                  " U R                  R                  5      nXF4n[
        R                  " [        R                  X%5      nGOUS:X  a_  [	        U R                  5      n[        R                  " U R                  5      nU4n[
        R                  " [        R                  X%5      nGOzUS:X  a  [	        U R                  R                  5      n[        R                  " U R                  5      n[        R                  " U R                  R                  5      nXF4n[
        R                  " [        R                   X%5      nOUS:X  a  [	        U R                  R                  R                  5      n[        R                  " U R                  5      n[        R                  " U R                  R                  5      n[        R                  " U R                  R                  R                  5      nXFU4n[
        R                  " [        R"                  X%5      nO[%        U5      eU R&                  (       a<  [        R                  " U R)                  5       5      n[        R*                  " USU5      nU$ )zc
Construct a NumPy array of shapely geometries from a pyarrow.Array
with GeoArrow extension type.

r   Nr   r   r   r   r   )r   rO   ExtensionArraystorager  rx   from_ragged_arrayr   r   r  rI   rJ   r   r   r   r   r   r   r[   
null_countis_nullwhere)	r   r   r   resultoffsets1r   offsets2offsets3r_   s	            r   r   r   5  s~    #r(())kk))"3'**<+=+=vtL	0	0"3::.::ckk*+**<+B+BFT	-	-"3::#4#45::ckk*::cjj001&**<+?+?Q	0	0"3::.::ckk*+**<+B+BFT	5	5"3::#4#45::ckk*::cjj001&**((&
 
2	2"3::#4#4#;#;<::ckk*::cjj001::cjj//778x0**<+D+DfV (( ~~zz#++-($f-Mr   )NrF   TNr   )NN)+r}   packaging.versionr   numpyrI   pandasrL   pyarrowrO   numpy.typingr   rx   r   	geopandasr   geopandas._compatr   geopandas.arrayr   r	   r   r   r*   rj   object_strtupler   r   rZ   r   r   r   r   r   r   boolrT   r   r   r   r  r   r(   r   r   <module>r     s    %         " , 2 T T0
 
D T)t !	$  
t	
 288RXX@DFDU "]H !]H$]Hd{]H 	]H
 
t]H ]H 288RXX]HF.9DxB<(9 93 9r   