kml/config.py
author hh
Mon, 18 May 2020 08:48:51 +0200
changeset 0 bb616224c02a
permissions -rw-r--r--
--
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
hh
parents:
diff changeset
     1
import json
hh
parents:
diff changeset
     2
import os
hh
parents:
diff changeset
     3
hh
parents:
diff changeset
     4
import targets
hh
parents:
diff changeset
     5
from kml import *
hh
parents:
diff changeset
     6
hh
parents:
diff changeset
     7
hh
parents:
diff changeset
     8
class Config:
hh
parents:
diff changeset
     9
    class Value:
hh
parents:
diff changeset
    10
        def __init__(self, key, val):
hh
parents:
diff changeset
    11
            self.key = key
hh
parents:
diff changeset
    12
            self.val = val
hh
parents:
diff changeset
    13
            self.chk = True
hh
parents:
diff changeset
    14
            self.keyact = key + '_actual'
hh
parents:
diff changeset
    15
hh
parents:
diff changeset
    16
        def extract(self, p):
hh
parents:
diff changeset
    17
            if self.key in p:
hh
parents:
diff changeset
    18
                self.val = p[self.key][0]
hh
parents:
diff changeset
    19
            self.chk = True
hh
parents:
diff changeset
    20
hh
parents:
diff changeset
    21
    class ValueN(Value):
hh
parents:
diff changeset
    22
        def extract(self, p):
hh
parents:
diff changeset
    23
            if self.key in p:
hh
parents:
diff changeset
    24
                try:
hh
parents:
diff changeset
    25
                    self.val = float(p[self.key][0])
hh
parents:
diff changeset
    26
                    self.chk = True
hh
parents:
diff changeset
    27
                except:
hh
parents:
diff changeset
    28
                    self.val = p[self.key][0]
hh
parents:
diff changeset
    29
                    self.chk = False
hh
parents:
diff changeset
    30
hh
parents:
diff changeset
    31
    def __init__(self):
hh
parents:
diff changeset
    32
        # -------------------------------------------------
hh
parents:
diff changeset
    33
        # zadání - vstupní veličiny
hh
parents:
diff changeset
    34
        # -------------------------------------------------
hh
parents:
diff changeset
    35
        self.name = self.Value('NA', 'flyby')
hh
parents:
diff changeset
    36
        self.targname = self.Value('TA', '')
hh
parents:
diff changeset
    37
        self.lat = self.ValueN('LA', targets.Stalin.lat)
hh
parents:
diff changeset
    38
        self.long = self.ValueN('LO', targets.Stalin.long)
hh
parents:
diff changeset
    39
        self.h0 = self.ValueN('H0', 300)
hh
parents:
diff changeset
    40
        self.x0 = self.ValueN('X0', 8000)
hh
parents:
diff changeset
    41
        self.y0 = self.ValueN('Y0', -12000)
hh
parents:
diff changeset
    42
        self.z0 = self.ValueN('Z0', 12000)
hh
parents:
diff changeset
    43
        self.x1 = self.ValueN('X1', 0)
hh
parents:
diff changeset
    44
        self.y1 = self.ValueN('Y1', -150)
hh
parents:
diff changeset
    45
        self.z1 = self.ValueN('Z1', 100)
hh
parents:
diff changeset
    46
        self.exp = self.ValueN('EX', 2)
hh
parents:
diff changeset
    47
        self.steps = self.ValueN('ST', 600)
hh
parents:
diff changeset
    48
        self.speedfact = self.ValueN('SPF', 1)
hh
parents:
diff changeset
    49
        self.slowdown = self.Value('SLD', 'tangential')
hh
parents:
diff changeset
    50
        self.slowdfact = self.ValueN('SLF', 1)
hh
parents:
diff changeset
    51
        self.flyby = self.ValueN('FL', 1)
hh
parents:
diff changeset
    52
        self.influentials = ['name', 'targname', 'lat', 'long', 'h0', 'x0', 'y0', 'z0',
hh
parents:
diff changeset
    53
                       'x1', 'y1', 'z1', 'exp', 'steps', 'speedfact', 'slowdown', 'slowdfact', 'flyby']
hh
parents:
diff changeset
    54
hh
parents:
diff changeset
    55
        # -------------------------------------------------
hh
parents:
diff changeset
    56
        # počáteční podmínky
hh
parents:
diff changeset
    57
        # -------------------------------------------------
hh
parents:
diff changeset
    58
        self.dXmin = 0.1            # min delta X při numerické konvergenci
hh
parents:
diff changeset
    59
        self.minZ = 60				# minimální přípustná výška nad terénem v metrech
hh
parents:
diff changeset
    60
        self.dHmax = 5				# empirické maximální přípustné otočení pohledu v jednom kroku ve stupních
hh
parents:
diff changeset
    61
        self.durOpt = 23			# empirické optimum: rychlost otáčení pohledu = 23°/sec
hh
parents:
diff changeset
    62
        self.stepsMax = 9999
hh
parents:
diff changeset
    63
hh
parents:
diff changeset
    64
        # -------------------------------------------------
hh
parents:
diff changeset
    65
        # provozní konstanty
hh
parents:
diff changeset
    66
        # -------------------------------------------------
hh
parents:
diff changeset
    67
        self.configsrv = 'kml'
hh
parents:
diff changeset
    68
        self.dnldsrv = 'flyby'
hh
parents:
diff changeset
    69
        if 'HTTP_HOST' in os.environ:
hh
parents:
diff changeset
    70
            h = os.environ['HTTP_HOST'].split('.')
hh
parents:
diff changeset
    71
            self.srvhost = h[0].lower()
hh
parents:
diff changeset
    72
            self.srvdomain = '.'.join(h[1:])
hh
parents:
diff changeset
    73
            self.dnldqual = '.'.join((self.dnldsrv, self.srvdomain))
hh
parents:
diff changeset
    74
            self.configqual = '.'.join((self.configsrv, self.srvdomain))
hh
parents:
diff changeset
    75
            _reqPath = os.environ['HTTP_HOST'] + os.environ['REQUEST_URI'].split('?')[0]
hh
parents:
diff changeset
    76
            _configKeyWord = 'kml'
hh
parents:
diff changeset
    77
            _dnldKeyWord = 'flyby'
hh
parents:
diff changeset
    78
            self.configReq = _reqPath.lower().find(_configKeyWord) > -1
hh
parents:
diff changeset
    79
            self.dnldReq = _reqPath.lower().find(_dnldKeyWord) > -1
hh
parents:
diff changeset
    80
            _reqUrl = '{scheme}://{host}:{port}{path}'.\
hh
parents:
diff changeset
    81
                format(scheme=os.environ['REQUEST_SCHEME'],
hh
parents:
diff changeset
    82
                       host=os.environ['HTTP_HOST'],
hh
parents:
diff changeset
    83
                       port=os.environ['SERVER_PORT'],
hh
parents:
diff changeset
    84
                       path=os.environ['REQUEST_URI'].split('?')[0])
hh
parents:
diff changeset
    85
            self.dnldUrl = _reqUrl.lower().replace(_configKeyWord, _dnldKeyWord)
hh
parents:
diff changeset
    86
            deb('self.dnldUrl=%s' % self.dnldUrl)
hh
parents:
diff changeset
    87
            self.dnldPath = _reqPath.lower().replace(_configKeyWord, _dnldKeyWord)
hh
parents:
diff changeset
    88
            deb('self.dnldPath=%s' % self.dnldPath)
hh
parents:
diff changeset
    89
        self.defaultlat = 50.1
hh
parents:
diff changeset
    90
        self.defaultlong = 14.3
hh
parents:
diff changeset
    91
        self.parmsdir = 'params'
hh
parents:
diff changeset
    92
        self.targsdir = 'targets'
hh
parents:
diff changeset
    93
        self.kmlfn = 'flyby'		# jméno výstupu - neměnné
hh
parents:
diff changeset
    94
        self.zipped = False
hh
parents:
diff changeset
    95
        # zipping se nedá v současnosti používat, protože Google Earth se s ním nechová standardně
hh
parents:
diff changeset
    96
        # - viz .../memo/googleearth
hh
parents:
diff changeset
    97
        self.kmlfile = '{}.{}'.format(self.kmlfn, 'kmz' if self.zipped else 'kml')
hh
parents:
diff changeset
    98
        self.urlfile = 'url.kml'
hh
parents:
diff changeset
    99
        self.msg = ''
hh
parents:
diff changeset
   100
        self.flagged = False
hh
parents:
diff changeset
   101
hh
parents:
diff changeset
   102
    def adjust(self):
hh
parents:
diff changeset
   103
        self.x0.val = fabs(self.x0.val)
hh
parents:
diff changeset
   104
        if self.x0.val < self.dXmin:
hh
parents:
diff changeset
   105
            self.x0.val = 0
hh
parents:
diff changeset
   106
        self.x1.val = 0
hh
parents:
diff changeset
   107
        if self.z0.val < self.minZ:
hh
parents:
diff changeset
   108
            self.z0.val = self.minZ
hh
parents:
diff changeset
   109
        if self.z1.val < self.minZ:
hh
parents:
diff changeset
   110
            self.z1.val = self.minZ
hh
parents:
diff changeset
   111
        self.steps.val = int(round(self.steps.val))
hh
parents:
diff changeset
   112
        if self.steps.val <= 0:
hh
parents:
diff changeset
   113
            self.steps.val = 20
hh
parents:
diff changeset
   114
        if self.steps.val > self.stepsMax:
hh
parents:
diff changeset
   115
            self.steps.val = self.stepsMax
hh
parents:
diff changeset
   116
        self.exp.val = fabs(self.exp.val)
hh
parents:
diff changeset
   117
        self.flyby.val = int(fabs(self.flyby.val))
hh
parents:
diff changeset
   118
hh
parents:
diff changeset
   119
        if self.x0.val > 0:
hh
parents:
diff changeset
   120
            self.r0 = degrees(atan(self.y0.val / self.x0.val))				# lokální azimut na startu
hh
parents:
diff changeset
   121
            self.r1 = 90 if self.y1.val < 0 else -90						# lokální azimut v průletu
hh
parents:
diff changeset
   122
            if self.y1.val == 0:
hh
parents:
diff changeset
   123
                if self.y0.val == 0:
hh
parents:
diff changeset
   124
                    self.r1 = 90
hh
parents:
diff changeset
   125
                else:
hh
parents:
diff changeset
   126
                    self.r1 = 90 * fabs(self.y0.val) / self.y0.val
hh
parents:
diff changeset
   127
                    if self.exp.val <= 1:
hh
parents:
diff changeset
   128
                        self.r1 = -self.r1
hh
parents:
diff changeset
   129
            self.h1 = can360(self.h0.val + self.r0 + self.r1)				# azimut v průletu
hh
parents:
diff changeset
   130
            self.h2 = can360(self.h0.val + 2 * (self.h1 - self.h0.val))		# azimut na konci
hh
parents:
diff changeset
   131
hh
parents:
diff changeset
   132
        dY = self.y1.val - self.y0.val
hh
parents:
diff changeset
   133
        dZ = self.z1.val - self.z0.val
hh
parents:
diff changeset
   134
        if dY == 0:
hh
parents:
diff changeset
   135
            self.A = pi / 2 if dZ < 0 else -pi / 2
hh
parents:
diff changeset
   136
        else:
hh
parents:
diff changeset
   137
            self.A = atan(dZ / dY)											# sklon roviny letu, horiz = 0
hh
parents:
diff changeset
   138
            if dY > 0:
hh
parents:
diff changeset
   139
                self.A = self.A + pi if dZ <= 0 else self.A - pi
hh
parents:
diff changeset
   140
hh
parents:
diff changeset
   141
        F = sqrt(pow(dY, 2) + pow(dZ, 2))									# maximální funkční hodnota
hh
parents:
diff changeset
   142
        if self.x0.val > 0:
hh
parents:
diff changeset
   143
            self.K = F / pow(self.x0.val, self.exp.val)		# koeficient paraboly
hh
parents:
diff changeset
   144
hh
parents:
diff changeset
   145
        sa = SpeedAdjust(self.speedfact.val, self.slowdfact.val, self.steps.val, self)
hh
parents:
diff changeset
   146
        self.speedAdjust = sa.slowdowns[self.slowdown.val](sa)
hh
parents:
diff changeset
   147
hh
parents:
diff changeset
   148
        self.lastH = self.h0.val
hh
parents:
diff changeset
   149
        self.lastX, self.lastY, self.lastZ = self.x0.val, self.y0.val, self.z0.val
hh
parents:
diff changeset
   150
        self.dX = -2 * self.x0.val / self.steps.val
hh
parents:
diff changeset
   151
        if fabs(self.dX) < self.dXmin:
hh
parents:
diff changeset
   152
            self.dX = -self.dXmin
hh
parents:
diff changeset
   153
        self.sumSteps, self.sumDur = 0, 0
hh
parents:
diff changeset
   154
        self.rr = []
hh
parents:
diff changeset
   155
hh
parents:
diff changeset
   156
    def update_influentials(self, p):
hh
parents:
diff changeset
   157
        for n in self.influentials:
hh
parents:
diff changeset
   158
            v = eval('self.{}'.format(n))
hh
parents:
diff changeset
   159
            v.extract(p)
hh
parents:
diff changeset
   160
            self.flagged += (not v.chk)
hh
parents:
diff changeset
   161
hh
parents:
diff changeset
   162
        v = self.lat
hh
parents:
diff changeset
   163
        if v.chk:
hh
parents:
diff changeset
   164
            v.chk = (v.val >= -90 and v.val <= 90)
hh
parents:
diff changeset
   165
        v = self.long
hh
parents:
diff changeset
   166
        if v.chk:
hh
parents:
diff changeset
   167
            v.chk = v.val >= -180 and v.val <= 180
hh
parents:
diff changeset
   168
        v = self.slowdown
hh
parents:
diff changeset
   169
        v.chk = v.val in SpeedAdjust.keys
hh
parents:
diff changeset
   170
hh
parents:
diff changeset
   171
        self.flagged = False
hh
parents:
diff changeset
   172
        for n in self.influentials:
hh
parents:
diff changeset
   173
            v = eval('self.{}'.format(n))
hh
parents:
diff changeset
   174
            self.flagged += (not v.chk)
hh
parents:
diff changeset
   175
hh
parents:
diff changeset
   176
    def parmspath(self):
hh
parents:
diff changeset
   177
        return os.path.join(self.parmsdir, self.name.val)
hh
parents:
diff changeset
   178
hh
parents:
diff changeset
   179
    def parmsls(self):
hh
parents:
diff changeset
   180
        l = os.listdir(self.parmsdir)
hh
parents:
diff changeset
   181
        l.sort()
hh
parents:
diff changeset
   182
        #deb("l={}".format(l))
hh
parents:
diff changeset
   183
        return l
hh
parents:
diff changeset
   184
hh
parents:
diff changeset
   185
    def targspath(self, name):
hh
parents:
diff changeset
   186
        return os.path.join(self.targsdir, name)
hh
parents:
diff changeset
   187
hh
parents:
diff changeset
   188
    def targsls(self):
hh
parents:
diff changeset
   189
        l = os.listdir(self.targsdir)
hh
parents:
diff changeset
   190
        l.sort()
hh
parents:
diff changeset
   191
        return l
hh
parents:
diff changeset
   192
hh
parents:
diff changeset
   193
    def gettarget(self, name):
hh
parents:
diff changeset
   194
        fn = name if name != '' else 'point'
hh
parents:
diff changeset
   195
        path = self.targspath(fn)
hh
parents:
diff changeset
   196
        long = self.defaultlong
hh
parents:
diff changeset
   197
        lat = self.defaultlat
hh
parents:
diff changeset
   198
        if os.path.exists(path):
hh
parents:
diff changeset
   199
            g = {}
hh
parents:
diff changeset
   200
            for p in open(path).read().split(','):
hh
parents:
diff changeset
   201
                k, v = p.split('=')
hh
parents:
diff changeset
   202
                g[k] = v
hh
parents:
diff changeset
   203
            if self.long.key in g:
hh
parents:
diff changeset
   204
                long = g[self.long.key]
hh
parents:
diff changeset
   205
            if self.lat.key in g:
hh
parents:
diff changeset
   206
                lat = g[self.lat.key]
hh
parents:
diff changeset
   207
        return long, lat
hh
parents:
diff changeset
   208
hh
parents:
diff changeset
   209
    def storetarget(self, name, long, lat):
hh
parents:
diff changeset
   210
        fn = name if name != '' else 'point'
hh
parents:
diff changeset
   211
        path = self.targspath(fn)
hh
parents:
diff changeset
   212
        open(path, mode='w').write('{}={},{}={}'.format(self.lat.key, lat, self.long.key, long))
hh
parents:
diff changeset
   213
hh
parents:
diff changeset
   214
    def restoreparms(self):
hh
parents:
diff changeset
   215
        if not os.path.exists(self.parmspath()):
hh
parents:
diff changeset
   216
            return
hh
parents:
diff changeset
   217
        parms = dict(json.load(open(self.parmspath())))
hh
parents:
diff changeset
   218
        # for p in open(self.parmspath()).read().split(','):
hh
parents:
diff changeset
   219
        #     k,v = p.split('=')
hh
parents:
diff changeset
   220
        #     parms[k] = [v]
hh
parents:
diff changeset
   221
        self.update_influentials(parms)
hh
parents:
diff changeset
   222
hh
parents:
diff changeset
   223
    def storeparms(self):
hh
parents:
diff changeset
   224
        if not self.name:
hh
parents:
diff changeset
   225
            return
hh
parents:
diff changeset
   226
        # s = []
hh
parents:
diff changeset
   227
        p = {}
hh
parents:
diff changeset
   228
        for n in self.influentials:
hh
parents:
diff changeset
   229
            v = eval('self.{}'.format(n))
hh
parents:
diff changeset
   230
            # s = s + ['='.join((v.key,str(v.val)))]
hh
parents:
diff changeset
   231
            p[v.key] = [str(v.val)]
hh
parents:
diff changeset
   232
        # open(self.parmspath(), mode='w').write(','.join(s))
hh
parents:
diff changeset
   233
        json.dump(p, open(self.parmspath(), mode='w'), ensure_ascii=False)
hh
parents:
diff changeset
   234
hh
parents:
diff changeset
   235
    def printparms(self):
hh
parents:
diff changeset
   236
        s = []
hh
parents:
diff changeset
   237
        for n in self.influentials:
hh
parents:
diff changeset
   238
            v = eval('self.{}'.format(n))
hh
parents:
diff changeset
   239
            s = s + ['{}={}'.format(v.key, v.val)]
hh
parents:
diff changeset
   240
        return '\n'.join(s)
hh
parents:
diff changeset
   241
hh
parents:
diff changeset
   242
    def adjustenv(self):
hh
parents:
diff changeset
   243
        p = {}
hh
parents:
diff changeset
   244
        for k in os.environ:
hh
parents:
diff changeset
   245
            p[k] = [os.environ[k]]
hh
parents:
diff changeset
   246
        return p