#!/usr/bin/python3 from shapely.geometry import LineString, box from task2_1 import ( loksodroma as cilindr_loksodroma, ortodroma as cilindr_ortodroma, yx as cilindr_yx ) from task2_2 import ( loksodroma as kugine_loksodroma, ortodroma as kugine_ortodroma ) from task2_4 import loksodromos_ilgis, ortodromos_ilgis from consts import M, maxlambda # mastelių koeficientų lentelė mLentele = ( ((10, 16), 0.897), ((16, 22), 0.919), ((22, 28), 0.952), ((28, 34), 1.000), ((34, 40), 1.065), ((40, 46), 1.152), ((46, 52), 1.270), ) # Kūginė projekcija: loksodroma apsk_kugine_loksodroma = LineString(kugine_loksodroma).length * M / 1000 proc_kugine_loksodroma = 100*(loksodromos_ilgis-apsk_kugine_loksodroma)/loksodromos_ilgis # Kūginė projekcija: ortodroma apsk_kugine_ortodroma = LineString(kugine_ortodroma).length * M / 1000 proc_kugine_ortodroma = 100*(ortodromos_ilgis-apsk_kugine_ortodroma)/apsk_kugine_ortodroma # Merkatoriaus projekcija (cilindrinė) def apsk_cilindr(linija): """Apskaičiuoti duotos linijos ilgį cilindrinėje projekcijoje. Liniją padalina į dalis pagal mLentele koordinates, ir sudeda kiekvieno segmento ilgį padauginus iš koeficiento. """ ls = LineString(linija) total = 0 for (phifrom, phito), coeff in mLentele: # stačiakampis, apribojantis liniją poly = box(*cilindr_yx(phifrom, 0), *cilindr_yx(phito, maxlambda)) # stačiakampio ir linijos sankirta -- gauname tik liniją, kurios ilgį # reikia priskaičiuoti subline = ls.intersection(poly) # pridedame santykinį linijos ilgį prie sumos total += subline.length * coeff return total * M / 1000 matav_cilindr_ortodroma = apsk_cilindr(cilindr_ortodroma) proc_cilindr_ortodroma = 100*(ortodromos_ilgis-matav_cilindr_ortodroma)/ortodromos_ilgis matav_cilindr_loksodroma = apsk_cilindr(cilindr_loksodroma) proc_cilindr_loksodroma = 100*(loksodromos_ilgis-matav_cilindr_loksodroma)/loksodromos_ilgis tpl = """Sferinės loksodromos ilgis (m): {loksodromos_ilgis:.0f} Sferinės ortodromos ilgis (m): {ortodromos_ilgis:.0f} Apskaičiuotas kūginės loksodromos ilgis (m): {apsk_kugine_loksodroma:.0f} paklaida: {proc_kugine_loksodroma:+.2f}% Apskaičiuotas kūginės ortodromos ilgis (m): {apsk_kugine_ortodroma:.0f} paklaida: {proc_kugine_ortodroma:+.2f}% Apskaičiuotas cilindrinės loksodromos ilgis (m): {matav_cilindr_loksodroma:.0f} paklaida: {proc_cilindr_loksodroma:+.2f}% Apskaičiuotas cilindrinės ortodromos ilgis (m): {matav_cilindr_ortodroma:.0f} paklaida: {proc_cilindr_ortodroma:+.2f}%""" if __name__ == '__main__': print(tpl.format(**dict(locals())))