2 puan (Lat / Long) arasında PHP bağıl pozisyonu

3 Cevap php

Her nokta için Enlem ve Boylam ile havaalanlarından bir veritabanı var. Ben onların mesafe ve göreli yönü ile yakın bir verilen havaalanı olan tüm havaalanlarını, bulmak için bir PHP komut dosyası çalıştırmak istiyorum.

Yani Havaalanı KLDJ için (40-37-02.810N 074-14-40.539W)

Airport Nearby
KJFK - John F Kennedy Airport (21.2 nm NE) (40-38-23.104N 073-46-44.132W)

Ben mesafeyi bulmak için http://www.movable-type.co.uk/scripts/latlong.html kod kullanılır ve doğru olmayabilir, hangi taşıyan bulmak için kullanmaya çalıştık.

//BEARING RHUMB LINE
$phi = log(tan($lat2/2+pi/4)/tan($lat1/2+pi/4));
$distance['bearing'] = (rad2deg(atan2($theta, $phi)) +180) % 360;

Temelde bu komut dosyası aracılığıyla tüm noktalarını çalıştırmak ve ben zaten mesafeyi bulmak istiyorum, ama sonra yön. (Yani, N, S, W, E, NW, SW, NE, SE)

3 Cevap

Ağır here teknikleri borç ve verileri kullanarak here, I Bu örnek, bir araya

<?php

$chicago = array(
    'lat' => 41.9
  , 'lng' => 87.65
);

$dallas = array(
    'lat' => 32.73
  , 'lng' => 96.97
);

$ftworth = array(
    'lat' => 32.82
  , 'lng' => 97.35
);

$bearing = getBearingBetweenPoints( $dallas, $chicago );

echo "Bearing: $bearing&deg;<br>";
echo "Direction: " . getCompassDirection( $bearing );

function getBearingBetweenPoints( $point1, $point2 )
{
  return getRhumbLineBearing( $point1['lat'], $point2['lng'], $point2['lat'], $point1['lng'] );
}

function getRhumbLineBearing($lat1, $lon1, $lat2, $lon2) {
  //difference in longitudinal coordinates
  $dLon = deg2rad($lon2) - deg2rad($lon1);

  //difference in the phi of latitudinal coordinates
  $dPhi = log(tan(deg2rad($lat2) / 2 + pi() / 4) / tan(deg2rad($lat1) / 2 + pi() / 4));

  //we need to recalculate $dLon if it is greater than pi
  if(abs($dLon) > pi()) {
    if($dLon > 0) {
      $dLon = (2 * pi() - $dLon) * -1;
    }
    else {
      $dLon = 2 * pi() + $dLon;
    }
  }
  //return the angle, normalized
  return (rad2deg(atan2($dLon, $dPhi)) + 360) % 360;
}

function getCompassDirection( $bearing )
{
  static $cardinals = array( 'N', 'NE', 'E', 'SE', 'S', 'SW', 'W', 'NW', 'N' );
  return $cardinals[round( $bearing / 45 )];
}

Pozisyon B enlem o doğuda ya da batıda var olup olmadığını belirlemek için pozisyon A enlem daha büyük veya daha küçük olup olmadığını kontrol edebilirsiniz. Kuzey ve güney için boylam ile aynı şey. Son olarak sürüklenme bir ara yöne geçmek için yeterince büyük olduğu durumda, tespit etmek için, bir eşik gerekir.

Baktığımızda another page from the same website:

$lat = 0;  // latitude of centre of bounding circle in degrees
$lon = 0;  // longitude of centre of bounding circle in degrees
$rad = 0;  // radius of bounding circle in chosen units

// Choose your unit of measure... 
$r = 6371;  // earth's radius in km
$r = 3959;  // earth's radius in miles
// or
$r = 3440;  // earth's radius in nautical miles

// convert point of origin to radians
$lat = deg2rad($lat);
$lon = deg2rad($lon);

// first-cut bounding box (in radians)
$maxLat = $lat + $rad / $r;
$minLat = $lat - $rad / $r;
// compensate for longitude getting smaller with increasing latitude
$maxLon = ( $lon + $rad / $r ) / cos( $lat );
$minLon = ( $lon - $rad / $r ) / cos( $lat );

sorgusu ile birlikte:

$query = 'SELECT
  id
, lat
, lon
, ACOS(SIN('.$lat.') * SIN(RADIANS(lat)) + COS('.$lat.') * COS(RADIANS(lat)) * COS(RADIANS(lon) - '. $lon.')) * '.$r.' AS distance
FROM (
   SELECT
     id
   , lat
   , lon
   FROM MyTable
   WHERE 
     RADIANS(lat) > $minLat AND RADIANS(lat) < '.$maxLat.'
    AND 
     RADIANS(lon) > $minLon AND RADIANS(lon) < '.$maxLon.'
) AS FirstCut 
WHERE ACOS(SIN('.$lat.') * SIN(RADIANS(lat)) + COS('.$lat.') * COS(RADIANS(lat)) * COS(RADIANS(lon) - '. $lon.')) * '.$r.' < '.$rad;

Eğer belirtilen sınırlayıcı daire içinde bir yerlerde listesi (ve daire kökenli kendi mesafeyi) seçer.

Yapmak için sol tek şey yerleri iade için bir yatağı olduğunu hesaplamak. Lütfen kerte hattı formülü ile yapılabilir hangi.

Yukarıdaki Eğer veritabanı derece koordinatları ile dolu olduğunu varsayar.

Eğer geometri nesneler olarak saklanır yerleri olsaydı, sen-ebil kullanma MySQL's inbuilt spatial functions. Ben eminim rağmen MySQL sadece dikdörtgen sınırlayıcı içermez.