Výpočet vzdálenosti mezi šířky zeměpisné délky.

O

opozdilec

Guest
Dobrý den všem,
Potřebuji vypočítat vzdálenost mezi dvěma soubory délek a Latitudes.Potřebuju to pro GPS založený systém, který jsem projektování, který bude vykazovat vzdálenosti ujeté vozidlem.

Může mi někdo pomoct v tomto?Viděl jsem na netu, že Haversine vzorec je dobrý, ale já jsem s problémem portování na můj správce PIC16F877A pomocí HT-PIC kompilátor.

Jakékoliv připomínky / doporučení jsou vítány.

Díky předem.

 
Předpokládejme, že chcete geodetické vzdálenost, to rutina funguje dobře a s dobrou rychlost:Kód:/ / Lat / Long vstupy v radiánech, rozsah výstupu v metrech

/ * Tato verze je vzdálenost mezi dvěma body na zemi

je založeno na vzorce uvedeného v příloze A Sodano, EM,

"Obecné Non-iterativní řešení inverzní a přímá geodetické

problémy ", Bulletin Geodesique, vol. 75 (březen 1965), pp 69-84.

* /

/ / Konstanty používané metody Sodano je

const dvojité = 6378137,0; / / polořadovka-hlavní osa elipsoidu

const dvojité RECF = 298,257223563; / / převrácená hodnota zploštění (1 / F)

const dvojité F = (1,0 / RECF); / / zploštění f

const dvojité ES = ((2,0 - F) * F) / / První výstřednost čtvercový

const dvojité B = sqrt (A * A * (1,0 - ES)); / / Semi-hlavní osa

const dvojí F2 = F * F;

const dvojité F2_2 = 0,5 * F2;

const dvojité f_1 = 1,0 - F;static void

ComputeRangeSodano (double pt1Lat, dvojité pt1Lon,

dvojité pt2Lat, dvojité pt2Lon,

dvoulůžkový * rozsah)

(

dvojité L = pt2Lon - pt1Lon;const dvojité TESTV = 1.0E-11;

if (FABS (pt1Lat - pt2Lat) <TESTV & & FABS (L) <TESTV)

(

* Range = 0,0;

return; / / body shodný

)dvoulůžkový beta1 = atan (f_1 * tan (pt1Lat));

dvoulůžkový beta2 = atan (f_1 * tan (pt2Lat));dvojité = sin (beta1) * sin (beta2);

dvoulůžkový b = cos (beta1) * cos (beta2);dvojité cos_phi = a b * cos (L);dvojité Temp1, temp2;

dvojité sin_phi, phi;Temp1 = sin (L) * cos (beta2);

temp2 = sin (beta2) * cos (beta1) - sin (beta1) * cos (beta2) * cos (L);

sin_phi = sqrt (Temp1 * Temp1 temp2 * temp2);

phi = atan2 (sin_phi, cos_phi);dvojité c = (b * sin (L)) / sin_phi;dvojité m = 1,0 - c * c;dvoulůžkový csc_phi = 1,0 / sin_phi;

dvoulůžkový cot_phi = cos_phi / sin_phi;dvoulůžkový cos_phi2 = cos_phi * cos_phi;

dvoulůžkový sin_cos_phi = sin_phi * cos_phi;dvoulůžkový phi2 = Phi Phi *;dvojité sdb =

(1.0 F F2) * phi

* ((F F2) * sin_phi - F2_2 * phi2 * csc_phi)

M * 0,5 * (- (F F2) * (phi sin_cos_phi) F2 * phi2 * cot_phi)

- * * * F2_2 (sin_phi * cos_phi)

M * m * F2_2 * (0,125 * (phi sin_cos_phi) - phi2 * cot_phi - 0,25 * sin_cos_phi * cos_phi2)

* M * F2_2 * (phi2 * csc_phi sin_phi * cos_phi2);dvoulůžkový S = sdb * B;* Range = S;

)

 

Welcome to EDABoard.com

Sponsor

Back
Top