Intereting Posts
Использовать PHP для динамического добавления в файл .htaccess? Как выполнить правильную сдвиг без изменений в PHP? Как редактировать отдельную страницу в WordPress Многоуровневое меню с PHP / MySQL Конвертировать дату в gmt – php Преобразование временной метки в относительную дату / время (например, «2 минуты назад») и постоянное обновление ее с помощью Javascript Как добавить Ajax в существующую основанную на PHP и Mysql разбивку на страницы Как заменить один цвет на другой в png 24 альфа-прозрачном изображении с помощью GD Функция MySQL для определения близости / диапазона Zip-кода Создайте страницу WordPress, перенаправляющую на другой URL-адрес Преобразование PDF в HTML Проблема с выделенной областью связи LinkedIn с библиотекой PHP Сообщение не получает автоматически для Telegram CHATBOT funciton с помощью PHP Сортировка многомерного массива, построенного из данных CSV, с использованием PHP Неустранимая ошибка: время выполнения 30 секунд превышено в phpmyadmin

Вычислить lat / lng углов наложения на землю из kml-файла

Мне нужно найти углы в 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.