
    *6i'                        S 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	r
SSKrSSKr\R                  R                  S\" \" \5      R$                  R$                  5      5        SSKJr  S rS\4S	 jr\S
:X  aC  \R0                  " SS9r\R5                  SSS9  \R7                  5       r\" \R:                  5        gg)uZ  
Extracts only road features (highways, streets, etc.) from an
OpenStreetMap .pbf file downloaded from Geofabrik.

✅ Features:
 - Automatic folder creation pe    except MemoryError as e:
        print(f"❌ Memory error during extraction: {e}")
        print("🔄 Attempting regional processing...")
        roads = extract_roads_by_regions(filename, location_dir, location)
        if roads is None:
            print("💡 Regional processing failed. Try processing a smaller country/region")
            sys.exit(1)ion
 - Saves standardized GeoPackage to: output/{LOCATION}/{location}_roads.gpkg
    N)Path)tqdm)OSM)get_geofabrik_urlc                    SSK nSSKJn  [        S5        [	        [        U 5      5      nUR                  5       nUR                  n[        SU 35        Uu  ppX-
  S-  nX-
  S-  n/ n[        S5       H  n[        S5       H  n XU-  -   nXS-   U-  -   nU	UU-  -   nU	US-   U-  -   nUUUU4n[        SUS-    S	US-    S
U 35        [	        [        U 5      [        U5      S9nUR                  SS0SSS/ SQS9nUbG  UR                  (       d6  [        S[        U5      S SUS-    S	US-    35        UR                  U5        O[        SUS-    S	US-    35        UR                  5         M     GM     U(       aO  [        S5        [         R"                  " [$        R&                  " USS95      n[        S[        U5      S S35        U$ g! [         a&  n[        SUS-    S	US-    SU 35         SnAGMw  SnAff = f)z9Extract roads by processing geographic regions separatelyr   N)boxu9   🏗️ Processing large dataset by geographic regions...u   📍 Dataset bounds:       u   🔍 Processing region -z/16: )bounding_boxhighwayTkeepF	r   namelaneswidthsurfacematerialbridgetunnellayercustom_filterfilter_type
keep_nodeskeep_relationsextra_attributesu     ✅ Found ,z roads in region u     ⚪ No roads in region u     ❌ Error in region : u   � Combining all regions...)ignore_indexu   ✅ Total extracted: z roads from all regions)gcshapely.geometryr   printr   strget_boundariestotal_boundsrangelistget_data_by_custom_criteriaemptylenappendcollect	ExceptiongpdGeoDataFramepdconcat)filenamelocation_dirlocationr!   r   osmboundaries_gdfboundsmin_lonmin_latmax_lonmax_latlon_steplat_step	all_roadsijregion_min_lonregion_max_lonregion_min_latregion_max_latregion_bbox
region_osmregion_roadsecombined_roadss                             '/data2/heatmap/scripts/extract_roads.pyextract_roads_by_regionsrL   #   sN   $	
EF
c(m
C '')N((F	!&
*+ *0&Gg !Q&H!Q&HI1XqA%!(x<!7!(EX+=!=!(1x<!7!(AEX+=!=-~~~^/!uAacU%}MN !XT+=NO
  *EE#,d"3 &$#(&  F 	   +L4F4FL\):1(==NqQRseSTUVWXUXTYZ[$$\25acU!AaC5AB 

E  R ,-))"))ID*QR%c.&9!%<<STU  .qse1QqSEA3?@s   C(G
G>G99G>r5   c           
      |   U R                  5       n [        R                  " 5       nUS-  U -  nUR                  SSS9  X  S3-  nUS-  n [	        U 5      n[        SU 35         UR                  5       (       Gd  [        S	U R                  5        S
35        [        R                  " WSSS9 nUR                  5         [        UR                  R                  SS5      5      nSn	[!        US5       n
[#        USSSU  S3S9 nUR%                  U	S9 H.  nU
R'                  U5        UR)                  [+        U5      5        M0     S S S 5        S S S 5        S S S 5        UR-                  5       R.                  S:  a  [        S5      e[        SU 35        O[        SU 35         [        S5        S nUR-                  5       R.                  S-  n[        SUS S35        US:  nU(       a=  [        S US! S"35         [3        X2U 5      nUb  UR4                  (       a  [        S#5      eO [7        [9        U5      5      n[        S%5        UR;                  S&S0S'S(S(/ S)QS*9nUb  UR4                  (       a  [        S+5      e[        S,[+        U5      S- S.U R                  5        S/35        [        S0UR=                  SS19R?                  5       S-  S S35         URC                  S6S79n[        S85         X  S:3-  nURE                  US;S<S=9  [        S>U 35        S(n U(       a>  UR                  5       (       a)  URG                  5         [        S@URH                   35        O[        SAU SB35         [        SE5        [        SFU 35        [        SGURH                   35        [        SHURH                   35        [        SI[+        U5      S- 35        [        SJ5        [        URK                  5       5        g ! [         a/  n[        SU 35        [        R                  " S5         S nAGNS nAff = f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN= f! [0         a/  n[        SU 35        [        R                  " S5         S nAGNS nAff = f! [0         a/  n[        S$U 35        [        R                  " S5         S nAGNS nAff = f! [@         a  n[        S2U 35        [        S35         [3        X2U 5      nUb  UR4                  (       a  [        S#5      e S nAGN_! [0         a3  n[        S4U 35        [        R                  " S5         S nA S nAGNS nAff = fS nAf[0         a/  n[        S5U 35        [        R                  " S5         S nAGNS nAff = f! [0         a  n[        S9U 35         S nAGNS nAff = f! [0         a/  n[        S?U 35        [        R                  " S5         S nAGNS nAff = f! [0         a  n[        SCU SDU 35         S nAGNS nAff = f)KNoutputT)parentsexist_okz.osm.pbfz	data.gpkgu   🔗 Geofabrik URL: u   ❌ r
   u    ⬇️ Downloading OSM data for z...
x   )streamtimeoutzcontent-lengthr   i    wbBi   )totalunit
unit_scaleunit_divisordesc)
chunk_sizei  u<   Downloaded file seems too small — possible download error.u   
✅ Download complete: u   ✅ Found existing file: u   ❌ Download failed: u   
🚧 Extracting roads...i   u   📊 PBF file size: z.1fz MBi  u   💡 Large file detected (z.0fz- MB) - using chunked extraction with 6x6 gridz#Chunked extraction returned no datau   ❌ Chunked extraction failed: u   🔍 Reading OSM metadata...r   r   Fr   r   zNo road data extractedu   ✅ Extracted r   z roads from z data.u   📊 Memory usage: )deepu   ❌ Memory error: u%   🔄 Attempting chunked extraction...u$   ❌ Chunked extraction also failed: u   ❌ Road extraction failed: i  )epsgu&   🌐 Reprojected to WGS84 (EPSG:4326).u   ⚠️ Reprojection failed: z_roads.gpkgroadsGPKG)r   driveru   💾 Saved extracted roads to: u   ❌ Saving failed: u!   🧹 Deleted processed PBF file: u+   📦 Kept PBF files (DELETE_DOWNLOADED_PBF=)u   ⚠️ Could not delete r   u   
✅ Process complete!u   📁 Folder: u   📥 Input: u   💾 Output: u   🛣️ Roads extracted: z<------------------------------------------------------------)&lowerr   cwdmkdirr   r#   
ValueErrorsysexitexists
capitalizerequestsgetraise_for_statusintheadersopenr   iter_contentwriteupdater+   statst_sizer.   rL   r*   r   r$   r)   memory_usagesumMemoryErrorto_crsto_fileunlinkr   head)r5   base_dirr4   r3   output_pathurlrI   r
total_size
block_sizefbarchunkr^   file_size_mbuse_chunkedr6   chunk_eDELETE_DOWNLOADED_PBFs                      rK   extract_roadsr   m   s   ~~HxxzHh&1Ltd3
(33H,K)$SE*+  4X5H5H5J4K5QRc$<""$ /?!CD
!
(D)Q$#!%$:X.1 !":!F

3u:. "G1) =  }}&&3 !_``-hZ89-hZ89 

&'E ==?**i8L	 c 2#
67 $K*<*<<ijk	,XXNE} !FGG !,"	c(m$C01 33($/" $" 4 	E } !9::N3u:a.X=P=P=R<SSYZ['(:(:(:(E(I(I(Kg(UVY'ZZ]^_&2$'67"z%==k@/}=> ": X__%6%6OO5hmm_EF?@U?VVWXY 

#$	M,
()	L
()	M+**+
,-	%c%j^
45	(O	%**,S  QCj1 1)) =<*  %aS)*.  	3A378HHQKK	4  		&qc*+9:0R=EKK$%JKK %0 <WIFG  	045HHQKK	  2,QC0112  #A3'(  :(
"QC899:s1  O5 %A	Q' .AQ2QAP1QQ?Q' Q' ;+R# (B-S V3 1&W AX X 5
P.?$P))P.1
Q ;Q
Q	Q
Q$Q' '
R 1$RR #
S-$SS
V0)U4+T44
U1>$U,"U4,U11U44V0$V++V03
W=WW
X#$XX
X;X66X;__main__z2Download and extract OSM road data for a location.)descriptionz/Location name (e.g., alabama, egypt, thailand).)help)__doc__argparserf   pathlibr   rj   r   pyrosmr   	geopandasr/   pandasr1   ospathinsertr$   __file__parentscripts.geofabrik_registryr   rL   r   __name__ArgumentParserparseradd_argument
parse_argsargsr5        rK   <module>r      s     
       	 3tH~,,334 5 8
ETVC Vr z$$HF 
)Z[D$--  r   