stud

study spacejunk
Log | Files | Refs | LICENSE

task2_5.py (2738B) - Raw


      1 #!/usr/bin/python3
      2 
      3 from shapely.geometry import LineString, box
      4 
      5 from task2_1 import (
      6         loksodroma as cilindr_loksodroma,
      7         ortodroma as cilindr_ortodroma,
      8         yx as cilindr_yx
      9 )
     10 from task2_2 import (
     11         loksodroma as kugine_loksodroma,
     12         ortodroma as kugine_ortodroma
     13 )
     14 from task2_4 import loksodromos_ilgis, ortodromos_ilgis
     15 from consts import M, maxlambda
     16 
     17 # mastelių koeficientų lentelė
     18 mLentele = (
     19     ((10, 16), 0.897),
     20     ((16, 22), 0.919),
     21     ((22, 28), 0.952),
     22     ((28, 34), 1.000),
     23     ((34, 40), 1.065),
     24     ((40, 46), 1.152),
     25     ((46, 52), 1.270),
     26 )
     27 
     28 # Kūginė projekcija: loksodroma
     29 apsk_kugine_loksodroma = LineString(kugine_loksodroma).length * M / 1000
     30 proc_kugine_loksodroma = 100*(loksodromos_ilgis-apsk_kugine_loksodroma)/loksodromos_ilgis
     31 # Kūginė projekcija: ortodroma
     32 apsk_kugine_ortodroma = LineString(kugine_ortodroma).length * M / 1000
     33 proc_kugine_ortodroma = 100*(ortodromos_ilgis-apsk_kugine_ortodroma)/apsk_kugine_ortodroma
     34 
     35 
     36 # Merkatoriaus projekcija (cilindrinė)
     37 def apsk_cilindr(linija):
     38     """Apskaičiuoti duotos linijos ilgį cilindrinėje projekcijoje.
     39 
     40     Liniją padalina į dalis pagal mLentele koordinates, ir
     41     sudeda kiekvieno segmento ilgį padauginus iš koeficiento.
     42     """
     43     ls = LineString(linija)
     44     total = 0
     45     for (phifrom, phito), coeff in mLentele:
     46         # stačiakampis, apribojantis liniją
     47         poly = box(*cilindr_yx(phifrom, 0), *cilindr_yx(phito, maxlambda))
     48         # stačiakampio ir linijos sankirta -- gauname tik liniją, kurios ilgį
     49         # reikia priskaičiuoti
     50         subline = ls.intersection(poly)
     51         # pridedame santykinį linijos ilgį prie sumos
     52         total += subline.length * coeff
     53     return total * M / 1000
     54 
     55 
     56 matav_cilindr_ortodroma = apsk_cilindr(cilindr_ortodroma)
     57 proc_cilindr_ortodroma = 100*(ortodromos_ilgis-matav_cilindr_ortodroma)/ortodromos_ilgis
     58 matav_cilindr_loksodroma = apsk_cilindr(cilindr_loksodroma)
     59 proc_cilindr_loksodroma = 100*(loksodromos_ilgis-matav_cilindr_loksodroma)/loksodromos_ilgis
     60 
     61 
     62 tpl = """Sferinės loksodromos ilgis (m): {loksodromos_ilgis:.0f}
     63 Sferinės ortodromos ilgis (m): {ortodromos_ilgis:.0f}
     64 
     65 Apskaičiuotas kūginės loksodromos ilgis (m):     {apsk_kugine_loksodroma:.0f}  paklaida: {proc_kugine_loksodroma:+.2f}%
     66 Apskaičiuotas kūginės ortodromos ilgis (m):      {apsk_kugine_ortodroma:.0f}  paklaida: {proc_kugine_ortodroma:+.2f}%
     67 Apskaičiuotas cilindrinės loksodromos ilgis (m): {matav_cilindr_loksodroma:.0f}  paklaida: {proc_cilindr_loksodroma:+.2f}%
     68 Apskaičiuotas cilindrinės ortodromos ilgis (m):  {matav_cilindr_ortodroma:.0f}  paklaida: {proc_cilindr_ortodroma:+.2f}%"""
     69 
     70 if __name__ == '__main__':
     71     print(tpl.format(**dict(locals())))