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

StackOverflow https://stackoverflow.com/questions/1624574

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top