Skip to content

Commit 189646a

Browse files
committed
/0/h3_latency: Attempt returning small hexes by default
1 parent 9ea8630 commit 189646a

File tree

1 file changed

+40
-25
lines changed

1 file changed

+40
-25
lines changed

src/adsb_api/app.py

Lines changed: 40 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@
2525
from adsb_api.utils.api_v2 import router as v2_router
2626
from adsb_api.utils.dependencies import browser, feederData, provider, redisVRS
2727
from adsb_api.utils.models import ApiUuidRequest, PrettyJSONResponse
28-
from adsb_api.utils.settings import (INSECURE, REDIS_HOST, SALT_BEAST,
29-
SALT_MLAT, SALT_MY)
28+
from adsb_api.utils.settings import INSECURE, REDIS_HOST, SALT_BEAST, SALT_MLAT, SALT_MY
3029

3130
PROJECT_PATH = pathlib.Path(__file__).parent.parent.parent
3231

@@ -161,7 +160,9 @@ async def mlat_receivers(
161160
return {"error": "not found"}
162161

163162
if server not in provider.mlat_sync_json.keys():
164-
print(f"failed mlat_sync host={host}, server={server} (not in {provider.mlat_sync_json.keys()})")
163+
print(
164+
f"failed mlat_sync host={host}, server={server} (not in {provider.mlat_sync_json.keys()})"
165+
)
165166
return {"error": "not found"}
166167

167168
return provider.mlat_sync_json[server]
@@ -236,8 +237,14 @@ async def api_me(request: Request):
236237
# If any bad
237238
return response
238239

240+
239241
@app.get("/0/my", tags=["v0"], summary="My Map redirect based on IP")
240-
@app.get("/api/0/my", tags=["v0"], summary="My Map redirect based on IP", include_in_schema=False)
242+
@app.get(
243+
"/api/0/my",
244+
tags=["v0"],
245+
summary="My Map redirect based on IP",
246+
include_in_schema=False,
247+
)
241248
async def api_my(request: Request):
242249
client_ip = request.client.host
243250
my_beast_clients = provider.get_clients_per_client_ip(client_ip)
@@ -376,36 +383,44 @@ async def planespotters_net_hex_options():
376383
},
377384
)
378385

386+
379387
@app.get(
380388
"/0/h3_latency",
381389
include_in_schema=False,
382390
tags=["v0"],
383391
)
384392
async def h3_latency():
393+
# Start with fine resolution
385394
_h3 = defaultdict(list)
386395
for receiverId, lat, lon in provider.beast_receivers:
387396
for client in provider.beast_clients:
388-
if not client["_uuid"].startswith(receiverId) or client.get("ms", -1) < 0:
389-
continue
390-
_h3[h3.latlng_to_cell(lat, lon, 1)].append(client["ms"])
391-
ret = defaultdict(dict)
392-
for key, value in _h3.items():
393-
# calculate median
394-
value.sort()
395-
ret[key]["median"] = value[len(value) // 2]
396-
# calculate average, limit to 2 decimals
397-
ret[key]["average"] = round(sum(value) / len(value), 2)
398-
# calculate min
399-
ret[key]["min"] = min(value)
400-
# calculate max
401-
ret[key]["max"] = max(value)
402-
# calculate count
403-
ret[key]["count"] = len(value)
404-
# if count < 2, remove the key
405-
ret = {key: value for key, value in ret.items() if value["count"] > 1}
406-
# sort by median
407-
ret = dict(sorted(ret.items(), key=lambda item: item[1]["median"]))
408-
return Response(orjson.dumps(ret), media_type="application/json")
397+
if client["_uuid"].startswith(receiverId) and client.get("ms", -1) >= 0:
398+
_h3[h3.latlng_to_cell(lat, lon, 6)].append(client["ms"])
399+
400+
# Group up sparse hexes progressively
401+
for res in range(5, 0, -1):
402+
for cell, values in list(_h3.items()):
403+
if len(values) < 3 and h3.cell_to_res(cell) == res + 1:
404+
_h3[h3.cell_to_parent(cell, res)].extend(_h3.pop(cell))
405+
406+
# Calculate stats and filter
407+
ret = {}
408+
for key, values in _h3.items():
409+
if len(values) > 1:
410+
values.sort()
411+
ret[key] = {
412+
"median": values[len(values) // 2],
413+
"average": round(sum(values) / len(values), 2),
414+
"min": min(values),
415+
"max": max(values),
416+
"count": len(values),
417+
}
418+
419+
return Response(
420+
orjson.dumps(dict(sorted(ret.items(), key=lambda x: x[1]["median"]))),
421+
media_type="application/json",
422+
)
423+
409424

410425
if __name__ == "__main__":
411426
print("Run with:")

0 commit comments

Comments
 (0)