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())))