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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top