
    hay                         d dl Z d dlZd dlZd dlZ ej
                  e      Zd Zd Z	d Z
d Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZd Zd Zd Zd Zd Z d Z!y)    Nc                 R   t        | t        t        f      rt        |       S t        | t              r	 t        |       S t
        j                  dt        |               t	        dt        |              # t        $ r' t
        j                  d|         t	        d|        w xY w)z;Convert value to float, handling numeric and string inputs.z$Unexpected string format for float: z Cannot convert string to float: zUnexpected type for float: )
isinstancefloatintstr
ValueErrorloggererrortypevals    J/home/developers/rajanand/mypropertyqr-fmb-refixing-v2/pydep/new_rotate.pyto_floatr      s    #s|$Sz	C		G:
 	249+>?6tCykBCC  	GLL?uEF?uEFF	Gs   
A6 60B&c                 *    t        t        |             S )z"Convert value to int via to_float.)r   r   r   s    r   to_intr      s    x}    c                    	 | j                         D cg c]$  }t        |d   d         t        |d   d         f& }}d}t        |      }t        |      D ]2  }|dz   |z  }|||   d   ||   d   z  z  }|||   d   ||   d   z  z  }4 t	        |      dz  S c c}w # t
        $ r+}t        j                  d|        t        d|       d}~ww xY w)z9Compute the area of a polygon using the shoelace formula.r              g       @zError computing area: zFailed to compute area: N)	valuesr   lenrangeabs	Exceptionr	   r
   r   )coordsvpointsareanijes           r   compute_arear#      s    9BH--/RQ8AaDG$hqtAw&78RRKq 	0AQ!AF1IaL6!9Q<//DF1IaL6!9Q<//D	0 4y3 S  9-aS123A37889s(   B )BAB B 	C(&CCc                 v   	 t        j                  |      }t        j                  |      }t        j                  || g||gg      }t        j                  | |z
  ||z
  g      }||z  }	|	t        j                  ||g      z   S # t
        $ r+}
t        j                  d|
        t        d|
       d}
~
ww xY w)zIRotate a point (px, py) around (ox, oy) by angle using a rotation matrix.zError in rotate_point_matrix: zRotation failed: N)	mathcossinnparrayr   r	   r
   r   )pxpyoxoyanglecos_asin_aR
translatedrotatedr"   s              r   rotate_point_matrixr4   )   s    	2HHuufou~67XXrBwR01
j.2r(+++ 25aS9:,QC0112s   BB 	B8&B33B8c
                 p   	 d}
t        j                  ||z
  || z
        }t        j                  |	|z
  ||z
        }||z
  }| || z
  |
z  z   }|||z
  |
z  z   }t        ||| ||      }|| z
  }||z
  }|d   |z   |d   |z   dS # t        $ r+}t        j                  d|        t        d|       d}~ww xY w)zSCalculate new position for point B, preserving scale with rotation and translation.g      ?r   r   xyz!Error in calculate_new_position: zPosition calculation failed: N)r%   atan2r4   r   r	   r
   r   )axaybxbycxcyax_neway_newcx_newcy_newscale_factorinitial_angle	new_anglerotation_angle	scaled_bx	scaled_byr3   translation_xtranslation_yr"   s                       r   calculate_new_positionrL   6   s    >

27BG4JJv@	"]2"r'\11	"r'\11	%iBNSQZ-/gaj=6PQQ >8<=8<==>s   A>B 	B5
&B00B5c                 D   	 | d   }| d   }	|d   }
|d   }|d   }|d   }|d   }|d   }i }i }|j                         D ]  \  }}t        |d         dk  rt        d| d|       t        |d   d         }t        |d   d         }||k(  r||	g|d   |d   g||<   `||k(  r|
|g|d   |d   g||<   vt	        ||||||||	|
|
      }|d   |d   g|d   |d   g||<    |j                         D ]s  \  }}t        |d         dk  rt        d| d|       t        |d   d         }t        |d   d         }t	        ||||||||	|
|
      }|d   |d   g|d   |d   g||<   u ||d	S # t
        $ r+}t        j                  d
|        t        d|       d}~ww xY w)zMUpdate coordinates and subdivision_list with new positions, preserving scale.r7   r8   r      Invalid coordinates for key : r   (Invalid subdivision coordinates for key )
new_coordssubdivision_listz1Error in update_lines_with_new_slope_and_length: zFailed to update coordinates: N)itemsr   r   r   rL   r   r	   r
   )
new_coord1
new_coord2
old_coord1
old_coord2coordinatesselected_point1selected_point2rS   x1y1x3y3x4y4x5y5rR   new_subdivisionkeyvaluex2y2	end_pointr"   s                           r   &update_lines_with_new_slope_and_lengthrj   K   sJ   !?________
%++- 	YJC58}q  #?uBug!NOO%(1+&B%(1+&Bo%$&8U1XuQx"@
3'$&8U1XuQx"@
322r2r2r2rSUWYZ	$-cNIcN#CU1XuUVx"X
3	Y +002 	ZJC58}q  #KC5PRSXRY!Z[[%(1+&B%(1+&B.r2r2r2r2rSUVI%.s^Ys^$DeAhPUVWPX#YOC 	Z )oNN ?HLM9!=>>?s   E(E+ +	F4&FFc                    	 | dk  s| dkD  rt        d      |dk  s|dk\  rt        d      d}d}d	}t        |dz   d
z        dz   }d}t        j                  |       }t        j                  |      }t        j                  |d
z  dz
        }	|d|z
  z  }
|
t        j                  |      dz  z  }|dz  |t        j
                  d|z         z  z  }t        j                  |      }|
t        j                  |      dz  z  }||	z
  t        j                  |      z  }|d|dz  z
  d|dz  z  dz  z
  d|dz  z  dz  z
  |z  d|z  dz  d|dz  z  dz  z   d|dz  z  dz  z   t        j                  d|z        z  z
  d|dz  z  dz  d|dz  z  dz  z   t        j                  d|z        z  z   d|dz  z  dz  t        j                  d
|z        z  z
  z  }d||z  |d|dz  z
  |z   |dz  z  d
z  z   dd|dz  z  z
  |dz  z   d|z  z   d|
z  z
  |dz  z  dz  z   z  z   }|||t        j                  |      z  |dz  dz  d|dz  z
  d |z  z   d|dz  z  z   |dz  z  d!z  z   d"d|dz  z  z
  |dz  z   d#|z  z   d$|
z  z
  |d
z  z  d%z  z   z  z   z  }| d&k  r|d'z  }| d&k  }||||fS # t        $ r+}t        j                  d(|        t        d)|       d*}~ww xY w)+z2Convert latitude and longitude to UTM coordinates.iZ   zInvalid latitudeiL   zInvalid longitudeg   @TXAgu?XAgk{?   r   gx#?   rN         @                -   i      #   i   i     H   :   x   	      =   iX  iJ  i  r   i zError in from_lat_lon: zUTM conversion failed: N)r   r   r%   radiansr&   sqrttanr'   r   r	   r
   )latlonabesqzonek0philambda_lambda0ep2nu2NtcAMeastingnorthingsouthernr"   s                        r   from_lat_lonr   p   sn   *89b/00:011C#I?#a'll3,,s#,,q30QWoDHHSM1$$qDA		!c'**+HHSM$((3-""w$((3-/QY36"$qax|3s:sU1Wqax{"RQYt^3txx#FGQYs]RQYt^+txx#>? QYt^txx#./
 26QTAA%))AqD[1a4"Q$&C/1a47#=>
 
 DHHSM!1qQTAaC!AqD&(AqD0256bAg1$s1u,s3w6!Q$>DE 
 7 H7$00 8.qc2321#6778s   JJ 	K&&KKc                 .    t        | |      \  }}}}||dS )z1Convert latitude and longitude to UTM dictionary.r6   )r   )r   r   r   r   _s        r   latlog_to_utmr      s"    *34GXq!x((r   c                     	 | sg S t        d | D              }| D cg c]  }|d   |d   |z
  g c}S c c}w # t        $ r+}t        j                  d|        t	        d|       d}~ww xY w)z0Offset points to have minimum y-coordinate at 0.c              3   &   K   | ]	  }|d      ywr   N .0ps     r   	<genexpr>z(offset_points_top_int.<locals>.<genexpr>        )QAaD)   r   r   z Error in offset_points_top_int: zPoint offset failed: N)minr   r	   r
   r   )r   min_yr   r"   s       r   offset_points_top_intr      s{    6I)&)).451qte|$555 67s;<04556s%   8 8 38 8 	A,&A''A,c                     	 |d   | d   z
  |d   |d   z
  z  |d   | d   z
  |d   |d   z
  z  z
  }|dk(  ry|dkD  rdS dS # t         $ r+}t        j                  d|        t        d|       d}~ww xY w)z;Determine orientation of triplet (p, q, r) for convex hull.r   r   rN   zError in orientation: z Orientation calculation failed: N)r   r	   r
   r   )r   qrr   r"   s        r   orientationr      s    Atad{qtad{+qtad{qtad{.KK!8!Gq"" A-aS12;A3?@@As!   4A  A  A   	A4	&A//A4c                 z    	 t               }|dk  r S g }t        t        |       fd      }|}	 |j                   |          |dz   |z  }t        |      D ]  }t	         |    |    |         dk(  s|}  |}||k(  r	 |S S# t
        $ r+}t        j                  d|        t        d|       d}~ww xY w)	z2Compute convex hull of points using Graham's scan.rq   c                     |    d   S )Nr   r   )r    r   s    r   <lambda>zconvex_hull.<locals>.<lambda>   s    q	! r   )re   r   rN   zError in convex_hull: z Convex hull computation failed: N)	r   r   r   appendr   r   r	   r
   r   )r   r   hulllr   r   r    r"   s   `       r   convex_hullr      s    AKq5Ma45KKq	"Q!A1X vay&)VAY?1DA AAv   A-aS12;A3?@@As)   B A!B 7B B 	B:&B55B:c           	      8   	 t        |       dz
  }t        |      D cg c]*  }| |dz      d   | |   d   z
  | |dz      d   | |   d   z
  g, }}|D cg c]  }t        j                  |d   |d           }}|D cg c]!  }t	        |t        j
                  dz  z        # }}t        t        |            }t        d      }dx}	x}
x}x}x}x}}|D ]  }t        j                  |      }t        j                  |      }| D cg c]%  }||d   z  ||d   z  z   | |d   z  ||d   z  z   g' }}t        d |D              }t        d |D              }t        d |D              }t        d |D              }||z
  }||z
  }||z  }||k  s|}|}	|}
|}|}|}|}|} t        j                  |	      }t        j                  |	      }||z   dz  }||z   dz  }||z  ||z  z   | |z  ||z  z   g}||z  ||z  z   | |z  ||z  z   g||z  ||z  z   | |z  ||z  z   g||z  ||z  z   | |z  ||z  z   g||z  ||z  z   | |z  ||z  z   gg}|	||
|||fS c c}w c c}w c c}w c c}w # t        $ r+}t        j                  d	|        t!        d
|       d}~ww xY w)z-Compute minimum bounding rectangle of points.r   r   rN   infc              3   &   K   | ]	  }|d      ywr   Nr   r   rps     r   r   z$min_bounding_rect.<locals>.<genexpr>        3"13r   c              3   &   K   | ]	  }|d      ywr   r   r   s     r   r   z$min_bounding_rect.<locals>.<genexpr>   r   r   c              3   &   K   | ]	  }|d      ywr   r   r   s     r   r   z$min_bounding_rect.<locals>.<genexpr>   r   r   c              3   &   K   | ]	  }|d      ywr   r   r   s     r   r   z$min_bounding_rect.<locals>.<genexpr>   r   r   zError in min_bounding_rect: z'Bounding rectangle computation failed: N)r   r   r%   r9   r   pilistsetr   r&   r'   r   maxr   r	   r
   r   )hull_points2dr   r    edgesr"   edge_anglesr   unique_anglesmin_area	min_angle	min_width
min_height	min_min_x	min_max_x	min_min_y	min_max_ythetar&   r'   r   
rot_pointsmin_xmax_xr   max_ywhcenter_xcenter_ycenter_pointcorner_pointss                                  r   min_bounding_rectr      sT   *H"uz{|u}~pq-!$Q'-*:1*==}QqS?QRS?TWdefWghiWj?jk~~7<=!tzz!A$!-==7BC!s1!,-CCS-.<]^^	^I^
^Y^^YQZ" 	"E((5/C((5/CWdeRS31:ad
2SD1Q4K#!*4LMeJe3
33E3
33E3
33E3
33EAAAA8|!		
!	!	!	!	'	"( hhy!hhy!	)Q.	)Q.hx7#3QY>9YZ9_sY.y0@3?0RS9_sY.y0@3?0RS9_sY.y0@3?0RS9_sY.y0@3?0RS	
 (Iz<VVK =C f:  H3A378B1#FGGHsU   I% /II% #I5I% ;&I!A"I% *I -AI% CI% I% %	J.&JJc                    	 | sg S t        |       dk  r*| D cg c]  }t        |d         t        |d         g  c}S t        |       }t        |      dk  rt        | ||      S ||d   gz   }t	        |      \  }}}}	}
}|dk(  rt        | ||      S ||	kD  r||z  }||	z  }n
||z  }||	z  }t        j                  |      }t        j                  |      }t        j                  ||g| |gg      }|j                  }g }| D ]}  }|d   |
d   z
  |d   |
d   z
  g}|t        j                  |      z  }|d   |z  |d   |z  g}|t        j                  |      z  }|j                  |d   |
d   z   |d   |
d   z   g        |D cg c]  }t        |d         t        |d         g  }}|S c c}w c c}w # t        $ r+}t        j                  d|        t        d|       d}~ww xY w)z0Scale polygon to target bounding box dimensions.rq   r   r   zError in scale_polygon: zPolygon scaling failed: N)r   r   r   scale_polygonr   r%   r&   r'   r(   r)   Tr   r   r	   r
   r   )polygon_pointstarget_bbox_widthtarget_bbox_heightr   hull_pointsr   r.   r   current_widthcurrent_heightr   r   scale_local_xscale_local_yr&   r'   r1   RTscaled_pointsr2   local_pscaled_localscaled_p
int_scaledr"   s                            r   r   r      s9   !9I~"4BCqS1YAaD	*CC!.1{a 1BDVWW#{1~&66FWXeFfCt]NL!19 1BDVWW>).>M->M-=M.?MhhuohhuoHHsCjC4+./SS 	aAA$a0!A$a2HIJ"((:..G#AJ6
]8RSLBHH\22H  (1+Q"?!|\]A^!_`	a 7DDs1Q4y#ad),D
D5 D2 E 9/s343A37889sJ   F6 F6 #F,F6 %F6 $,F6 C4F6 #F1(F6 ,
F6 6	G*?&G%%G*c                 t   	 t        d | D              }t        d | D              }||g}t        d      }d}| D ]8  }|d   |d   z
  }|d   |d   z
  }t        j                  ||      }	|	|k  s5|	}|}: |t	        d      |S # t
        $ r+}
t        j                  d|
        t	        d	|
       d}
~
ww xY w)
z2Find the point closest to the bottom-right corner.c              3   &   K   | ]	  }|d      ywr   r   r   s     r   r   z.find_bottom_right_point_pix.<locals>.<genexpr>&  r   r   c              3   &   K   | ]	  }|d      ywr   r   r   s     r   r   z.find_bottom_right_point_pix.<locals>.<genexpr>'  r   r   r   Nr   r   No closest point foundz&Error in find_bottom_right_point_pix: z#Failed to find bottom-right point: )r   r   r%   hypotr   r   r	   r
   )r   r   r   targetmin_distclosestr   dxdydistr"   s              r   find_bottom_right_point_pixr   #  s    D)&)))&))< 	A1q	!B1q	!B::b"%Dh	 ?566 D=aSAB>qcBCCD   A+B .B 	B7&B22B7c                 t   	 t        d | D              }t        d | D              }||g}t        d      }d}| D ]8  }|d   |d   z
  }|d   |d   z
  }t        j                  ||      }	|	|k  s5|	}|}: |t	        d      |S # t
        $ r+}
t        j                  d|
        t	        d	|
       d}
~
ww xY w)
z.Find the point closest to the top-left corner.c              3   &   K   | ]	  }|d      ywr   r   r   s     r   r   z*find_top_left_point_pix.<locals>.<genexpr><  r   r   c              3   &   K   | ]	  }|d      ywr   r   r   s     r   r   z*find_top_left_point_pix.<locals>.<genexpr>=  r   r   r   Nr   r   r   z"Error in find_top_left_point_pix: zFailed to find top-left point: )r   r   r%   r   r   r   r	   r
   )r   r   r   r   r   r   r   r   r   r   r"   s              r   find_top_left_point_pixr   9  s    @)&)))&))< 	A1q	!B1q	!B::b"%Dh	 ?566 @9!=>:1#>??@r   c           
         	 t        |       }|t        |      k7  s|dk  rt        d      t        j                  d|z  df      }t	        |      D ]I  }| |   \  }}||   \  }}||dddd| |z  | |z  | g	|d|z  <   ddd||d| |z  | |z  | g	|d|z  dz   <   K t        j
                  j                  |      \  }	}
}|d   }|j                  dd      }|S # t        $ r+}t        j                  d	|        t        d
|       d}~ww xY w)z<Compute homography matrix from source to destination points.rp   z%Need at least 4 points for homographyrN   r~   r   r   rq   zError in find_homography: zHomography computation failed: N)r   r   r(   zerosr   linalgsvdreshaper   r	   r
   )srcdstr   r   r    r7   r8   ur   USVtr   Hr"   s                  r   find_homographyr	  O  sC   @HC=AEDEEHHa!eQZ q 	BAq6DAqq6DAq1aAq1"q&1"q&1"=Aa!eHq!Q1qb1fqb1fqbAAa!eaiL		B
 99==#1brFIIaO @1!56:1#>??@s   CC 	D!&DDc                     	 t        j                  | d   | d   dg      }||z  }|d   dk7  r|d   nd}|d   |z  |d   |z  gS # t        $ r+}t        j	                  d|        t        d|       d}~ww xY w)z?Apply perspective transform to a point using homography matrix.r   r   rN   g|=z Error in perspective_transform: zPerspective transform failed: N)r(   r)   r   r	   r
   r   )ptr  r   resr   r"   s         r   perspective_transformr  c  s    ?HHbeRUA&'!e!fkCFuA
CFQJ'' ?7s;<9!=>>?s   AA 	A8&A33A8c                    	 | D cg c]  }t        |d         t        |d         g  }}|D cg c]  }|d   |d   g }}t        ||      }t        |d         t        |d         g}t        ||      }	|	d   |	d   fS c c}w c c}w # t        $ r+}
t        j                  d|
        t        d|
       d}
~
ww xY w)z;Map pixel point to geographic coordinates using homography.r   r   zError in pixel_to_geo: zPixel to geo mapping failed: N)r   r	  r  r   r	   r
   r   )polygon_pixpolygon_geoquery_pointr   pix_fggeo_swappedr  r   mappedr"   s              r   pixel_to_geor  n  s    	>5@A%!+uQqT{+AA-89!ad|99E;/;q>"E+a.$9:&q!,ay&)## B9
  >.qc238<==>s2   B
 #B B
 B ?B
  
B
 
	B>&B99B>c                    	 | j                   \  }}|j                   d   }||k7  rt        d      t        j                  | d      }t        j                  |d      }| |z
  }||z
  }|j                  |z  }	t        j
                  j                  |	      \  }
}}|j                  |
j                  z  }t        j
                  j                  |      }|dk  r)||dz
  xx   dz  cc<   |j                  |
j                  z  }|||z  z
  }t        j                  |dz         }||d|d|f<   ||d||f<   |||fS # t        $ r+}t        j                  d|        t        d|       d}~ww xY w)	zICompute best-fit transform (rotation and translation) between point sets.r   z%Dimension mismatch between point setsaxisr   r   NzError in best_fit_transform: zBest-fit transform failed: )shaper   r(   meanr   r   r   deteyer   r	   r
   )r   Brows_amrows_b
centroid_a
centroid_bAABBr  r  r  r  r1   r  r   r   r"   s                     r   best_fit_transformr&  {  s_   <GG	VDEEWWQQ'
WWQQ'
^^DD2I99==#1bDD133JiimmA7qsGrMGqss
AZ'FF1q5M"1"bqb&	"1"a%!Qw <4QC896qc:;;<s   D6D9 9	E-&E((E-c                    	 | j                   \  }}t        j                  |dz   |f      }| j                  |d| |||z  }d}t        j                  |dz         }	t        |      D ]  }
|d| j                  }t        j                  ||f      }d}t        |      D ]P  }||   }t        j                  j                  ||z
  d      }t        j                  |      }||   ||<   |||   z  }R ||z  }t        ||      \  }}
}
||z  }t        ||z
        |k  r |	S |}||	z  }	 |	S # t        $ r+}t        j                  d|        t        d|       d}~ww xY w)z:Iterative Closest Point algorithm for aligning point sets.r   Nr   r  zError in icp: zICP alignment failed: )r  r(   onesr   r  r   r   r   normargminr&  r   r   r	   r
   r   )source_pointstarget_points	init_posemax_iterations	tolerancerowsr   r  
prev_errorTcumr   current_srcmatched_tgt	distancesr    r   distsclosest_idx
mean_errorTstepr"   s                        r   icpr:    s   7%%aggq1udm$//BQ c/C
vva!e}~& 	 Abq'))K((D!9-KI4[ 0N		}q'8qA ii.!.{!;AU;//	0 #T)J,[+FKE1a#+C:
*+i7  $J4<D!	 "  7~aS)*1!5667s   DD( 
D( (	E1&EEc           
         	 t        j                  | D cg c]  }t        |d         t        |d         g  c}      }t        j                  |D cg c]  }t        |d         t        |d         g  c}      }d	d} ||      } ||      }t        j                  |      }t        j                  |      }	t        |	|      }
t        j                  t        |      df      }||ddddf<   |j                  }|
|z  }t        t        |            D cg c]"  }t        |d|f         t        |d|f         g$ }}|S c c}w c c}w c c}w # t        $ r+}t        j                  d|        t        d|       d}~ww xY w)
z%Align points_b to points_a using ICP.r   r   c                     t        |       }g }t        |      D ]b  }| |   }| |dz   |z     }t        |      D ]B  }||z  }|d   ||d   |d   z
  z  z   }	|d   ||d   |d   z
  z  z   }
|j                  |	|
g       D d |S )Nr   r   )r   r   r   )r   samples_per_edger   denser    p1p2kr   r7   r8   s              r   densifyz rotate_with_icp.<locals>.densify  s    FAE1X )AYQUaK(/0 )A,,A1RURU] 33A1RURU] 33ALL!Q(	)) Lr   rq   NrN   zError in rotate_with_icp: zICP rotation failed: )   )r(   r)   r   r:  r(  r   r   r   r   r   r	   r
   r   )points_apoints_br   r   r   rB  dense_adense_bdense_a_matdense_b_matr   points_b_homaligned_b_homr    	aligned_br"   s                   r   rotate_with_icprM    sk   6HH(CQuQqT{E!A$K0CDHH(CQuQqT{E!A$K0CD	 !*!*hhw'hhw'[)wwA{+QU#~~L(SXY\]^Y_S`aac-1-.M!Q$4G0HIa	a1 DC, b 61!5604556s@   E #EE #E5B#E 'E?E E 	F&FFc                    	 | sg S | d   g}| dd }|rv|d   d   }d}t        t        |            D ]O  }||   }|d   |k(  r|j                  |       ||= d} n*|d   |k(  s1|j                  |d   |d   g       ||= d} n |sn|rv|D cg c]  }|d   	 c}|d   d   gz   }|S c c}w # t        $ r+}t        j                  d|        t        d|       d}~ww xY w)	z.Arrange line segments into a continuous chain.r   r   Nr   FTzError in arrange_chain: zChain arrangement failed: )r   r   r   r   r	   r
   r   )	arrchain	remainingendfoundr    r"   r   chn_cars	            r   arrange_chainrU    s%   ;IQG	)A,CE3y>* aLQ43;LLO!! EqTS[LL!A$!.!! E ! " "''A1Q4'59Q<.8 ( ;/s345aS9::;s;   B- AB- "&B- 	B- B(B- (B- -	C!6&CC!c                 &   	 | j                  dg       }g }|D ]Q  }|j                  d      dk(  s|j                  dg       }t        |      dk\  s9|j                  |d   |d   g       S t        |      }| j                  di       }g }|D ]T  }|j                  |      }	|	t	        d	| d
      |	d   }
|j                  t        |
d         t        |
d         g       V |}t        d |D              }t        d |D              }|D 
cg c]  }
|
d   |z
  |
d   |z
  g }}
t        d |D              }|dz   }|D 
cg c]  }
|
d   ||
d   z
  g }}
|D 
cg c]  }
t        |
d         t        |
d         g  }}
t        ||d   gz         \  }}}}}}|D cg c]  }t        |d         t        |d         g  }}|||fS c c}
w c c}
w c c}
w c c}w # t        $ r+}t        j                  d|        t	        d|       d}~ww xY w)z.Extract PDF box points and bounding rectangle.linesstrokewidth3rY   rN   r   r   NzKey z not found in coordinatesc              3   &   K   | ]	  }|d      ywr   r   r   s     r   r   zget_pdf_box.<locals>.<genexpr>  r   r   c              3   &   K   | ]	  }|d      ywr   r   r   s     r   r   zget_pdf_box.<locals>.<genexpr>	  r   r   c              3   &   K   | ]	  }|d      ywr   r   r   s     r   r   zget_pdf_box.<locals>.<genexpr>  r   r   zError in get_pdf_box: zPDF box extraction failed: )getr   r   rU  r   r   r   r   r   r   r   r   r	   r
   )objrW  line_ordr   coord	point_ind
coords_anytempidxr   r   r   r   r   r   canvas_heightpoints_fr   r   cprect_pointsr"   s                         r   get_pdf_boxri    sG   <$ 	:Auu]#s*mR0u:?OOU1XuQx$89		:
 "(+	WW]B/
 	6Cs#Ay 4u,E!FGG!AKK!vad|45	6 )&)))&))8>?11Q4%<1.??)&))	8>?11Q41-.??8>?1U1Q4[%!+.??'8Xa[M9Q'R$1aA}:GHBBqE
C1J/HHFI-- @ @?H <-aS126qc:;;<sY   -G  G B=G G%G GG #G?G #GG G 	H%&HHc                    	 |j                  d      }|st        d      |j                  d      }|st        d      |D cg c]  }t        |d         t        |d         g  }}t        |      }t	        |       \  }}}t        |      }|D 	cg c]  }	t        |	d         t        |	d         g  }
}	|D 	cg c]  }	t        |	d         t        |	d         g  }}	t        |      \  }}}}}}t        ||      }t        ||      }t        |
||      }t        ||      }t        |      }d}t        |      D ]  \  }}	|	|k(  s||   } n |t        d      t        |      }d}t        |      D ]  \  }}	|	|k(  s||   } n |t        d	      |}|}|j                  d
g       }|D cg c]  }t        |d         t        |d         g  }}t        |||      \  }}t        |||      \  }}|||dg|||dggS c c}w c c}	w c c}	w c c}w # t         $ r+}t"        j%                  d|        t        d|       d}~ww xY w)z(Get reference points for georeferencing.polygonz1Missing key: polygon. Tile might not be availablepixz8Missing key: pix in polygon. Tile might not be availabler   r   Nz)Bottom-right point not found in point_indz%Top-left point not found in point_indgeor6   zError in get_relative_points: z#Relative points extraction failed: )r]  r   r   r   ri  r   r   r   r   r   rM  r   	enumerater   r   r  r   r	   r
   ) r^  rl  rk  pix_points_rawr   
pix_pointsr   r   ra  r   rf  pix_points_fr   r   longest_side
short_sidepoints_scaledbottom_right_pdf_pointbottom_right_pdfr    top_left_pdf_pointtop_left_pdffmb_top_leftfmb_bottom_rightgeo_ir  r  top_left_wld_lattop_left_wld_lonbottom_right_wld_latbottom_right_wld_lonr"   s                                    r   get_relative_pointsr    s   .D'')$PQQ U+WXX?MNvbe}fRUm4N
N*:6
*3/69&v.8>?1U1Q4[%!+.??<FGqqteAaDk2GG,\:1aAq1ayAY
%h
LI ];!<V!Df% 	DAq**#,Q< 	 #HII4V<f% 	DAq&&(|	 DEE)1E2&AFGA117GG-9*kS_-`**5A*k[k5l22!18HIJ%9@TUV
 	
C O @G2 H  D5aS9:>qcBCCDs[   A H #H %+H #H3H 9#H
A(H 8H >/H -#H/H  H 	I&IIc           
         t         j                  d       	 t        | |      }t        |      dk7  rt	        d      t        |d   d   d   |d   d   d         }t        |d   d   d   |d   d   d         }|d   d   }|d   d   }||vs||vrt	        d| d	| d
      t        ||   d   d         t        ||   d   d         d}	t        ||   d   d         t        ||   d   d         d}
t        |      }t         j                  d|d       t        j                  |
d   |	d   z
  dz  |
d   |	d   z
  dz  z         }|d   |d   z
  }|d   |d   z
  }t        j                  |dz  |dz  z         }|dk(  r t         j                  d       t	        d      ||z  }|d   ||z  z   |d<   |d   ||z  z   |d<   t        j                  |d   |d   z
  dz  |d   |d   z
  dz  z         }t         j                  d|d       t         j                  d|d       t         j                  d|d       t         j                  dt        ||z
        d       |j                         D ]?  \  }}t        |d         dk  st         j                  d| d|        t	        d|        |j                         D ]?  \  }}t        |d         dk  st         j                  d| d|        t	        d|        t        |||	|
||||      }t        |d         }t         j                  d|d       t         j                  dt        ||z
        d       |d   j                         D ]G  \  }}t        t        |d   d         d      |d   d<   t        t        |d   d         d      |d   d<   I |d   j                         D ]G  \  }}t        t        |d   d         d      |d   d<   t        t        |d   d         d      |d   d<   I |d   | d<   |d   | d<   | S # t         $ r}t         j                  d|         d}~ww xY w)zCRotate coordinates based on georeferenced points, preserving scale.zCalled select_and_rotate_coordsrN   z5get_relative_points did not return exactly two pointsr   r   r7   r8   zSelected points z, z not in coordinatesr6   Original area: .10f/Zero distance between new_coord1 and new_coord2Old distance: "New distance (before adjustment): !New distance (after adjustment): Distance difference: .10erO   rP   rQ   rR   
New area: Area difference: rq   rS   rY   z#Error in select_and_rotate_coords: N)r	   infor  r   r   r   r   r#   r%   r   r
   r   rT   rj   roundr   r   )datarY   rS   rajaresponseretrU   rV   rZ   r[   rW   rX   original_areaold_distnew_dxnew_dynew_distrationew_dist_afterre   rf   outnew_arear"   s                          r   select_and_rotate_coordsr  H  s   
KK12H!$5s8q=TUU"3q6!9S>3q6!9S>B
"3q6!9S>3q6!9S>B
a&)a&)+-1S//@?BSSfghh#K$@$CA$FGhWbcrWstuWvwxWyNz{
#K$@$CA$FGhWbcrWstuWvwxWyNz{
 %[1omD%9:; 99jo
3?!CzRUYcdgYhGhklFllmC:c?2C:c?299VQY23q=LLJKNOO8#$S/FUN:
3$S/FUN:
3 JsOjo$E#IZX[__ijm_nMnqrLr#rsnXdO458$HI7t7LMN+C0I,J4+PQR &++- 	GJC58}q ;C55'JK #?u!EFF	G +002 	SJC58}q GuBugVW #KC5!QRR	S 5
J
/;K
  L 12j$01'H},D(Ed'KLM l+113 	7JCeAhqk 2A6E!HQKeAhqk 2A6E!HQK	7 01779 	7JCeAhqk 2A6E!HQKeAhqk 2A6E!HQK	7 ",/]#&'9#:  :1#>?s&   I2P0 
AP0 EP0 0	Q9QQc           
      j   t         j                  d       	 t        j                  |       } t	        | d   d         t	        | d   d         d}t	        | d   d         t	        | d   d         d}t	        | d   d         t	        | d   d         d}t	        | d   d         t	        | d   d         d}| d	   }| d
   }| d   }| d   }t        |      }	t         j                  d|	d       t        j                  |d   |d   z
  dz  |d   |d   z
  dz  z         }
|d   |d   z
  }|d   |d   z
  }t        j                  |dz  |dz  z         }|dk(  r t         j                  d       t        d      |
|z  }|d   ||z  z   |d<   |d   ||z  z   |d<   t        j                  |d   |d   z
  dz  |d   |d   z
  dz  z         }t         j                  d|
d       t         j                  d|d       t         j                  d|d       t         j                  dt        ||
z
        d       |j                         D ]?  \  }}t        |d         dk  st         j                  d| d|        t        d|        |j                         D ]?  \  }}t        |d         dk  st         j                  d| d|        t        d|        t        ||||||||      }t        |d         }t         j                  d|d       t         j                  dt        ||	z
        d       |d   j                         D ]G  \  }}t        t        |d   d         d      |d   d<   t        t        |d   d         d      |d   d<   I |d   j                         D ]G  \  }}t        t        |d   d         d      |d   d<   t        t        |d   d         d      |d   d<   I t        j                   |      S # t"        $ r}t         j                  d|         d }~ww xY w)!z<Rotate coordinates based on new positions, preserving scale.zCalled getRotatedCoordsrU   r7   r8   r6   rV   rW   rX   rY   rZ   r[   rS   r  r  rN   r   r  r  r  r  r  r  rO   rP   rQ   rR   r  r  rq   r   zError in getRotatedCoords: N)r	   r  jsonloadsr   r#   r%   r   r
   r   r   rT   r   rj   r  r   dumpsr   )contentrU   rV   rW   rX   rY   rZ   r[   rS   r  r  r  r  r  r  r  re   rf   r  r  r"   s                        r   getRotatedCoordsr    s   
KK)*B**W%#GL$9#$>?hwWcOdehOiFjk
#GL$9#$>?hwWcOdehOiFjk
#GL$9#$>?hwWcOdehOiFjk
#GL$9#$>?hwWcOdehOiFjk
m,!"34!"34"#56 %[1omD%9:; 99jo
3?!CzRUYcdgYhGhklFllmC:c?2C:c?299VQY23q=LLJKNOO8#$S/FUN:
3$S/FUN:
3 JsOjo$E#IZX[__ijm_nMnqrLr#rsnXdO458$HI7t7LMN+C0I,J4+PQR &++- 	GJC58}q ;C55'JK #?u!EFF	G +002 	SJC58}q GuBugVW #KC5!QRR	S 5
J
/;K
  L 12j$01'H},D(Ed'KLM l+113 	7JCeAhqk 2A6E!HQKeAhqk 2A6E!HQK	7 01779 	7JCeAhqk 2A6E!HQKeAhqk 2A6E!HQK	7 zz# 21#67s&   I
P "AP 4EP 	P2P--P2)N2   g-C6?)"r  numpyr(   r%   logging	getLogger__name__r	   r   r   r#   r4   rL   rj   r   r   r   r   r   r   r   r   r   r	  r  r  r&  r:  rM  rU  ri  r  r  r  r   r   r   <module>r     s       			8	$D92>*#?J,8\)
	6	AA.,H\#9JD,@,@(	?><67@6@;< <D0DdKZEr   