Kml dosyasından zemin kaplaması köşelerinden lat / lng hesaplayın

2 Cevap php

Ben php veya javascript ya kml dosyasında verilen bir zemin kaplaması lat / LNG köşeleri bulmak gerekir.

Yani özel bir örnek için I almak gerekir:

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

koordinatları köşeye

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

Ben tarafından başka bir şekilde (yaklaşık en azından, php kodu verilir) alabilirsiniz

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

Geri almak kolay olmalı, ama ben orada almadan bunun için saat kullandım. Herhangi bir ipucu?

2 Cevap

Tam doğruluk için, spherical trigonometry spherical geometry bölümünü kullanmanız gerekir. Eğer kürenin sadece küçük bir parça ile ilgileniyor beri tek bir şeyi unutmayın Ancak, Öklid geometrisi yapacağız.

Enlem arttıkça, boylam çizgileri birbirine yakın olsun. Örneğin, Kuzey Kutbu yakınlarında, enlem çizgileri neredeyse dokunaklı vardır. Yani cos (enlem) bir faktör tarafından mulitlying onları azalan, sizin enlem farklılıkları durum. İşte size uygulaması için yeterince iyi doğruluk verecektir.

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

Benim $squish değişkeni (lat) bahsettiğim cos. Yatay uzunlukları göreceli kısmı için de-squishing bulunmaktadır. Sinüs tablo bu gibi görünüyor:

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)

Belki tttppp tttppp masadan farkları için hesap verebilecek.

Orijinal dikdörtgenin genişliğini ve yüksekliğini bulun ve sonra x = yarım genişliğini tanımlamak, y yarısı yüksekliği =. Let A radyan (saat yönünün tersine) döndürülmüş açısı olabilir. Kökeni (a, b) dikdörtgenin merkezinin konumudur.

Dört köşe sona ermesi:

NE: (a + x cos A - y sin A, b + x sin A + y cos A)
NW: (a - x sin A - y cos A, b + x cos A - y sin A)
SW: (a - x cos A + y sin A, b - x sin A - y cos A)
SE: (a + x sin A + y cos A, b - x cos A + y sin A)