stud/III/Ovodas/task2_5.py
Motiejus Jakštys b90fd4f41c task 1 and 2
2020-12-27 12:17:41 +02:00

72 lines
2.7 KiB
Python
Executable File

#!/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())))