Calcule el lat / lng de las esquinas de la superposición del terreno desde el archivo kml

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Necesito encontrar las esquinas en lat / lng de una superposición de tierra dada en un archivo kml en php o javascript.

I.e. para un ejemplo específico que necesito obtener de:

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

a coordenadas de esquina

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

Puedo obtener el otro camino (aproximadamente al menos, código php dado) 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  ) );

Debería ser fácil de recuperar, pero he usado horas para esto sin llegar allí. ¿Algún consejo?

¿Fue útil?

Solución

Debe usar trigonometría esférica , parte de geometría esférica para una precisión total. Sin embargo, dado que solo se trata de una pequeña parte de la esfera, la geometría euclidiana funcionará si recuerda una cosa.

A medida que aumenta la latitud, las líneas de longitud se acercan. Por ejemplo, cerca del Polo Norte, las líneas de latitud casi se tocan. Por lo tanto, condicione sus diferencias de latitud, disminuyéndolas por un factor de cos (latitud). Eso le dará la precisión suficiente para su aplicación.

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

Mi variable $ squish es el cos (lat) que mencioné. Hay un aplastamiento para la parte relativa de las longitudes horizontales. La tabla seno se ve así:

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)

Quizás tttppp podría explicar las diferencias con la tabla de tttppp.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top