Files
fgtools/utils/__init__.py

128 lines
2.4 KiB
Python

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import math
import os
import sys
import subprocess
def get_fg_tile_span(lat):
if lat >= 89:
return 12
elif lat >= 86:
return 4
elif lat >= 83:
return 2
elif lat >= 76:
return 1
elif lat >= 62:
return 0.5
elif lat >= 22:
return 0.25
elif lat >= -22:
return 0.125
elif lat >= -62:
return 0.25
elif lat >= -76:
return 0.5
elif lat >= -83:
return 1
elif lat >= -86:
return 2
elif lat >= -89:
return 4
else:
return 12
def get_fg_tile_index(dlon, dlat):
tile_width = get_fg_tile_span(dlat)
lon = math.floor(dlon)
lat = math.floor(dlat)
if tile_width <= 1:
x = math.floor((dlon - lon) / tile_width)
else:
lon = int(math.floor(lon / tile_width) * tile_width)
x = 0
if lat == 90:
lat = 89
y = 7
else:
y = math.floor((dlat - math.floor(dlat)) * 8)
return ((lon + 180) << 14) + ((lat + 90) << 6) + (y << 3) + x
def get_fg_tile_coords(index):
lon = index >> 14;
index -= lon << 14;
lon -= 180;
lat = index >> 6;
index -= lat << 6;
lat -= 90;
return lon, lat
def get_fg_tile_path(lon, lat):
top_lon = int(lon / 10);
main_lon = int(lon);
if (lon < 0) and (top_lon * 10 != lon):
top_lon -= 1;
top_lon *= 10
if top_lon >= 0:
hem = "e"
else:
hem = "w"
top_lon *= -1;
if main_lon < 0:
main_lon *= -1
top_lat = int(lat / 10)
main_lat = int(lat)
if (lat < 0) and (top_lat * 10 != lat):
top_lat -= 1
top_lat *= 10
if top_lat >= 0:
pole = "n"
else:
pole = "s"
top_lat *= -1
if main_lat < 0:
main_lat *= -1
return f"{hem}{int(top_lon):03d}{pole}{int(top_lat):02d}/{hem}{int(main_lon):03d}{pole}{int(main_lat):02d}/{get_fg_tile_index(lon, lat)}"
def make_fgelev_pipe(fgelev, fgscenery, fgdata):
print("Creating pipe to fgelev … ", end="")
sys.stdout.flush()
env = os.environ.copy()
env["FG_SCENERY"] = os.pathsep.join(fgscenery)
env["FG_ROOT"] = fgdata
pipe = subprocess.Popen(args=[fgelev, "--expire", "1"], env=env, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
pipe.stdout.flush()
pipe.stdout.readline()
pipe.stdin.flush()
pipe.stdin.flush()
print("done")
return pipe
def isiterable(o, striterable=False):
if isinstance(o, str):
return striterable
else:
try:
iter(o)
return True
except TypeError:
return False
def wrap_period(n, min, max):
while n > max:
n -= max - min
while n < min:
n += max - min
return n