Мне нужно найти углы в lat / lng наземного наложения, заданные в kml-файле либо в php, либо в javascript.
Т.е. для конкретного примера мне нужно получить от:
<LatLonBox> <north>60.406505416667</north> <south>60.400570555556</south> <east>5.3351572222222</east> <west>5.3190577777778</west> <rotation>3.7088732260919</rotation> </LatLonBox>
к угловым координатам
SW: 60.400316388889;5.3194425 SE: 60.400824722222;5.3355405555556 NE: 60.406759444444;5.3347738888889 NW: 60.406251388889;5.3186730555556
Я могу получить другой способ (примерно, по крайней мере, код php)
$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 ) );
Должно быть легко вернуться, но я использовал часы для этого, не добравшись туда. Какие-нибудь советы?
Для полной точности вам необходимо использовать сферическую тригонометрию , часть сферической геометрии . Однако, поскольку вы имеете дело только с небольшой частью сферы, геометрия евклидова будет делать, если вы помните одну вещь.
По мере увеличения широты линии долготы сближаются. Например, вблизи Северного полюса широтные линии почти касаются друг друга. Так что обусловливайте свои широтные различия, уменьшая их за счет умножения на cos (широта). Это даст вам достаточно хорошую точность для вашего приложения.
$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, ));
-$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, ));
Моя переменная $squish
– это cos (lat), о которой я упоминал. Относительная часть горизонтальной длины отбрасывается. Таблица синусов выглядит так:
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)
Возможно, tttppp может объяснить отличия от таблицы tttppp.