Spaces:
Sleeping
Sleeping
import torch | |
import reverse_geocoder | |
import numpy as np | |
def haversine(pred, gt): | |
# expects inputs to be np arrays in (lat, lon) format as radians | |
# N x 2 | |
# calculate the difference in latitude and longitude between the predicted and ground truth points | |
lat_diff = pred[:, 0] - gt[:, 0] | |
lon_diff = pred[:, 1] - gt[:, 1] | |
# calculate the haversine formula components | |
lhs = torch.sin(lat_diff / 2) ** 2 | |
rhs = torch.cos(pred[:, 0]) * torch.cos(gt[:, 0]) * torch.sin(lon_diff / 2) ** 2 | |
a = lhs + rhs | |
# calculate the final distance using the haversine formula | |
c = 2 * torch.arctan2(torch.sqrt(a), torch.sqrt(1 - a)) | |
distance = 6371 * c | |
return distance | |
def reverse(pred, gt, area): | |
df = {} | |
gt_area = {} | |
nan_mask = {} | |
areas = ["_".join(["unique", ar]) for ar in area] | |
if "unique_continent" in areas: | |
areas.remove("unique_continent") | |
for ar in areas: | |
inter = np.array(gt[ar]) | |
nan_mask[ar] = inter != "nan" | |
gt_area[ar] = inter[nan_mask[ar]] | |
location = reverse_geocoder.search( | |
[ | |
(lat, lon) | |
for lat, lon in zip( | |
np.degrees(pred[:, 0].cpu()), np.degrees(pred[:, 1].cpu()) | |
) | |
] | |
) | |
if "continent" in area: | |
continent = torch.load("continent.pt") | |
inter = np.array([l.get("cc", "") for l in location])[ | |
nan_mask["unique_country"] | |
] | |
df["continent"] = np.array([continent[i] for i in inter]) | |
gt_area["unique_continent"] = np.array( | |
[continent[i] for i in gt_area["unique_country"]] | |
) | |
if "country" in area: | |
df["country"] = np.array([l.get("cc", "") for l in location])[ | |
nan_mask["unique_country"] | |
] | |
if "region" in area: | |
df["region"] = np.array( | |
["_".join([l.get("admin1", ""), l.get("cc", "")]) for l in location] | |
)[nan_mask["unique_region"]] | |
if "sub-region" in area: | |
df["sub-region"] = np.array( | |
[ | |
"_".join([l.get("admin2", ""), l.get("admin1", ""), l.get("cc", "")]) | |
for l in location | |
] | |
)[nan_mask["unique_sub-region"]] | |
if "city" in area: | |
df["city"] = np.array( | |
[ | |
"_".join( | |
[ | |
l.get("name", ""), | |
l.get("admin2", ""), | |
l.get("admin1", ""), | |
l.get("cc", ""), | |
] | |
) | |
for l in location | |
] | |
)[nan_mask["unique_city"]] | |
return df, gt_area | |