72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
|
#!/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())))
|