Question

J'ai besoin de trouver les coins dans la latitude / la longitude d'une superposition au sol donnée dans un fichier kml en php ou javascript.

I.e. pour un exemple spécifique, je dois obtenir de:

  <LatLonBox>
    <north>60.406505416667</north>
    <south>60.400570555556</south>
    <east>5.3351572222222</east>
    <west>5.3190577777778</west>
    <rotation>3.7088732260919</rotation>
  </LatLonBox>

aux coordonnées de coin

SW: 60.400316388889;5.3194425
SE: 60.400824722222;5.3355405555556
NE: 60.406759444444;5.3347738888889
NW: 60.406251388889;5.3186730555556

Je peux obtenir l'autre sens (environ au moins, le code php est donné) par

$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  ) );

Ça devrait être facile de revenir, mais j'ai utilisé des heures pour cela sans y arriver. Des conseils?

Était-ce utile?

La solution

Vous devez utiliser la trigonométrie sphérique , qui fait partie de géométrie sphérique pour une précision optimale. Cependant, comme vous ne traitez qu’un petit morceau de la sphère, la géométrie euclidienne le fera si vous vous souvenez d’une chose.

À mesure que la latitude augmente, les lignes de longitude se rapprochent. Par exemple, près du pôle Nord, les lignes de latitude se touchent presque. Donc, conditionnez vos différences de latitude, en les diminuant en multipliant par un facteur de cos (latitude). Cela vous donnera une précision suffisante pour votre application.

 $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,
 ));

Ma variable $ squish est le cos (lat) que j'ai mentionné. Il existe un déséquilibre pour la partie relative des longueurs horizontales. La table des sinus ressemble à ceci:

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)

Peut-être que tttppp pourrait expliquer les différences par rapport à la table de tttppp.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top