Обрабатываем карту в GeoJSON и выводим прогноз погоды
Автор
# Точка (lon, lat) и полигон из GeoJSON
function point_in_polygon(lon, lat, poly)
inside = false
n = length(poly)
for i in 1:n
v1 = poly[i]
v2 = poly[i == n ? 1 : i + 1]
if ((v1[2] > lat) != (v2[2] > lat)) &&
(lon < (v2[1] - v1[1]) * (lat - v1[2]) / (v2[2] - v1[2]) + v1[1])
inside = !inside
end
end
return inside
end
# Функция без буферизации, очень неточная по береговой линии
point_in_russia(lon,lat,borders) = !(isnan(lon)||isnan(lat)) && !(lon<18||lon>190||lat<40||lat>85) && any(p->point_in_polygon(lon,lat,p), borders);
# Функция определения "веса" суши (0-1) в зависимости от расстояния до границы
function land_weight(lon, lat, borders, radius=1.0)
# Если точка внутри, вес 1
if any(p->point_in_polygon(lon, lat, p), borders)
return 1.0
end
# Считаем взвешенную сумму по окружающим точкам
total_weight = 0.0
samples = 0
steps = 5
for δlat in range(-radius, radius, length=steps)
for δlon in range(-radius, radius, length=steps)
dist = sqrt(δlon^2 + δlat^2)
if dist <= radius
# Вес обратно пропорционален расстоянию
point_weight = exp(-2 * dist / radius)
if any(p->point_in_polygon(lon+δlon, lat+δlat, p), borders)
total_weight += point_weight
end
samples += 1
end
end
end
return samples > 0 ? total_weight / samples : 0.0
end