From 076970a20cbef359409e65afe110c7a63ef4d71d Mon Sep 17 00:00:00 2001 From: Nico Melone Date: Wed, 4 Feb 2026 18:00:22 -0600 Subject: [PATCH] added datasim and kmz tools --- Code Snippets/dataSim.py | 133 +++++++ Code Snippets/data_estimation_calculator.xlsx | Bin 0 -> 13662 bytes Code Snippets/network_usage_per_process.py | 153 ++++++++ Code Snippets/rrig_kmz/breakout_kml.py | 142 +++++++ .../kmz/Node C Monahans Booster Station.kmz | Bin 0 -> 975 bytes ...e D 10 to 12 Transition - Wadell Valve.kmz | Bin 0 -> 950 bytes .../rrig_kmz/kmz/Node F US Silica.kmz | Bin 0 -> 872 bytes .../kmz/Node X Cipher Interconnect.kmz | Bin 0 -> 824 bytes ...iginal - Rig PL wilth existing Azul PL.kmz | Bin 0 -> 1150 bytes .../rrig_kmz/kmz/RRIG Water Pump Station.kmz | Bin 0 -> 810 bytes Code Snippets/rrig_kmz/kmz_combine.py | 120 ++++++ Code Snippets/rrig_kmz/linestring.txt | 3 + Code Snippets/rrig_kmz/marker.txt | 5 + Code Snippets/rrig_kmz/out.kml | 352 ++++++++++++++++++ Code Snippets/rrig_kmz/polygon.txt | 0 15 files changed, 908 insertions(+) create mode 100644 Code Snippets/dataSim.py create mode 100644 Code Snippets/data_estimation_calculator.xlsx create mode 100644 Code Snippets/network_usage_per_process.py create mode 100644 Code Snippets/rrig_kmz/breakout_kml.py create mode 100644 Code Snippets/rrig_kmz/kmz/Node C Monahans Booster Station.kmz create mode 100644 Code Snippets/rrig_kmz/kmz/Node D 10 to 12 Transition - Wadell Valve.kmz create mode 100644 Code Snippets/rrig_kmz/kmz/Node F US Silica.kmz create mode 100644 Code Snippets/rrig_kmz/kmz/Node X Cipher Interconnect.kmz create mode 100644 Code Snippets/rrig_kmz/kmz/Original - Rig PL wilth existing Azul PL.kmz create mode 100644 Code Snippets/rrig_kmz/kmz/RRIG Water Pump Station.kmz create mode 100644 Code Snippets/rrig_kmz/kmz_combine.py create mode 100644 Code Snippets/rrig_kmz/linestring.txt create mode 100644 Code Snippets/rrig_kmz/marker.txt create mode 100644 Code Snippets/rrig_kmz/out.kml create mode 100644 Code Snippets/rrig_kmz/polygon.txt diff --git a/Code Snippets/dataSim.py b/Code Snippets/dataSim.py new file mode 100644 index 0000000..d1579e6 --- /dev/null +++ b/Code Snippets/dataSim.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +""" +mqtt_counter_publish.py +----------------------- + +* Uses `paho.mqtt.client` to connect to a broker. +* Publishes a list of *static* payloads to a topic. +* Measures bytes sent/received by the **process** with `psutil`. +* Prints a neat summary at the end. + +""" + +import os +import json +import time +import random +import psutil +import paho.mqtt.client as mqtt + +# ------------------------------------------------------------------ +# Helper: return write_bytes / read_bytes of the current process +# ------------------------------------------------------------------ +def get_io_counters(): + """Return (write_bytes, read_bytes) for the current process.""" + proc = psutil.Process(os.getpid()) + io = proc.io_counters() # .write_bytes, .read_bytes + return io.write_bytes, io.read_bytes #io.write_chars, io.read_chars #io.write_bytes, io.read_bytes + +def print_io_delta(start, end): + """Print the difference between two (write, read) tuples.""" + sent = end[0] - start[0] + recv = end[1] - start[1] + print(f"\nΔ sent: {sent:,} bytes") + print(f"Δ received: {recv:,} bytes\n") + +# ------------------------------------------------------------------ +# MQTT callbacks (minimal – we don't care about incoming messages) +# ------------------------------------------------------------------ +def on_connect(client, userdata, flags, rc): + if rc == 0: + print("✅ Connected to broker") + else: + print(f"❌ Connect failed (rc={rc})") + +# ------------------------------------------------------------------ +# Publish static payloads +# ------------------------------------------------------------------ +def publish_static_payloads(client, topic, payloads, delay=0.1): + """ + Publish each payload in `payloads` to `topic`. + `delay` (seconds) can be used to throttle the rate. + """ + for i, payload in enumerate(payloads, 1): + result = client.publish(topic, json.dumps(payload)) + # Wait for the network loop to actually send it + client.loop(timeout=0.1) + if result.rc != mqtt.MQTT_ERR_SUCCESS: + print(f"⚠️ Publish {i} failed with rc={result.rc}") + else: + print(f"→ Sent msg #{i} ({len(json.dumps(payload))} bytes)") + time.sleep(delay) + +# ------------------------------------------------------------------ +# Main routine +# ------------------------------------------------------------------ +def main(): + broker = "hp.henrypump.cloud" # change if needed + port = 1883 # default MQTT + topic = "v1/devices/me/telemetry" + + # Static payloads – feel free to replace with your own data + payloads = [] + now = time.time() * 1000 + for x in range(25): + values = {} + for y in range(20): + values[f"my_telemetry_{x+y}"] = random.random() + payloads.append({"ts": now, "values": values}) + + payloads = [{"test1k": "A" * 1024}] + # ------------------------------------------------------------------ + # Create MQTT client, connect + # ------------------------------------------------------------------ + client = mqtt.Client() + client.username_pw_set("e5xv3wfi1oa44ty2ydv2") + client.on_connect = on_connect + client.connect(broker, port, keepalive=60) + + # ------------------------------------------------------------- + # 1️⃣ Capture baseline I/O counters **before** any traffic + # ------------------------------------------------------------- + baseline = get_io_counters() + print("\n📊 Baseline I/O counters:") + print(f" Written: {baseline[0]:,} bytes") + print(f" Read: {baseline[1]:,} bytes") + + # ------------------------------------------------------------- + # 2️⃣ Start network loop in a background thread + # ------------------------------------------------------------- + client.loop_start() + + # ------------------------------------------------------------- + # 3️⃣ Publish the static payloads + # ------------------------------------------------------------- + print("\n📤 Publishing static payloads …") + for _ in range(1): + publish_static_payloads(client, topic, payloads, delay=0.2) + + # Give the broker a moment to ack / reply (if any) + time.sleep(10) + + # ------------------------------------------------------------- + # 4️⃣ Capture I/O counters **after** traffic + # ------------------------------------------------------------- + final = get_io_counters() + print("\n📊 Final I/O counters:") + print(f" Written: {final[0]:,} bytes") + print(f" Read: {final[1]:,} bytes") + + # ------------------------------------------------------------- + # 5️⃣ Report the delta + # ------------------------------------------------------------- + print_io_delta(baseline, final) + + # ------------------------------------------------------------- + # Clean‑up + # ------------------------------------------------------------- + client.loop_stop() + client.disconnect() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/Code Snippets/data_estimation_calculator.xlsx b/Code Snippets/data_estimation_calculator.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..395188bac66bfa1ecbda146f6fb0e337e5734f62 GIT binary patch literal 13662 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 n|9AL*4?i!uHM{;xq@Q3e92o element → list of [lat, lon] pairs, written to *output_polygons*. +* Every element → list of [lat, lon] pairs, written to *output_linestrings*. +* Every that contains a and a → “Marker Name: lat, lon” + written to *output_markers*. + +The coordinates in a KML file are stored as `lon,lat[,alt]`. +The script converts them to `lat,lon` because that’s the format you asked for. +""" + +import xml.etree.ElementTree as ET +import sys +from pathlib import Path + +# ---------------------------------------------------------------------- +# Helpers +# ---------------------------------------------------------------------- +def parse_kml(file_path: Path) -> ET.ElementTree: + """Parse the KML file; exit with a message on failure.""" + try: + return ET.parse(file_path) + except ET.ParseError as exc: + print(f"ERROR: Failed to parse {file_path}: {exc}", file=sys.stderr) + sys.exit(1) + +def _lon_lat_to_list(coord_str: str) -> list[list[float]]: + """ + Convert a KML coordinate string (lon,lat[,alt] …) into a list of [lat, lon]. + Ignores malformed entries. + """ + coords = [] + for pair in coord_str.strip().split(): + parts = pair.split(',') + if len(parts) < 2: + continue + lon, lat = float(parts[0]), float(parts[1]) + coords.append([lat, lon]) + return coords + +# ---------------------------------------------------------------------- +# Main extraction routine +# ---------------------------------------------------------------------- +def extract_kml( + kml_file: Path, + out_polygons: Path, + out_linestrings: Path, + out_markers: Path, +) -> None: + tree = parse_kml(kml_file) + root = tree.getroot() + + # Namespace handling (most KML files use the same namespace) + ns = {'kml': root.tag.split('}')[0].strip('{')} + + # ------------------------------------------------------------------ + # 1) Polygons + # ------------------------------------------------------------------ + polygons = [] # List[ List[ [lat, lon] ] ] + for poly in root.findall('.//kml:Polygon', ns): + coord_el = poly.find('.//kml:coordinates', ns) + if coord_el is None or not coord_el.text: + continue + polygons.append(_lon_lat_to_list(coord_el.text)) + + # Write polygons + with out_polygons.open('w', encoding='utf-8') as fp: + for i, poly in enumerate(polygons, start=1): + fp.write(f"Polygon {i}:\n") + fp.write(str(poly) + "\n\n") + + # ------------------------------------------------------------------ + # 2) LineStrings + # ------------------------------------------------------------------ + linestrings = [] # List[ List[ [lat, lon] ] ] + for ls in root.findall('.//kml:LineString', ns): + coord_el = ls.find('.//kml:coordinates', ns) + if coord_el is None or not coord_el.text: + continue + linestrings.append(_lon_lat_to_list(coord_el.text)) + + # Write LineStrings + with out_linestrings.open('w', encoding='utf-8') as fp: + for i, ls in enumerate(linestrings, start=1): + fp.write(f"LineString {i}:\n") + fp.write(str(ls) + "\n\n") + + # ------------------------------------------------------------------ + # 3) Markers (Point placemarks with a name) + # ------------------------------------------------------------------ + markers = [] # List[ (name, [lat, lon]) ] + for pm in root.findall('.//kml:Placemark', ns): + name_el = pm.find('kml:name', ns) + point_el = pm.find('.//kml:Point/kml:coordinates', ns) + if name_el is None or point_el is None: + continue + + name = name_el.text.strip() + coord_list = _lon_lat_to_list(point_el.text) + if not coord_list: + continue + markers.append((name, coord_list[0])) # a point has exactly one pair + + # Write markers + with out_markers.open('w', encoding='utf-8') as fp: + for name, (lat, lon) in markers: + fp.write(f"{name}: {lat}, {lon}\n") + + # ------------------------------------------------------------------ + # Summary + # ------------------------------------------------------------------ + print(f"Polygons written to: {out_polygons}") + print(f"LineStrings written to: {out_linestrings}") + print(f"Markers written to: {out_markers}") + +# ---------------------------------------------------------------------- +# Entry‑point +# ---------------------------------------------------------------------- +def main() -> None: + if len(sys.argv) != 5: + print( + "Usage: python breakout_kml.py " + " " + ) + sys.exit(1) + + input_file = Path(sys.argv[1]).expanduser().resolve() + out_polygons = Path(sys.argv[2]).expanduser().resolve() + out_linestrings = Path(sys.argv[3]).expanduser().resolve() + out_markers = Path(sys.argv[4]).expanduser().resolve() + + if not input_file.exists(): + print(f"ERROR: Input file not found: {input_file}", file=sys.stderr) + sys.exit(1) + + extract_kml(input_file, out_polygons, out_linestrings, out_markers) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/Code Snippets/rrig_kmz/kmz/Node C Monahans Booster Station.kmz b/Code Snippets/rrig_kmz/kmz/Node C Monahans Booster Station.kmz new file mode 100644 index 0000000000000000000000000000000000000000..f2f632e6082c2c1eac5ddcb3cfe11f5ae02e1051 GIT binary patch literal 975 zcmWIWW@Zs#U|`??Vg`n%&$n-hXJ%k10CL%Z{FMA;z3kkaw_$hlZ<`6!m;K{%V*M7< zy=dRli&|34bGdY)4VIs0&NdWE>HGG(^F^#xJl4ETKAj)Y@3Qra zmGb|H#&b7&?inp?Kire|Gg))$y9n=(1!XSA9kmy8f2Ij6{81yH^3n50>om73zTETw z?pyS%y-UMxXJy&VpVl2c@9OSpynNxlR+`QIk^6!Rva+QNJ1_T`&ALDR_>rw~x%K?1jKyzug^M`~y9DfVf1#uCz>kZY_ewW&K5xMM z`yVCl8*hK9njLMb`XGEte9Okk7WUEi{?1dB9|4^1noJLb!<9bybin~GoQEQ zdcl?VyY4MWJMiB1w$j=CZ&_j-imqRu6)NMsPd@SAQPut72ev5uaJrq)yTrcsw&ri+ zsQABj>MXJGck38jMU%cWUy?hkm^ksOK#v3q@1|25+1%&OuU@LEbTIIGR`0dd*)r^Q zM=uM+KAduE-}dCLXx9F9cSHBgnXK^Tvrgw@i}TGEr;NJh?@*SgDcj!h!&7jQiCW++ zw@kM8r)NH&u*UWtQ`hK?E79H-6iC>6Eui=Cz5m&Akx(Q5;qx!1j#tkBmP?iA?Xc2~#GZNj7F vu0HLI`uhKv0=yZS7#MKpLQu|R1QB2W&65G%tZX1YBM_Pb=@wwNWncgRx{SM3 literal 0 HcmV?d00001 diff --git a/Code Snippets/rrig_kmz/kmz/Node D 10 to 12 Transition - Wadell Valve.kmz b/Code Snippets/rrig_kmz/kmz/Node D 10 to 12 Transition - Wadell Valve.kmz new file mode 100644 index 0000000000000000000000000000000000000000..b8a5d32743bb96e51cdf56cd3f702b238b7f18a4 GIT binary patch literal 950 zcmWIWW@Zs#U|`??Vg`n9i{|CHF*7iz0lDlzeoB6_UUqKI+tB;{x6OF!{QhwrWc_v} z;-94Y%two|Z>>9UOLoGRTA7gObm@tz{y};>|9)NkWGW`_%<+l{qdM6@7lG; zVynzu!==)i*WzBV%Ox$EkgB|D>-WO%Y1=-;Jqg~#E~3yHSH0EnF4yD7A77mA>s)nl zUjiF5lY8BhuNy*3s~XlUS!3~;`=*tG^-M#FZTqh4n{KLYusyafM6|C-;i$gjOUEtJ zkup(gK6Y~j9HXbzPf&H17GXQ#A>x*?e8q*{#yJ;xYL}@#mZ@Fzr|;+QZ}LrZd2i&M zwM~DY**>f2?bfJ2TN&R^=G?ikchjMkH#ckbmSkzF-#C>Q9KE@}>-qULoCgozy7j30 zqq2T!@Ku?*&$;ejC--seYq4y3^JuGD?T+_cns@%)%yx9-`70q~b@6S~gvn}4!rqwK z2j98m*T0(m_3bv}x34Z;-1LMe|Bqh?i?#7{ZvJx~x@WgdW;V-Zt@)gl$KLPjt9ml|!Nt4IU zQ`#<;*6EnW5qUdgP1oE8UWr}T_nhtA=vC8b_#RXHH zboL%fTy^^qapE?94y9PM_$KvVQ!zv17%QWjFYm%d3W|8z4u#M3^tOYVP& zYH;NXnfU8`fd?8VD4F`i|A=b~+|sehqVw|eY1dt)bSGIZ*%fo_^Ya7uZ!D9)J6*W5 z_I%hL!D^PuwYIlP3u)vNJFM5kpFTvR-y>&fCyj|Jw!v|6=M|Mfc?h z-Kg}B-s$KOt-fTVqUg6$qfXB?R%K5lqQ1Q@FT5obx6JqU^-iU^@8?z5RGzcDyg66- zBD4A23t10YZ+sUBZ`EsEC3f%Z*H0y{=00^V;ni?hmG|)KwQa>tX0v&(>4r~zvEk7) zhNc#aFKjpV+_G~Hiwd9g*vXvl#P%{Cw(Ijh8Lgh3e#5tA>q?Iozd0@27qDNgyKuDj z@YJ*YY9Sljp2wG*yeM>c%>^%yK!ZJbbpel@7$R@FpVW`+cG>x1mS1f=)5#R4^)n3i z8ZONKH$yvDN=@@+?(;Xlwn!^~er(q|>F}=es=uFz>ug<-#rgkR?xJ7QU8cM_Z8PP~ ztGB^zMfzN8=hPpMGB9A4VO(fDcRRafwo~@u_n+oY;?3S&I60wKUFH3pKf2o9Cr=7( zU$yASQcJxeg~eO9tqzN3iS1ty-d`|fLGpL62n)ltH;QgHe*Za(=l=IKIlm%H%DxDS zPc#1?^l4>HMeNs($&)^|S@*_stf^Bj_z?eKzrYW#O-<%!*2rd+ct7{Q{-wZGean;B zM3?MDpQqQiz7Y76bN1rg03W4}D1%=bRplP_{hE@`cb>mqRh!rDw6sk#`MvkN`D}F^ z#`Y&4Wtwyg+s_L6BqDp@z`L-(hRG}KeVa_?r8>@8#&Gwz%%qcdPc46v!0-EHjr^LO z{mmI-DhucP9aiv3l7IKY?pZ^a$82`PZ<{kGFlaR2Wm<9ar|cnv(2q4@>56@qRJb0S zaBt3WJ1I~wBg^{!`+Ckx&)UAX+I`60`zS|qtJ#!2M|gCtJ4|Nzo|O*f+mt_(MeVC^ z$s@6l?fsPxBI1AFHMrt*)46nM;_UUyo}^9xyrryzNlWMVwoiF40<63zWzKNf`{yF3 ziPG1_C%!Ac2oRanNTIYJ!a_+wR zecGFOC;DWp-)ClTX?HL`DSl6VdXwEZ#*$Q%Qw1%-GCvAsDlBE1{vLbB*28C~>aQ>Q qc715w7vTVJMqp;ZojpKVh7m-70W`A&c(byB_>4ek3Z!M3K|BDy!i={7 literal 0 HcmV?d00001 diff --git a/Code Snippets/rrig_kmz/kmz/Node X Cipher Interconnect.kmz b/Code Snippets/rrig_kmz/kmz/Node X Cipher Interconnect.kmz new file mode 100644 index 0000000000000000000000000000000000000000..cfcd9a49bdedfb3693d154a7f9ac686c2a14300c GIT binary patch literal 824 zcmWIWW@Zs#U|`??Vg?4AsX9d`m>3vz*%=ssh#@6ESuZ;`=WVEO{%r#u+vWQY6|C<~ z`KjE;eAIR0TIa@6?h9fsaxdguHB<6#TVs-0|2M<3aPGFlZEtruGj-K0IpN;5?D_5} zi~gAHQzv;(S2$m~<4j20$)uO}?#B5&e^*)MbiILTNzU}VOrOmMDt6yhx>^t!qC4qM zf6>BlNM6ja+l5HCDZSD;t#nEc1?KeJ~cN> z&$r5G;iRiJe^(W~yJIcCYT1)pJ14ch_VGMv+mrs~CpumKqdC>R$Ocs60v+3m$IFYj%7w5CqpG+9AN#KA#3DwloJrIu;4?3YygWnbI!xa{E1g+hC_ z_GU!P&0ESFt)ViE6ZZGEU>kEyl>y) zEib39GF_~+j%WRU)u$^fYG!}cP&@jV`@773rHFrR37_Ua*soBb8gVRp*>y3~s`cI9 z<=%XVSje#Sn)tH)UK%$f(k6c{@!G>sxj9nee0rjj(Ea5>}GR!vIVp>sXwx9{_q&&7=pk7H_jO6}mG!^Ay$x?M&h`5hcyJwPf!#?0+ zjA*~Bx6jAC>Njt0(keUVn_t>uUsPEc-A2C_`{?0gbSldJ5almL*TZV`;mdQ0;pFM~ zC1qg>rhe*Q%lzl8iHgVj_}Epyzm})l=D9mGMddsey17XovZ5UxZqldxbyL;tF)LFx zJcq$>cx}H8-`e|EN zftgm@W_T2df_QigqXQJ4Zqh@W?>19Kj#<;Ki;eePQRZDJ74{#KDE?34Dv1wew#|=O`xL1Ev{RQ|y50`o?9r?J zFow}WW(>8@yDl%wtVd~5wtAa9)-BFKymw=fZUt9~P);b4+IgYWJ0%ipxKS9C#&Tia z@o2(Gc;$_CLW>C_Cj=LooU>=lDDs9RSv^viNY*+KuOwfdB%e7Qmxw8XcWMJPY ze4a4r3F$}3#;ho5tE7MS`eZT!t>FB;$FZboO!um&TDO?f)+*t z2Af`BvR0_dOrgfwYiMc;?O{9#M?{>onL`6+9jZi##dseuCt-$5hn^v^U`AMUi}6U) zsAj!F-}xcwPRK9t>0 zMvdmE6oNxhXUuwJjl(5cf5e>ju!AZqH2N7c*ccw+!$v3-$8I8nJA%+!0~^oDs~tX{ zQ}Y3l4wsF)vZ$V-HpdMmYnnJ3j@j`7(tUfk$+NaUu$O9ci100001 Q0096s0000p1ONa40OzYA761SM literal 0 HcmV?d00001 diff --git a/Code Snippets/rrig_kmz/kmz/RRIG Water Pump Station.kmz b/Code Snippets/rrig_kmz/kmz/RRIG Water Pump Station.kmz new file mode 100644 index 0000000000000000000000000000000000000000..a0a8e8b51265a5198c506973e333351922b1a109 GIT binary patch literal 810 zcmWIWW@Zs#U|`??Vg`o#sKj@>m>3uivN15Q1NkZW$$HtjIZs3H=if3As9RR=I%S{O z{}cK`DM6*TqI{!FL!#amemcM_*e7eb?7+WYu`*7LrJ?t~H*9!sS6}{pZf)ZA+g?@r zhfJ1+3C~x0RPA*3>!OgON9wEg$S(U=T6Zw4foVyW+P_P;s(L=AZFbxxwn{^KNz2iO z1B_gM_{{XSsh@Cq?ZjnreJXR;T3fc}my7q@dG(5AH|In%Rz8l-kGvMOC%$c-w_bZ; zPMu*wSGZDr#gD4ze;sj#T}}(iywh_X^Gp-GmFIol`$2U5?8oyC z{o6TZQQ_TN?g!lk1J`o3$u=)O${x4vN?BO;>w~qN4?ewpz+bgDY-#K6u<6l?(i`Tz zD-8eQ$@)fkdXT*IhncDR=Vlt^Z}};I>cW4=nJb?Z2NrHFI`CcY{KJPlH_X?Dn{PWE zl~u8;Y_Gu236lgaYIGbj@Kl;~spVmKK0BM*c5Y3tM=CO`flh}5=cF;bt>ruUw9Z|^ zZjJR!mi*B$JL73{B4`=R?HOTzBB#nt#!tE%f)cW+Kw z<(H9z<7#INMbY%zt literal 0 HcmV?d00001 diff --git a/Code Snippets/rrig_kmz/kmz_combine.py b/Code Snippets/rrig_kmz/kmz_combine.py new file mode 100644 index 0000000..3c7777a --- /dev/null +++ b/Code Snippets/rrig_kmz/kmz_combine.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +""" +combine_kmz_to_kml.py + +Combine all KMZ files in a folder into a single KML file. + +Usage: + python combine_kmz_to_kml.py + +Example: + python combine_kmz_to_kml.py ./kmz_files all_points.kml +""" + +import os +import sys +import zipfile +import xml.etree.ElementTree as ET +from pathlib import Path +from typing import List + +# ------------------------------------------------------------ +# Helper functions +# ------------------------------------------------------------ + +def find_kmz_files(folder: Path) -> List[Path]: + """Return a list of .kmz files in the given folder (non‑recursive).""" + return list(folder.rglob("*.kmz")) + +def extract_kml_from_kmz(kmz_path: Path) -> ET.ElementTree: + """ + Extract the first KML file found inside a KMZ archive. + Returns an ElementTree of the extracted KML. + """ + with zipfile.ZipFile(kmz_path, "r") as z: + # Find the first file ending with .kml (case‑insensitive) + kml_name = next((n for n in z.namelist() + if n.lower().endswith(".kml")), None) + if not kml_name: + raise ValueError(f"No KML file found inside {kmz_path}") + with z.open(kml_name) as kml_file: + return ET.parse(kml_file) + +def get_top_level_elements(kml_tree: ET.ElementTree) -> List[ET.Element]: + """ + Return a list of the top‑level elements that contain placemarks. + Common patterns are: + + + + """ + root = kml_tree.getroot() + # KML namespace handling (most KMLs use the same namespace) + ns = {"kml": "http://www.opengis.net/kml/2.2"} + # Find or or elements directly under root + elements = [] + for tag in ["Document", "Folder", "Placemark"]: + elements.extend(root.findall(f"kml:{tag}", ns)) + return elements + +def build_merged_kml(elements_by_file: List[List[ET.Element]]) -> ET.ElementTree: + """ + Build a new KML ElementTree that contains a single + wrapping all collected elements. + """ + kml_ns = "http://www.opengis.net/kml/2.2" + ET.register_namespace("", kml_ns) # ensure no prefix in output + + kml_root = ET.Element(f"{{{kml_ns}}}kml") + doc = ET.SubElement(kml_root, "Document") + + for elems in elements_by_file: + for elem in elems: + doc.append(elem) + + return ET.ElementTree(kml_root) + +# ------------------------------------------------------------ +# Main logic +# ------------------------------------------------------------ + +def main(input_folder: Path, output_file: Path): + kmz_files = find_kmz_files(input_folder) + if not kmz_files: + print(f"No .kmz files found in {input_folder}") + sys.exit(1) + + all_elements = [] + + for kmz in kmz_files: + try: + kml_tree = extract_kml_from_kmz(kmz) + elems = get_top_level_elements(kml_tree) + if not elems: + print(f"WARNING: No placemark elements found in {kmz}") + else: + all_elements.append(elems) + except Exception as e: + print(f"ERROR processing {kmz}: {e}") + + if not any(all_elements): + print("No placemark data to write.") + sys.exit(1) + + merged_tree = build_merged_kml(all_elements) + merged_tree.write(output_file, encoding="utf-8", xml_declaration=True) + print(f"Combined KML written to {output_file}") + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Usage: python combine_kmz_to_kml.py ") + sys.exit(1) + + input_dir = Path(sys.argv[1]).expanduser().resolve() + output_kml = Path(sys.argv[2]).expanduser().resolve() + + if not input_dir.is_dir(): + print(f"Input path {input_dir} is not a directory.") + sys.exit(1) + + main(input_dir, output_kml) \ No newline at end of file diff --git a/Code Snippets/rrig_kmz/linestring.txt b/Code Snippets/rrig_kmz/linestring.txt new file mode 100644 index 0000000..ca89715 --- /dev/null +++ b/Code Snippets/rrig_kmz/linestring.txt @@ -0,0 +1,3 @@ +LineString 1: +[[31.65053381256015, -103.1381372489133], [31.65078110147886, -103.1371939568141], [31.65137766837301, -103.135379572764], [31.65501734857683, -103.1216582043267], [31.66820232963991, -103.1267090001346], [31.66857428692562, -103.1254217441416], [31.68730649748832, -103.097869762411], [31.69401658057209, -103.0880082019376], [31.71262120882616, -103.0201699677156], [31.71246042343891, -103.0199628293717], [31.71229701578655, -103.0197573453124], [31.71245394748738, -103.0195184188874], [31.63091832800928, -102.9041726111906], [31.6165910414367, -102.8944523887092], [31.59718777074555, -102.8811494904473], [31.58231202839571, -102.8680137394599], [31.56931339800882, -102.8516886598823], [31.48448961907497, -102.7180735327187], [31.51503752317085, -102.7283930769256], [31.51898260340799, -102.7117114856601], [31.5330847136263, -102.7165257753119], [31.53686069788628, -102.7003948024066], [31.56540947523578, -102.7095293371793], [31.58496921843023, -102.6901307183483], [31.60301750051444, -102.6955769601148]] + diff --git a/Code Snippets/rrig_kmz/marker.txt b/Code Snippets/rrig_kmz/marker.txt new file mode 100644 index 0000000..a2b4377 --- /dev/null +++ b/Code Snippets/rrig_kmz/marker.txt @@ -0,0 +1,5 @@ +Node X: Cipher Interconnect: 31.69772151150734, -103.0755810899755 +Node D: 10" to 12" Transition - Wadell Valve: 31.48528462529936, -102.7191228273435 +Node F: US Silica: 31.60330030384848, -102.6955825380853 +RRIG Water Pump Station: 31.65239911273985, -103.1419105981684 +Node C: Monahans Booster Station: 31.59192479909473, -102.8767681214162 diff --git a/Code Snippets/rrig_kmz/out.kml b/Code Snippets/rrig_kmz/out.kml new file mode 100644 index 0000000..4361b98 --- /dev/null +++ b/Code Snippets/rrig_kmz/out.kml @@ -0,0 +1,352 @@ + + + Node X Cipher Interconnect.kmz + + + normal + #sn_X + + + highlight + #sh_X + + + + + + Node X: Cipher Interconnect + + -103.0664786491922 + 31.67995227525221 + 0 + -20.19425301511447 + 0.3113470562703879 + 19074.24725536319 + relativeToSeaFloor + + #msn_X + + 1 + -103.0755810899755,31.69772151150734,0 + + + + + + Node D 10 to 12 Transition - Wadell Valve.kmz + + + normal + #sn_D + + + highlight + #sh_D + + + + + + Node D: 10" to 12" Transition - Wadell Valve + This is a proposed booster station location. + +Before this proposed booster station is NEW 10" CS SCH/40 and after the pump it transitions to the existing 12" CS SCH/STD. + + -102.714901153744 + 31.49028973104173 + 0 + 0.2075710380470465 + 34.53924441923252 + 3707.334765680453 + relativeToSeaFloor + + #msn_D + + 1 + -102.7191228273435,31.48528462529936,0 + + + + + + Node F US Silica.kmz + + + normal + #sn_F + + + highlight + #sh_F + + + + + + Node F: US Silica + This is the final destination (US Silica). + + -102.7057483945038 + 31.58085164971466 + 0 + 0.1391520682125403 + 14.07815682751618 + 9472.365324672779 + relativeToSeaFloor + + #msn_F + 1 + + 1 + -102.6955825380853,31.60330030384848,0 + + + + + + RRIG Water Pump Station.kmz + + + normal + #sn_ylw-pushpin + + + highlight + #sh_ylw-pushpin + + + + + + RRIG Water Pump Station + + -103.1424336640816 + 31.65637246137589 + 0 + -0.01350029730544429 + 33.60918004711282 + 3855.687513264544 + relativeToSeaFloor + + #msn_ylw-pushpin + + 1 + -103.1419105981684,31.65239911273985,0 + + + + + + Node C Monahans Booster Station.kmz + + + normal + #sn_C + + + highlight + #sh_C + + + + + + Node C: Monahans Booster Station + Here is an exisiting booster station. The pumps here will require an upgrade/new pumps. +Before the booster station is 16" SDR-11 HDPE and after the pump it transitions to the existing worn 10" CS SCH/40. + + -102.8754448804377 + 31.59216413663673 + 0 + 0.02738240047835951 + 19.33959001588264 + 589.3935585480306 + relativeToSeaFloor + + #msn_C + + 1 + -102.8767681214162,31.59192479909473,0 + + + + + + Original - Rig PL wilth existing Azul PL.kmz + + + normal + #sn_ylw-pushpin96 + + + highlight + #sh_ylw-pushpin94 + + + + + + Original - Rig PL wilth existing Azul PL + #msn_ylw-pushpin89 + + 1 + + -103.1381372489133,31.65053381256015,0 -103.1371939568141,31.65078110147886,0 -103.135379572764,31.65137766837301,0 -103.1216582043267,31.65501734857683,0 -103.1267090001346,31.66820232963991,0 -103.1254217441416,31.66857428692562,0 -103.097869762411,31.68730649748832,0 -103.0880082019376,31.69401658057209,0 -103.0201699677156,31.71262120882616,0 -103.0199628293717,31.71246042343891,0 -103.0197573453124,31.71229701578655,0 -103.0195184188874,31.71245394748738,0 -102.9041726111906,31.63091832800928,0 -102.8944523887092,31.6165910414367,0 -102.8811494904473,31.59718777074555,0 -102.8680137394599,31.58231202839571,0 -102.8516886598823,31.56931339800882,0 -102.7180735327187,31.48448961907497,0 -102.7283930769256,31.51503752317085,0 -102.7117114856601,31.51898260340799,0 -102.7165257753119,31.5330847136263,0 -102.7003948024066,31.53686069788628,0 -102.7095293371793,31.56540947523578,0 -102.6901307183483,31.58496921843023,0 -102.6955769601148,31.60301750051444,0 + + + + + + \ No newline at end of file diff --git a/Code Snippets/rrig_kmz/polygon.txt b/Code Snippets/rrig_kmz/polygon.txt new file mode 100644 index 0000000..e69de29