Calcola lat / lng degli angoli della sovrapposizione del terreno dal file kml
-
06-07-2019 - |
Domanda
Devo trovare gli angoli in lat / lng di una sovrapposizione di terra fornita in un file kml in php o javascript.
vale a dire. per un esempio specifico devo ottenere da:
<LatLonBox>
<north>60.406505416667</north>
<south>60.400570555556</south>
<east>5.3351572222222</east>
<west>5.3190577777778</west>
<rotation>3.7088732260919</rotation>
</LatLonBox>
alle coordinate angolari
SW: 60.400316388889;5.3194425
SE: 60.400824722222;5.3355405555556
NE: 60.406759444444;5.3347738888889
NW: 60.406251388889;5.3186730555556
Posso andare dall'altra parte (almeno circa, codice php fornito) di
$w=($nw_lng+$sw_lng)/2;
$e=($ne_lng+$se_lng)/2;
$n=($ne_lat+$nw_lat)/2;
$s=($se_lat+$sw_lat)/2;
$rot= rad2deg (atan ( ( $nw_lng - $sw_lng ) / ($sw_lat - $nw_lat ) / 2 ) );
Dovrebbe essere facile tornare indietro, ma ho usato ore per questo senza arrivarci. Qualche consiglio?
Soluzione
Devi utilizzare trigonometria sferica , parte di geometria sferica per la massima precisione. Tuttavia, poiché hai a che fare solo con un piccolo pezzo di sfera, la geometria euclidea farà se ricordi una cosa.
All'aumentare della latitudine, le linee di longitudine si avvicinano. Ad esempio, vicino al Polo Nord, le linee di latitudine si stanno quasi toccando. Quindi condiziona le tue differenze di latitudine, diminuendole moltiplicando di un fattore di cos (latitudine). Questo ti darà una precisione sufficiente per la tua app.
$n = 60.406505416667;
$s = 60.400570555556;
$e = 5.3351572222222;
$w = 5.3190577777778;
$rotn = 3.7088732260919;
$a = ($e + $w) / 2.0;
$b = ($n + $s) / 2.0;
$squish = cos(deg2rad($b));
$x = $squish * ($e - $w) / 2.0;
$y = ($n - $s) / 2.0;
$ne = array(
$a + ($x * cos(deg2rad($rotn)) - $y * sin(deg2rad($rotn))) /$squish,
$b + $x * sin(deg2rad($rotn)) + $y *cos(deg2rad($rotn))
);
$nw = array(
$a - ($x * cos(deg2rad($rotn)) + $y * sin(deg2rad($rotn))) /$squish,
$b - $x * sin(deg2rad($rotn)) + $y *cos(deg2rad($rotn))
);
$sw = array(
$a - ($x * cos(deg2rad($rotn)) - $y * sin(deg2rad($rotn))) /$squish,
$b - $x * sin(deg2rad($rotn)) - $y *cos(deg2rad($rotn))
);
$se = array(
$a + ($x * cos(deg2rad($rotn)) + $y * sin(deg2rad($rotn))) /$squish,
$b + $x * sin(deg2rad($rotn)) - $y *cos(deg2rad($rotn))
);
print_r(array(
'sw'=>$sw,
'se'=>$se,
'ne'=>$ne,
'nw'=>$nw,
));
La mia variabile $ squish
è il cos (lat) che ho citato. È presente la de-squishing per la parte relativa delle lunghezze orizzontali. La tabella dei seni è simile alla seguente:
NE: (a + x cos A - y sin A, b + x sin A + y cos A)
NW: (a - x cos A - y sin A, b - x sin A + y cos A)
SW: (a - x cos A + y sin A, b - x sin A - y cos A)
SE: (a + x cos A + y sin A, b + x sin A - y cos A)
Forse tttppp potrebbe spiegare le differenze dalla tabella di tttppp.