Frage

Ich brauche die Ecken in lat / lng eines Boden-Overlay in einer KML-Datei entweder in PHP oder JavaScript gegeben zu finden.

d. für ein spezielles Beispiel muss ich von bekommen:

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

zu Ecke Koordinaten

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

Ich kann die andere Art und Weise bekommen (zumindest annähernd, PHP-Code angegeben) von

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

Sollte einfach sein, zurück zu bekommen, aber ich habe Stunden dafür verwendet, ohne dass es zu bekommen. Irgendwelche Tipps?

War es hilfreich?

Lösung

Sie müssen verwenden sphärische Trigonometrie , Teil von Kugelgeometrie für volle Genauigkeit. Aber da man mit nur einem kleinen Stück der Kugel handelt, euklidische Geometrie tun, wenn Sie eine Sache erinnern.

Als Breite zunimmt, erhalten die Linien der Länge näher zusammen. Zum Beispiel in der Nähe des Nordpols sind die Breitenlinien fast berühren. So Unterschiede bedingen Ihre Breite, sie verringern durch mulitlying um den Faktor cos (Breitengrad). Das wird Ihnen gut genug Genauigkeit für Ihre Anwendung.

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

Meine $squish Variable die cos (lat) ist erwähnt ich. Es wird für den relativen Anteil der horizontalen Längen de-zerquetschen. Die Sinus-Tabelle sieht wie folgt aus:

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)

Vielleicht tttppp könnte für die Unterschiede erklären aus tttppp der Tabelle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top