Berechnen lat / lng von Ecken von Boden-Overlay von kml-Datei
-
06-07-2019 - |
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?
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.