
    (eN                     
   d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	 e
ZddZddZddZd ZddZdd	Z	 	 dd
e	de	defdZddZej*                  fdZedk(  r# ej0                   eej*                               yy)    N)gdalosr)PathLikeOrStrc                 \   | |yd}t        | j                               }t        |j                               }g d}|D ]-  }||v r|j                  |       ||v s|j                  |       / t        |      t        |      k7  rAt	        d|z         t	        dt        |      z          t	        dt        |      z          |dz  }|D ]  }||vrt	        d|d|d	       |dz  }|d
k(  rf||   j                         | |   j                         k7  r?t	        d|z   d	z          t	        d| |   z   d	z          t	        d||   z   d	z          |dz  }|d
k7  s||   | |   k7  s|dk(  rt	        d|z   d	z          t	        d| |   z   d	z          t	        d||   z   d	z          |dz  } |S )Nr   )backendERR_BIASERR_RANDz#Difference in %s metadata key countz  Golden Keys: z  New Keys:    zNew z metadata lacks key ""RPCz'RPC Metadata value difference for key "z  Golden: "z  New:    "NITF_FDTz#Metadata value difference for key ")listkeysremovelenmy_printstrstrip)		golden_mdnew_mdmd_idoptions
found_diffgolden_keysnew_keysdont_care_keyskeys	            9/usr/lib/python3/dist-packages/osgeo_utils/gdalcompare.pycompare_metadatar   .   s   V^Jy~~'(KFKKM"H8N !+s#(?OOC 	! ;3x=(6>?"S%556#h-/0a
 hDE!OJe^s 1 1 3y~7K7K7M M >DsJK]Ys^3c9:]VC[0367!OJe^sy~ =j :S@3FG]Ys^3c9:]VC[0367!OJ%(     c                    d}d}d }d|v rd}|D ]#  }|j                  d      s|t        d      d  } n ||j                  dd      z   dz   }	t        j                  d      j                  |	| j                  | j                  d	t        j                        }| j                  }
t        | j                        D ]=  }t        j                  d
| j                  d||
d	t        j                              }t        j                  d
|j                  d||
d	t        j                              }t        |
      D cg c]  }||   ||   z
   }}t        |D cg c]  }t        |       c}      }t        ||      }|r |t        |D cg c]  }|rd	nd
 c}      z  }||j!                  d	      j#                  d||
d	t        j                  d
|      j%                         t        j                         @ t'        dt)        |      z          t'        dt)        |      z          |t'        d	z         y y c c}w c c}w c c}w )Nr   
DUMP_DIFFS zDUMP_DIFFS_PREFIX= _z.tifGTiffr
   d)buf_typez  Pixels Differing: z  Maximum Pixel Difference: z  Wrote Diffs to: %s)
startswithr   replacer   GetDriverByNameCreateXSizeYSizeGDT_Float32rangearray
ReadRasterGDT_Float64maxabssumGetRasterBandWriteRastertobytesr   r   )golden_bandnew_bandidr   
diff_countmax_diffout_dbprefixoptdiff_fnxsizelinegolden_linenew_linei	diff_linexmax_diff_this_lines                     r   compare_image_pixelsrK   ^   s:   JHFw 	C~~23S!5689	 2::c3//&8%%g.55[&&(9(91d>N>N
 Ek''( kk''4DDTDT'U
 ;;$$QeQAQAQ$R
 <A<Ha[^hqk1H	H )!<Q#a&!<=x!34#	B1QABCCJ  #//C+335)) 0 , #c*o56+c(m;<''12 # I!< Cs   9H9H>
Ic           
         d}|g n|}| j                   |j                   k7  s| j                  |j                  k7  r@t        d|| j                   | j                  |j                   |j                  fz         |dz  }| j                  |j                  k7  rit        d|z         t        dt	        j
                  | j                        z          t        dt	        j
                  |j                        z          |dz  }| j                         }|j                         }d ||fvr+t        j                  |      rt        j                  |      rnwd ||fvr+t        j                  |      rt        j                  |      rnF||k7  rAt        d|z         t        dt        |      z          t        dt        |      z          |dz  }| j                         |j                         k7  rqt        d|z         t        dt	        j                  | j                               z          t        dt	        j                  |j                               z          |dz  }| j                         }|j                         }||k7  rUt        d	|z         t        dt        |      z          t        dt        |      z          |dk(  rt        | |||       |dz  }n| j                  t        j                  t        j                   fv r| j#                         |j#                         k7  rft        d
dz         t        dt        | j%                               z          t        dt        |j%                               z          t        | ||i        d|vr| j'                         |j'                         k7  r^t        d|z         t        dt        | j'                               z          t        dt        |j'                               z          |dz  }n\t)        | j'                               D ]@  }	|t+        | j-                  |	      |j-                  |	      |dz   t        |	      z   |      z  }B | j/                         |j/                         k7  r^t        d|z         t        dt        | j/                               z          t        dt        |j/                               z          |dz  }nQ| j/                         t        j0                  k(  r0|t+        | j3                         |j3                         |dz   |      z  }d|vr0|t5        | j7                         |j7                         d|z   |      z  }d|v r~| j9                         |j9                         k7  r]t        d|z         t        dt        | j9                               z          t        dt        |j9                               z          |dz  }|S )Nr   z8Band size mismatch (band=%s golden=[%d,%d], new=[%d,%d])r
   zBand %s pixel types differ.
  Golden: 
  New:    zBand %s nodata values differ.z+Band %s color interpretation values differ.zBand %s checksum difference:zBand %s statistics difference:SKIP_OVERVIEWSz"Band %s overview count difference:z
 overview zBand %s mask flags difference:z
 mask bandSKIP_METADATAzBand CHECK_BAND_DESCz Band %s descriptions difference:)r-   r.   r   DataTyper   GetDataTypeNameGetNoDataValuemathisnanisinfr   GetColorInterpretationGetColorInterpretationNameChecksumrK   r/   r3   ComputeRasterMinMaxComputeBandStatsGetOverviewCountr0   compare_bandGetOverviewGetMaskFlagsGMF_PER_DATASETGetMaskBandr   GetMetadataGetDescription)
r:   r;   r<   r   r   golden_nodata
new_nodatagolden_band_checksumnew_band_checksumrG   s
             r   r^   r^      sJ   JObGHNN*k.?.?8>>.QF;$$k&7&7XY	
 	a
x000.34 4 4[5I5I JJK 4 4X5F5F GGHa
..0M((*J M:..

=!djj&<	mZ0	0

=!djj&<	*	$0256M 223J/0a
))+x/N/N/PP>CD--k.P.P.RST	
 	--h.M.M.OPQ	
 	a
&//1 ))+00/"45$8 99:$5 667? hGDa
 D$4$4d6F6F#GG..0H4P4P4RR9A=>K,H,H,J(KKLH,E,E,G(HHI$[(BC w&'')X-F-F-HH9B>?\C(D(D(F$GGH\C(A(A(C$DDE!OJ;779: l++A.((+%A.	 
 !X%:%:%<<1B67K$<$<$> ??@H$9$9$; <<=a
		!	!	#t';';	;l##%  "	
 	

 g%&##%x';';'=w|W
 	

 G#%%'8+B+B+DD7"<=\C(B(B(D$EEF\C(?(?(A$BBC!OJ r    c                    | |k(  ryt        d       t        j                  |       }t        j                  |      }|j                  |      rt        d       nt        d       t        d       t        d| r|j	                         ndz          t        d       t        d|r|j	                         z          y	dz          y	)
Nr   zDifference in SRS!z(  * IsSame() reports them as equivalent.z'  * IsSame() reports them as different.z	  Golden:z  Nonez  New:r
   )r   r   SpatialReferenceIsSameExportToPrettyWkt)
golden_wktnew_wkt
golden_srsnew_srss       r   compare_srsrr     s    W!"%%j1J""7+G!;<:;[TzZ113vNOXTGW..0HI BHHIr    c           
         d}|g n|}d|vrgd}| j                  d      j                  dd      }| j                  |kD  r5|j                         dk(  r"t	        d| d	| d
| j                                d|vr+|t        | j                         |j                               z  }d|vrc| j                         }|j                         }||k7  r>t        d       t        dt        |      z          t        dt        |      z          |dz  }d|vr-|t        | j                         |j                         d|      z  }d|vr/|t        | j                  d      |j                  d      d|      z  }d|vr/|t        | j                  d      |j                  d      d|      z  }| j                  |j                  k7  r+t        d| j                  |j                  fz         |dz  }|S t        | j                        D ]  }| j                  |dz         j                  }	|j                  |dz         j                  }
| j                  |dz         j                  }|j                  |dz         j                  }|	|
k7  s||k7  st        d||	||
|fz         |dz  } |dk(  r[t        | j                        D ]C  }|t!        | j                  |dz         |j                  |dz         t        |dz         |      z  }E |S )Nr   SKIP_INTERLEAVE_CHECK
   IMAGE_STRUCTURE
INTERLEAVEr#   pixelzGolden file has more than z and INTERLEAVE=z - this check will eventually succeed but will take hours due to the amount of I/O required for per-band comparisons. Recommend testing image encoding directly in your test, and then translating to a band interleaved format before calling this method: SKIP_SRSSKIP_GEOTRANSFORMzGeoTransforms Differ:rM   rN   r
   rP   DatasetSKIP_RPCr   SKIP_GEOLOCATIONGEOLOCATIONz'Band count mismatch (golden=%d, new=%d)z8Band size mismatch (band=%d golden=[%d,%d], new=[%d,%d]))rc   getRasterCountlower
ValueErrorrd   rr   GetProjectionGetGeoTransformr   r   r   r0   r7   r-   r.   r^   )	golden_dbnew_dbr   r   maxbands
interleave	golden_gtnew_gtrG   gSzXnSzXgSzYnSzYs                r   
compare_dbr   &  sG   JObG g-**+<=AA,PRS
  8+
0@0@0Bg0M,XJ6Fzl S
 &44679   k)"9"9";V=Q=Q=STT
 ')--/	''),-\C	N23\CK/0!OJ g%&!!#V%7%7%99g
 	

  &!!%(&*<*<U*CUG
 	

 (&!!-0}-	
 	

  2 225$$f&8&89:	
 	a
 9(() &&q1u-33##AE*00&&q1u-33##AE*004<44<JdD$-. !OJ Qy,,- 	A,''A.$$QU+AE
	 J	 r    c                    d}|g n|}| j                  d      }|j                  d      }t        t        |j                                     dz  }t	        |      D ]i  }d|dz   z  }t        j                  ||         }	t        j                  ||         }
t        |	|
|      }||z  }|dkD  sSt        d|||   ||   fz         k |S )Nr   SUBDATASETS   zSUBDATASET_%d_NAMEr
   z'%d differences found between:
  %s
  %s)	rc   r   r   r   r0   r   Openr   r   )r   r   r   r   
golden_sdsnew_sdscountrG   r   sub_golden_db
sub_new_dbsds_diffs               r   compare_sdsr     s    JObG&&}5J  /GZ__&'(A-E5\ "a!e,		*S/2YYws|,
mZAh
a<;Z_gcl;< r    golden_filenew_file	check_sdsc                    d}|g n|}d|vrQ	 t        j                  |        t        j                  |       t        j                  | |      st	        d       |dz  }t        j                  |       }t        j                  |      }|t!        |||      z  }|r|t#        |||      z  }|S # t
        $ r t        j                  t        |             }t        j                  t        |            }|r<|r9|j                  |j                  k7  rt	        d       |dz  }n)t        j                  t        |       d      }t        j                  t        |      d      }|r|rd}	|	|j                  k  rt        |j                  |	z
  d      }
t        j                  d|
|      }t        |      |
k  rt	        d       nBt        j                  d|
|      }||k7  rt	        d       |dz  }n|	|
z  }	|	|j                  k  r|rt        j                  |       |r1t        j                  |       n|st	        d       n|st	        d	       Y w xY w)
Nr   SKIP_BINARYz!Files differ at the binary level.r
   rbi   zCBinary file comparison failed: not enough bytes read in golden filez>Skipped binary file comparison, golden file not in filesystem.z;Skipped binary file comparison, new file not in filesystem.)osstatfilecmpcmpr   OSErrorr   VSIStatLr   size	VSIFOpenLmin	VSIFReadLr   
VSIFCloseLr   r   r   )r   r   r   r   r   stat_goldenstat_newf_goldenf_newoffto_readgolden_chunk	new_chunkr   r   s                  r   	find_diffr     s    JObGG#-	GGK GGH;;{H5<=a
T 		+&IYYx F*Y88Jk)VW==
a  &	--K(89K}}S]3Hx##x}}4@A!OJ#~~c+.>EH NN3x=$?EE!K$4$44&)+*:*:S*@+&NG+/>>!Wh+OL"<07: ($i!" !&(,q'5(II+y8 ()L M *a
 %7NC "K$4$44  1."X "UI&	s   AB, ,EIA
IIc                     | rt         j                  nt         j                  }t        d|       t        d|       t        d|       t        d|       t        d|       | rdS dS )	Nz/Usage: gdalcompare.py [--help] [--help-general])filezC                      [-dumpdiffs] [-skip_binary] [-skip_overviews]z>                      [-skip_geolocation] [-skip_geotransform]z>                      [-skip_metadata] [-skip_rpc] [-skip_srs]z5                      [-sds] <golden_file> <new_file>r   r   )sysstderrstdoutprint)isErrorfs     r   Usager     sZ    

3::A	
;!D	
OVWX	
JQRS	
JQRS	
AJ1Qr    c                 h   t        j                  |       } | yd }d }d}g }d}|t        |       k  r/| |   dk(  rt        d      S | |   dk(  rd}n| |   dk(  r|j	                  d       n| |   d	k(  r|j	                  d
       n| |   dk(  r|j	                  d       n| |   dk(  r|j	                  d       n| |   dk(  r|j	                  d       ny| |   dk(  r|j	                  d       n_| |   dk(  r|j	                  d       nE| |   dk(  r|j	                  d       n+|| |   }n#|| |   }nt        d| |   z          t               S |dz   }|t        |       k  r/t        |       dk(  r
t               S t        ||||      }t        dt        |      z          t        j                  |       y )Nr   r
   z--helpF)r   z-sdsz
-dumpdiffsr"   z-skip_binaryr   z-skip_overviewsrO   z-skip_geolocationr}   z-skip_geotransformrz   z-skip_metadatarP   z	-skip_rpcr|   z	-skip_srsry   zUnrecognised argument: zDifferences Found: )r   GeneralCmdLineProcessorr   r   appendr   r   r   r   r   exit)argvr   r   r   r   rG   r   s          r   mainr     s   ''-D| KHIG	A
c$i-7h''!WI!W$NN<(!W&NN=)!W))NN+,!W++NN-.!W,,NN./!W((NN?+!W#NN:&!W#NN:& q'KAwH .a897NEU c$i-Z 4yA~w;)WEJ	
#j/
12HHZr    __main__)N)FN)T)r1   r   rU   r   r   osgeor   r   osgeo_utils.auxiliary.baser   r   r   r   rK   r^   rr   r   r   boolr   r   r   r   __name__r    r    r   <module>r      s   @    	 
  5+`+3bx|2Vx@ 	DDD DT  hh ?D zCHHT#((^ r    