Вычислить широту / долготу углов наложения грунта из kml-файла - PullRequest
3 голосов
/ 26 октября 2009

Мне нужно найти углы в широте / ширине наложения на землю, заданные в 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  ) );

Должно быть легко вернуться, но я потратил часы на это, не добираясь туда. Любые советы?

1 Ответ

4 голосов
/ 26 октября 2009

Вам необходимо использовать сферическую тригонометрию , часть сферической геометрии для полной точности. Однако, поскольку вы имеете дело только с небольшим кусочком сферы, евклидова геометрия подойдет, если вы помните одну вещь.

По мере увеличения широты линии долготы сближаются. Например, около Северного полюса линии широты почти соприкасаются. Так что обусловьте свои различия по широте, уменьшая их путем умножения на коэффициент 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,
 ));

Моя $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.

...