
    (eͫ              +          d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZ d Zd Zd Zd	 Zd
 Z G d de      Zd.dZd Zd Zd Zd Zd Zd Zd Z	 	 	 	 	 	 	 	 	 	 	 	 	 d/deee      dee   dee   dee   dedeee       dee   dee   dee   deee      deee      d ed!efd"Z!	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d0deee      dee   dee   d#ed$ed%ed&ed'edee   dedeee       d(ee   d)ee   d*ee   dee   dee   dee   deee      deee      d ed!ef*d+Z"ejF                  fd,Z$e%d-k(  r# ejL                   e$ejF                               yy)1    N)OptionalSequence)gdalogrosr)PathLikeOrStr)GetOutputDriverForc                    | rt         j                  nt         j                  }t        d|       t        d|       t        d|       t        d|       t        d|       t        d|       t        d|       t        d	|       t        d
|       t        d|       t        d|       t        d|       t        d|       t        d
|       t        d|       t        d|       t        d|       t        d|       t        d|       t        d|       t        d|       t        d|       | rdS dS )Nz,Usage: ogrmerge.py [--help] [--help-general]filez:            -o <out_dsname> <src_dsname> [<src_dsname>]...z@            [-f <format>] [-single] [-nln <layer_name_template>]zB            [-update | -overwrite_ds] [-append | -overwrite_layer]zC            [-src_geom_type <geom_type_name>[,<geom_type_name>]...]z>            [-dsco <NAME>=<VALUE>]... [-lco <NAME>=<VALUE>]...zB            [-s_srs <srs_def>] [-t_srs <srs_def>|-a_srs <srs_def>]z8            [-progress] [-skipfailures] [--help-general] zOptions specific to -single:z=            [-field_strategy {FirstLayer|Union|Intersection}]z*            [-src_layer_field_name <name>]z<            [-src_layer_field_content <layer_name_template>]zG* layer_name_template can contain the following substituable variables:zD     {AUTO_NAME}  : {DS_BASENAME}_{LAYER_NAME} if they are differentz9                    or {LAYER_NAME} if they are identicalz.     {DS_NAME}    : name of the source datasetz3     {DS_BASENAME}: base name of the source datasetz/     {DS_INDEX}   : index of the source datasetz,     {LAYER_NAME} : name of the source layerz-     {LAYER_INDEX}: index of the source layer   r   )sysstderrstdoutprint)isErrorfs     6/usr/lib/python3/dist-packages/osgeo_utils/ogrmerge.pyUsager   ,   s    

3::A	
8qA	
FQO	
LSTU	
NUVW	
OVWX	
JQRS	
NUVW	
D1M	"1	
(q1	
IPQR	
6Q?	
HqQ	"1	T 
Q 

EAN	
:C	
?aH	
;!D	
8qA	
9B1Q    c                 F    t        j                  |dt        |      |        y )N   )r   
VSIFWriteLlen)r   ss     r   _VSIFPrintfLr   Q   s    OOAq#a&!$r   c                 D    | j                         |j                         k(  S N)lower)xys     r   EQUALr#   X   s    779	!!r   c                 (   t        | d      rt        j                  S 	 t        j                  }t        |dz         D ]5  }t        | t        j                  |      j                  dd            s3|c S  y # t        $ r t        j
                  }Y bw xY w)NGEOMETRYr    r   )	r#   r   
wkbUnknownwkbTriangle	Exception
wkbSurfacerangeGeometryTypeToNamereplace)src_geom_type_namemax_geom_typeis      r   _GetGeomTyper1   _   s    ,~~' =1$% #S%;%;A%>%F%FsB%OPH   ''s   A5 5BBc                 h    t        j                  | t         j                        j                  d      S )NzUTF-8)r   EscapeString	CPLES_XMLdecoder!   s    r   _Escr7   p   s$    Q/66w??r   c                   0    e Zd Zd Zd ZddZddZddZy)	XMLWriterc                 .    || _         d| _        g | _        y )Nr   )r   incelements)selfr   s     r   __init__zXMLWriter.__init__u   s    r   c                      d| j                   z  S )Nz  )r;   r=   s    r   _indentzXMLWriter._indentz   s    dhhr   Nc           
      D   d}|.|D ])  }|d|dt        ||   j                  d            dz   }+ | j                         d||d}|j                  d      }t        | j                  |       | j
                  dz   | _        | j                  j                  |       y )	Nr   r&   ="utf-8"<>
r   )r7   encoderA   r   r   r;   r<   append)r=   nameattrs	xml_attrskeyr!   s         r   open_elementzXMLWriter.open_element}   s    	 %s**734) 	
 !LLND)<HHWTVVQ88a<T"r   c           
      "   d}|.|D ])  }|d|dt        ||   j                  d            dz   }+ | j                         d||dt        |j                  d            d|d		}|j                  d      }t        | j                  |       y )
Nr   r&   rC   rD   rE   rF   ></rG   )r7   rH   rA   r   r   )r=   rJ   valuerK   rL   rM   r!   s          r   write_element_valuezXMLWriter.write_element_value   s    	 %s**734) 	 LLNg&'
 HHWTVVQr   c                     | j                   dz
  | _         | j                  d   }|||k(  sJ | j                  dd | _        t        | j                  | j	                         d|d       y )Nr   r   rQ   rG   )r;   r<   r   r   rA   )r=   closing_namerJ   s      r   close_elementzXMLWriter.close_element   s^    88a<}}R #<'''a+TVVDLLNDABr   r   )__name__
__module____qualname__r>   rA   rN   rS   rW    r   r   r9   r9   t   s    
# $Cr   r9   c                 L   | st        d      S d }d }g }d}d}d}d}	d}
d }d}g }d }d }d }d }d }d }g }g }d}|t        |       k  r| |   }|dk(  rt        d      S |dk(  s|dk(  r|dz   t        |       k  r|dz   }| |   }n|d	k(  r|dz   t        |       k  r|dz   }| |   }n|d
k(  rt        j                  }d }nm|dk(  s|dk(  rna|dd dk(  rd}nU|dk(  rd}nL|dk(  rd}nC|dk(  rd}d}n8|dk(  rd}	d}n-|dk(  rd}
n$|dk(  r|dz   t        |       k  r|dz   }| |   }n|dk(  r|dz   t        |       k  r|dz   }| |   }n|dk(  r|dz   t        |       k  r|dz   }| |   }n|dk(  r|dz   t        |       k  r|dz   }| |   }n|dk(  r|dz   t        |       k  r|dz   }| |   }nz|dk(  r|dz   t        |       k  r|dz   }| |   }nX|dk(  r|dz   t        |       k  r|dz   }| |   }n6|dk(  r,|dz   t        |       k  r|dz   }|j	                  | |          n|dk(  r+|dz   t        |       k  r|dz   }|j	                  | |          n|dk(  rp|dz   t        |       k  r_|dz   }| |   j                  d      }|D ]@  }t        |      }| t        d|z  t        j                           y|j	                  |       B n`|d   d!k(  r*t        d"|z  t        j                          t        d      S d#|v r|t        j                  |      z  }n|j	                  |       |dz   }|t        |       k  r|t        d$t        j                          yt        d:i d%|d&|d'|d(|d)|d*|d+|	d,|
d-|d.|d/|d0|d1|d2|d3|d4|d5|d6|d7|d8|d9|S );NT)r   Fr   z--helpz-fz-ofr   z-oz	-progressz-qz-quiet   z-skipz-updatez-overwrite_dsz-overwrite_layerz-appendz-singlez-a_srsz-s_srsz-t_srsz-nlnz-field_strategyz-src_layer_field_namez-src_layer_field_contentz-dscoz-lcoz-src_geom_type,z%ERROR: Unrecognized geometry type: %sr   -z!ERROR: Unrecognized argument : %s*z
Missing -osrc_datasetsdst_filenamedriver_nameoverwrite_dsoverwrite_layerupdaterI   single_layerlayer_name_templateskip_failuressrc_geom_typesfield_strategysrc_layer_field_namesrc_layer_field_contenta_srss_srst_srsdscolcoprogress_callbackprogress_argr[   )r   r   r   TermProgress_nocbrI   splitr1   r   r   r   globogrmerge)argvprogressrt   rb   rc   ra   rd   re   rf   rI   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   r0   argsrc_geom_type_namesr.   src_geom_types                              r   processr~      s   T""LKLLOFFLMNN"EEED
C 	
A
c$i-1g(?''TkSE\q1us4y/@AAq'KD[QUSY.AA7LK,,HLD[C8O1X  MIFO#L&&"OFIFFILH_QT!2AAGEH_QT!2AAGEH_QT!2AAGEF]q1us4y0AA"&q'%%!a%#d)*;AA!!WN++AD	0AAA#'7 ..1q53t93DAA&*1g#G^AD	 1AAKKQ F]q1us4y0AAJJtAw$$QT):AA"&q'--"4&9 5" ,-? @ (?BTT ZZ %%m45 Vs]5;#**M&&cz		#.##C(EY c$i-\ l, !!   "	
 (   " 0 $ & & 2 !8   !" #$ %& '( #)* "+ r   c                    | }d }t         j                  j                  |      rFt         j                  j                  |      }d|v r#dj	                  |j                  d      dd       }||k(  r|j                  d|      }n2||j                  dd||fz        }n|j                  d|dz   |z         }||j                  d|      }nCd|v r?|rd|vr9|j                  dd	|z        }n#t        d
| d|dt        j                         y |j                  dd|z        }|j                  dd|z        }|j                  d|      }|j                  dd|z        }|S )N.r   rU   {AUTO_NAME}Dataset%d_%s_{DS_BASENAME}
{DS_INDEX}z	Dataset%dzERROR: Layer name template z includes {DS_BASENAME} but z is not a filer   	{DS_NAME}%s%d{LAYER_NAME}{LAYER_INDEX})
ospathexistsbasenamejoinrv   r-   r   r   r   )rh   
src_ds_idx
src_dsnamesrc_lyr_idxsrc_lyr_nameri   
layer_namer   s           r   !_build_layer_name_non_single_moder   4  sz    %JH	ww~~j!77##J/(?xxs 3Ab 9:H<''x@
		''>Z,FF

  ''x#~7TU
''B
	J	&:-'//#[:%=
  +>zK ZZ	 ##K
1BCJ##L$2CDJ##NLAJ##OTK5GHJr   c                 &    | j                  dd      S )N'z''r-   r6   s    r   _quote_literalr   f      99S$r   c                 &    | j                  dd      S )NrE   z""r   r6   s    r   	_quote_idr   m  r   r   c                     	 | j                  dt        |      z        }|j                         }|j	                  d      }| j                  |       |S # t        $ r  | j                  dt        |      z        }Y \w xY w)NzCSELECT pgsize FROM temp.stat WHERE name = '%s' AND aggregate = TRUEz3SELECT SUM(pgsize) FROM temp.stat WHERE name = '%s'r   )
ExecuteSQLr   r)   GetNextFeatureGetFieldReleaseResultSet)src_ds
table_namesql_lyrr   src_table_sizes        r   _gpkg_get_src_table_sizer   t  s    

##QZ()
 	 AZZ]N
G$  
##AZ()

s   A &A<;A<c           	      <   d}|j                         t        j                  k7  rx| j                  dt	        |j                               dt	        |j                               d      }|j                         }|j                  d      }| j                  |       |S )NFzSELECT HasSpatialIndex('', '')r   )
GetGeomTyper   wkbNoner   r   GetNameGetGeometryColumnr   r   r   )dslyrhas_spatial_indexr   r   s        r   _gpkg_has_spatial_indexr     s    
CKK'--ckkm,nS=R=R=T.UW
 ""$JJqM
G$r   c                    d}| D ]Y  }t        j                  |      }|d}	 |j                  d       d}d}|rG|D ]B  }|r+t        j                  |j                               }	|	|vrd} n|r3t        ||      s@d} n |r#|t        j                  |      j                  z  }|D ]  }|r(t        j                  |j                               }	|	|vr-|t        ||j                               z  }|sMt        ||      sZd|j                         d|j                         }
|t        ||
dz         z  }|t        ||
dz         z  }|t        ||
d	z         z  } \ |S # t        $ r Y 9w xY w)
Nr   Fz1CREATE VIRTUAL TABLE temp.stat USING dbstat(main)Trtree_r   _node_rowid_parent)r   Openr   r)   
GT_Flattenr   r   r   VSIStatLsizer   r   r   )ra   rj   can_reuse_spatial_indexestimated_final_sizer   r   dbstat_availableuse_src_file_sizesrc_lyrgtsrc_rtree_prefixs              r   _gpkg_get_estimated_final_sizer     s    " 5
*%> 	QR# !! !(;(;(=>B/,1).3JG4 ).%  DMM*$=$B$BB ! !(;(;(=>B/ $(@GOO-) $ +/Fvw/W)113($ ),D 07 :- ( ),D 08 ;- ( ),D 09 <- ()?5n  ]  		s   E$$	E10E1c                     dt        |j                               z  }| j                  |      }|j                         }|j	                  d      }| j                  |       |S )Nz@SELECT srs_id FROM gpkg_geometry_columns WHERE table_name = '%s'r   )r   r   r   r   r   r   )r   r   sqlr   r   srs_ids         r   _gpkg_get_srs_idr     s[    J

'	(  mmC G AZZ]F Mr   ra   rb   rc   rh   ri   rj   rn   ro   rp   rq   rr   rs   rt   c                    d}t        j                  |      }|t        d|z  t        j                         y|j                  |dddt         j                  |	      }|yt        j                          t        j                          t        j                           G fdd      }d|
D cg c]  }|j                          c}v}|d u xr |}d}rt        | ||      }t        |       D ]  \  }}t        j                  |      }|#t        d	|z  t        j                         |r? yt        |      D ]  \  }}|r(t        j                  |j                               }||vr1|j                         t        j                   k7  }|r*t#        d
 |
D              sd|j%                         z   g|
z   }n|
}|r(|r&t        j&                         }|j)                  |       n:|r(|r&t        j&                         }|j)                  |       n|j+                         }t-        |||||j/                         |      }|  y|j1                  ||j                         ||      }t3        |j5                         j7                               D ]0  }|j9                  |j5                         j;                  |             2 |j=                         } | r|j?                  |        |jA                          |r=tC        ||      }!tC        ||      }"d|j/                         d|j%                         }#nd}#d}!d}"dtE        |#      dtE        |j/                               dtE        |j/                               d}$g }%|jG                  |$      }&|&D ]8  }'|'d   }(|jG                  dtI        |(      z         |%jK                  |'d          : |jM                  |&       d })|!|"k(  r|| |)||       |)||      k(  rd}*njdtI        |jO                               z  }*|r|!|"k(  r |*dtI        |j%                               z  z  }*n|r|rxt        j&                         }+|+j)                  |       |+jQ                  d       dk(  sJ tS        |+jU                  d             }!|*dtI        |j%                               |!|"fz  z  }*nC|*dtI        |j%                               |"fz  z  }*n!|*dtI        |j%                               |"fz  z  }*t3        |j5                         j7                               D ]>  }|*dtI        |j5                         j;                  |      j/                               z  z  }*@ |jG                  d tE        |      z         d },r	 |||      },	 |jG                  d!tI        |j/                               d"|*d#tI        |j/                               d$       |,r|,jW                          	 |jG                  d%      }&|&jY                         }'|'j[                  d      }-d }'|jM                  |&       |j]                  d&      }.|.dk\  r4|-|.k7  r/t        d'|-|j/                         |.fz  t        j                         |jG                  d(tE        |j/                               |-fz         d)}/|r|r|rt_        ||      rd|j/                         d|j%                         }0r	 |||      },	 |jG                  d*tI        |#      z         |jG                  d!tI        |#      d+tI        |0      d,       |jG                  d!tI        |#      d-tI        |0      d.       |jG                  d!tI        |#      d/tI        |0      d0       |,r|,jW                          nd1}/|jG                  d2       |jG                  d3      }&|&j]                         dk(  }1|jM                  |&       |r|1rd4tE        |j/                               d5tE        |j%                               d6}$|jG                  |$      }&|&D ]e  }'|'j[                  d      ta        d7      d  }2|jM                  |jG                  d8|j/                         d9|j%                         d9|2d             g |jM                  |&       |rN|jc                  dd1:      }3|3r9|3\  }4}5}6}7d;|4|6|5|7tE        |j/                               fz  }$|jG                  |$       |%D ]  }$|jG                  |$        |/s|jM                  |jG                  d<tE        |j/                               d9tE        |j%                               d             |jM                  |jG                  d=tE        |j/                               d9tE        |j%                               d               r
 d>d?       yc c}w # |,r|,jW                          w w xY w# |,r|,jW                          w w xY w)@NGPKGERROR: Invalid driver: %sr   r   r   c                        e Zd Z fdZd Zy)(_gpkg_ogrmerge.<locals>.ThreadedProgressc                 v     d _         dd lddlm}  fd} ||      }|j	                          y )NFr   )Threadc                      j                   sWt        j                        j                  } t	        d| z        } |d       j                  d       j                   sVy y )N      ?r   g?)stop_threadr   r   r   minsleep)dst_file_sizepctrb   r   rt   rs   r=   times     r   myfunczA_gpkg_ogrmerge.<locals>.ThreadedProgress.__init__.<locals>.myfunc  sT    **$(MM,$?$D$DMc=3G#GHC%c2|<JJsO	 **r   )target)r   r   	threadingr   start)	r=   rb   r   r   r   tr   rt   rs   s	   ```   @r   r>   z1_gpkg_ogrmerge.<locals>.ThreadedProgress.__init__  s0    $D($ $ f%AGGIr   c                     d| _         y )NT)r   r@   s    r   stopz-_gpkg_ogrmerge.<locals>.ThreadedProgress.stop  s
    #Dr   N)rX   rY   rZ   r>   r   )rt   rs   s   r   ThreadedProgressr     s    	 	$r   r   zSPATIAL_INDEX=NOERROR: Cannot open %sc              3   Z   K   | ]#  }|j                         j                  d        % yw)GEOMETRY_NAME=N)upper
startswith).0opts     r   	<genexpr>z!_gpkg_ogrmerge.<locals>.<genexpr>:  s'      $=@		&&'78$s   )+r   )	geom_typesrsoptionsr   r   __invalid__rU   zKSELECT name, sql FROM sqlite_master WHERE type = 'trigger' AND (name LIKE 'z/_%' OR name LIKE 'trigger_insert_feature_count_z-' OR name LIKE 'trigger_delete_feature_count_r   rJ   zDROP TRIGGER "%s"r   c                 P   g }| j                  dt        |j                               z        }|D ]b  }|d   }||j                         k(  r|j	                  d       -||j                         k(  r|j	                  d       R|j	                  |       d | j                  |       |S )NzPRAGMA table_info('%s')rJ   __FID____GEOMETRY_COLUMN__)r   r   r   GetFIDColumnrI   r   r   )r   r   fieldsr   r   col_names         r   get_normalized_field_namesz2_gpkg_ogrmerge.<locals>.get_normalized_field_names~  s    ---s{{}0MM ! 0A yH3#3#3#55i0!S%:%:%<<&;<h/0 ##G,r   r`   z"%s"z, "%s"EPSGz%, ST_Transform(SetSRID("%s", %d), %d)z, ST_Transform("%s", %d)z, SetSRID("%s", %d)z!ATTACH DATABASE '%s' AS source_dbzINSERT INTO "z	" SELECT z FROM source_db."rE   zSELECT changes())forcez5Warning: %d rows inserted into %s whereas %d expectedz8INSERT OR REPLACE INTO gpkg_ogr_contents VALUES('%s',%d)FzDELETE FROM "%s_node" z _node" SELECT * FROM source_db."z_node"z!_rowid" SELECT * FROM source_db."z_rowid"z"_parent" SELECT * FROM source_db."z_parent"TzDETACH DATABASE source_dbzMSELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'gpkg_extensions'z?SELECT extension_name FROM gpkg_extensions WHERE table_name = 'z' AND column_name = 'z'' AND extension_name LIKE 'gpkg_geom_%'
gpkg_geom_z"SELECT RegisterGeometryExtension('r   )r   can_return_nullzcUPDATE gpkg_contents SET min_x=%.18g, min_y=%.18g, max_x=%.18g, max_y=%.18g WHERE table_name = '%s'zSELECT DisableSpatialIndex('zSELECT CreateSpatialIndex('r   r   )2r   GetDriverByNamer   r   r   CreateGDT_Unknownr   UseExceptionsr   r   r   	enumerater   r   r   r   anyr   SpatialReferenceSetFromUserInputGetSpatialRefr   r   CreateLayerr+   GetLayerDefnGetFieldCountCreateFieldGetFieldDefnGetMetadataSetMetadata
SyncToDiskr   r   r   r   rI   r   r   GetAuthorityNameintGetAuthorityCoder   r   r   GetFeatureCountr   r   	GetExtent)8ra   rb   rc   rh   ri   rj   rn   ro   rp   rq   rr   rs   rt   drvdst_dsr   r!   create_spatial_indexr   r   r   r   r   r   r   r   has_geommodified_lcor   r   r   	field_idxmd
src_srs_id
dst_srs_idrtree_prefixr   triggersr   r   trigger_namer   r   	s_srs_objthreaded_progressnum_rows_insertedsrc_feature_countrecreateSpatialIndexr   has_gpkg_extensionsr   resminxmaxxminymaxys8              ``                                           r   _gpkg_ogrmerger"    s	     K


{
+C
{)K7cjjIZZaAt/?/?FF~$ $( .5MAaggi5MM#tmD0D=.*A 
 #,L"9 W
J*%>)J6SZZH$-f$5 O	 K^^G$7$7$9:^+**,;H $DG$ ! !173L3L3N NORUU"**,$$U+8**,$$U+++-:#!J !$$!--/$	 % C #7#7#7#9#G#G#IJ P	 4 4 6 C CI NOP $$&B#NN-fg>
-fc:
03s?T?T?VW,

 #<0"3;;=1"3;;=1	  H'',G * y!!"5	,8O"OP%)* ##G,$ j(MM.vw?-fc:;
 )G,@,@,B"CC!Z/(Yw7P7P7R-S"SS (+(<(<(>I%66u=#,#=#=d#Cv#MM#M),Y-G-G-M)NJ"&M )'*C*C*E F * *Q ' F #&@ )'*C*C*E F *D ' F "7%g&?&?&AB&; #  "'w';';'='K'K'M!N Ih,,.;;IFNNP*  F
 3nZ6PP !% $4\CW$X!-!! /7??CT9UW
 %%**, ''(:;G&&(A !

1A##G, ' 7 7a 7 @ A%*;?P*PK(#++-9JKL
 J!#++-02CDE
 $) 0*/Fvw/W  )113($
 ),<(*>-)5))4y7NN ))(6	BR8SU ))(6	BR8SU ))(6	BR8SU
 --224 ,0(9: ''_G #*"9"9";q"@##G,/ 'w'89&w'@'@'BC  !++C0  A !

1c,.?.A BI++))"{{}c.C.C.EyR ''0 ''a'F-0*D$d}tT>#++-3PQR  %%c*   '!!#&' $''%% +3;;=9*3+@+@+BC ''%% +3;;=9*3+@+@+BCOO	Wr #r<0K	 6NP %%**, %h --224 -s    0gA	g0Bg3g03hrd   re   rf   rI   rg   rk   rl   rm   c                      xs g  |
xs g }
|xs g }|xs g }|r?|t        dt        j                         y|rt        dt        j                         yd}n|t        |d      }|d}n|d	}|s@|d
k(  r;|j	                         j                  d      rt        dt        j                         y st        dt        j                         y||rd}nd}d }|st        |d      r ||      t        t        j                  dd      d      rd fd} |       }|r=|r;t        j                         }|j                  |       |j                  d       dk7  rd}|rt         ||||	|
|||||||      S d }t        |d      s ||      }|o|s|st        dt        j                         y|rk|j                         }d }|j                         dk(  rt        j                   |       n0|j#                  |       n|rt        dt        j                         y|]t        j$                  |      }|t        d|z  t        j                         y|j'                  |dddt        j(                  |      }|yd}n5t        j*                  |      r|st        dt        j                         y|}t        j,                  |d      }|t        d|z  t        j                         yt/        |      }|j1                  d       |rzd}t3               D ]S  \  }} t5        j6                  |       }!|!Mt        d | z  t        j                         |	r?t        j8                  |       t        j                   |        yt3        |!      D ]  \  }"}#|
r(t5        j:                  |#j=                               }$|$|
vr1|s?d!}|j1                  d"d#|i$       ||j?                  d%|       ||j?                  d&|       |}%|#jA                         }&	 |&jC                  d'      }&d }'tF        jH                  jK                  |       rFtF        jH                  jM                  |       }'d(|'v r#d(jO                  |'jQ                  d(      dd)       }'|'|&k(  r|%jS                  d|'      }%n2|'|%jS                  dd*||&fz        }%n|%jS                  d|'d+z   |&z         }%|'|%jS                  d,|'      }%n|%jS                  d,|       }%|%jS                  d-d.| z        }%|%jS                  d/d0|z        }%|%jS                  d1|&      }%|%jS                  d2d0|"z        }%||j1                  d3       |j1                  d4d#|%i$       i }(t        |d      rKtF        jH                  jK                  |       r,tF        jH                  jU                  |       sd5|vr	d6|vrd7|(d8<   |rd7|(d9<   |j?                  d:| |($       |j?                  d;|#jA                                ||j?                  d<|       |jW                  d4       |||j?                  d=|       |j?                  d>|       |jW                  d3        V |rH|jW                  d"       n5t3               D ]&  \  }} t5        j6                  |       }!|!Mt        d | z  t        j                         |	r?t        j8                  |       t        j                   |        yt3        |!      D ]  \  }"}#|
r(t5        j:                  |#j=                               }$|$|
vr1|#jA                         }&	 |&jC                  d'      }&tY        ||| |"|#jA                         |	      }%|%-t        j8                  |       t        j                   |         y||j1                  d3       |j1                  d4d#|%i$       i }(t        |d      rKtF        jH                  jK                  |       r,tF        jH                  jU                  |       sd5|vr	d6|vrd7|(d8<   |rd7|(d9<   |j?                  d:| |($       |j?                  d;|&       ||j?                  d<|       |jW                  d4       |w||j?                  d=|       |j?                  d>|       |jW                  d3        ) |jW                  d       t        j8                  |       d})t        |d      sFd }*|rd?}*n|rd@}*t        jZ                  ||*||	||A      })|)dk(  rd})nd})t        j                   |       |)S # tD        $ r Y w xY w# tD        $ r Y w xY w)BNz#ERROR: -f incompatible with -updater   r   z&ERROR: -dsco incompatible with -updater   F)	is_rasterr   source_ds_lyrzESRI Shapefilez.shpzMERROR: Non-single layer mode incompatible with non-directory shapefile outputzERROR: No source datasetsmergedc                 *   t        j                  d      5  t        j                         5  t        j                  | t         j                  t         j
                  z        cd d d        cd d d        S # 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)NF)useExceptions)r   ExceptionMgrquiet_errorsOpenEx	OF_VECTOR	OF_UPDATE)filenames    r   &get_vector_file_in_update_no_exceptionz8ogrmerge.<locals>.get_vector_file_in_update_no_exception  sn    U3 	JT5F5F5H 	J;;x$..)HI	J 	J 	J 	J 	J 	J 	Js"   B	5A4!	B	4A=	9B		Br   OGR_MERGE_ENABLE_GPKG_OPTIMYESc                     D ]  } | j                         j                  d      r`t        j                  |       }| y|D ]A  }|j	                         j                         dkD  s%t        dt        j                           y  y y)Nz.gpkgFr   z0Code is not ready for multi-geometry column GPKGr   T)	r    endswithr   r   r   GetGeomFieldCountr   r   r   )r   r   r   ra   s      r   are_sources_gpkgz"ogrmerge.<locals>.are_sources_gpkg  s    * !
##%..w7 XXj1F~$#) )"//1CCEI! R%(ZZ $)) !! r   r   VRTzVERROR: Destination dataset already exists, but -update nor -overwrite_ds are specifiedOGR_VRTz)ERROR: Destination dataset does not existr   r   z/vsimem/_ogrmerge_.vrtzJERROR: Destination dataset already exists, but -overwrite_ds are specifiedwbzERROR: Cannot create %sOGRVRTDataSourcer   TOGRVRTUnionLayerrJ   )rK   SourceLayerFieldNameFieldStrategyrD   r   rU   r   r   r   r   r   r   r   r   r   OGRVRTWarpedLayerOGRVRTLayer/\1relativeToVRTsharedSrcDataSourceSrcLayerLayerSRSSrcSRS	TargetSRSrI   	overwrite)
accessModelayerCreationOptionsskipFailurescallbackcallback_data).r   r   r   r	   r    r3  r#   r   GetConfigOptionr   r   r   r  r"  	GetDriverGetDescriptionUnlinkDeleter   r   r   r   	VSIFOpenLr9   rN   r   r   r   
VSIFCloseLr   r   rS   r   r5   AttributeErrorr   r   r   r   r   rv   r-   isabsrW   r   VectorTranslate)+ra   rb   rc   rd   re   rf   rI   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   r/  r5  compat_of_gpkg_optimr  vrt_filenamer  r  r   writerogr_vrt_union_layer_writtenr   r   r   r   r   r   r   r   r   rK   retrJ  s+   `                                          r   rx   rx   I  sS	   0  %2L#)rN:2D
)C"7cjjI:L,\UKK&"/		%. ++ ))&1	

 )

;""*"/J
 +v&2<@H$&&'DeLeT	$  01002	**51--d3v=+0(!#!   Le$7E,D
 &&(%%'94KK-JJ|,=CJJO>&&{3C{1K?cjjQZZaAt7G7GNF~/==&|4ZZ
 #|T*Ay',6SZZHq\F
*+&+#&/&= \	>"J
XXj)F~-
:L "L)(1&(9 S>$W!(;(;(=>B/ 226/''*6;N2O (  ,72224H &122?NS4
&0#/#6#6w#?L  77>>*-!ww//
;Hh#&88HNN3,?",E#F|+!+!3!3M8!LJ%!+!3!3%~\8R'R"J ",!3!3%x#~'D"J '!+!3!3OX!NJ!+!3!3OZ!PJ'//TJ=NO
'//dZ>OP
'//M
'//AST
$''(;<##M&*9M#N+u-z2GGMM*5</L0-0E/*&)E(O**?Je*T**:w7HI$..z5A$$]3$(228UC..{EB(()<=gS>\	>| '  !34 '0&= ?	>"J
XXj)F~-
:L "L)(1&(9 6>$W!(;(;(=>B/ &0#/#6#6w#?L ?'OO%!
 %OOA&KK-$''(;<##M&*9M#N+u-z2GGMM*5</L0-0E/*&)E(O**?Je*T**:|D$..z5A$$]3$(228UC..{EB(()<=m6>?	>B +,OOA
Ce$
!J$J""!!$&&&
 !8CCL!Jy & f & s$   d6e6	ee	eec                 N    t        j                  |       } | yt        | dd        S )Nr   r   )r   GeneralCmdLineProcessorr~   )ry   s    r   mainr`    s+    &&t,D|48r   __main__)NN)NNNNFNNNNNNNN)NNNFFFFFNFNNNNNNNNNNN)'rw   r   os.pathr   typingr   r   osgeor   r   r   osgeo_utils.auxiliary.baser   osgeo_utils.auxiliary.utilr	   r   r   r#   r1   r7   objectr9   r~   r   r   r   r   r   r   r   strboolr  r"  rx   ry   r`  rX   exitr[   r   r   <module>rk     s  B  	  
 %     4 9J%""@/C /ClDT,d  *
"= F	( -1,0!%)-.2$(#'"&!V8C=)V=)V #V "#	V
 V Xc]+V C=V C=V C=V 8C=
!V 
(3-	 V  V Vt
 -1,0!%!)-.2$(*.-1$(#'"&!+m8C=)m=)m #m 	m
 m m m m "#m m Xc]+m SMm #3-m &c]m C=m  C=!m" C=#m$ 8C=
!%m& 
(3-	 'm(  )m* +m` hh  zCHHT#((^ r   