Pergunta

Eu preciso encontrar os cantos em latitude / longitude de um superposição de solo dado em um arquivo KML seja em php ou javascript.

i. para um exemplo específico eu preciso para obter a partir de:

  <LatLonBox>
    <north>60.406505416667</north>
    <south>60.400570555556</south>
    <east>5.3351572222222</east>
    <west>5.3190577777778</west>
    <rotation>3.7088732260919</rotation>
  </LatLonBox>

para coordenadas de canto

SW: 60.400316388889;5.3194425
SE: 60.400824722222;5.3355405555556
NE: 60.406759444444;5.3347738888889
NW: 60.406251388889;5.3186730555556

posso obter para o outro lado (cerca de, pelo menos, o código php dada) por

$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  ) );

Deve ser fácil para voltar, mas eu tenho horas para este utilizado sem ficar lá. Alguma dica?

Foi útil?

Solução

Você precisa usar esférica trigonometria , parte de esférica geometria para precisão total. No entanto, desde que você está lidando com apenas uma pequena parte da esfera, geometria euclidiana vai fazer se você se lembrar uma coisa.

Com o aumento da latitude, as linhas de longitude se aproximar juntos. Por exemplo, perto do Pólo Norte, as linhas de latitude estão quase se tocando. Então condicionar suas diferenças de latitude, diminuindo-os por mulitlying por um fator de cos (latitude). Isso lhe dará uma boa precisão suficiente para a sua aplicação.

 $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,
 ));

Meu variável $squish é o cos (lat) que eu mencionei. Não é de-espremendo para a parte relativa de comprimentos horizontais. A aparência da tabela sine como este:

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)

Talvez tttppp poderia explicar as diferenças da tabela de tttppp.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top