Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Geolokalisierungssuche und Entfernungsberechnung

PHP-Geolokalisierungssuche und Entfernungsberechnung

墨辰丷
墨辰丷Original
2018-06-05 14:34:302128Durchsuche

Dieser Artikel stellt hauptsächlich die geografische Standortsuche und Entfernungsberechnung von PHP vor. Ich hoffe, dass er für alle hilfreich ist.

Geografische Standortsuche
LBS speichert die Breiten- und Längenkoordinaten jedes Standorts, sucht nach Standorten in der Nähe und erstellt einen geografischen Standortindex, um die Abfrageeffizienz zu verbessern.
Mongodb geografischer Standortindex, 2d und 2dsphere, entsprechend Ebene und Sphäre.

1. Erstellen Sie die Koordinaten des Pfund-Sammellagerorts


use lbs; 
 
db.lbs.insert( 
  { 
    loc:{ 
      type: "Point", 
      coordinates: [113.332264, 23.156206] 
    }, 
    name: "广州东站" 
  } 
) 
 
db.lbs.insert( 
  { 
    loc:{ 
      type: "Point", 
      coordinates: [113.330611, 23.147234] 
    }, 
    name: "林和西" 
  } 
) 
 
db.lbs.insert( 
  { 
    loc:{ 
      type: "Point", 
      coordinates: [113.328095, 23.165376] 
    }, 
    name: "天平架" 
  } 
)


Erstellen Sie einen geografischen Standortindex


db.lbs.ensureIndex( 
  { 
    loc: "2dsphere" 
  } 
)


3. Koordinaten in der Nähe abfragen
Der aktuelle Standort ist: Times Square,
Koordinaten:


113.323568, 23.146436


Suche nach Punkten in der Nähe innerhalb eines Kilometers, sortiert vom nächsten zum entferntesten


db.lbs.find( 
  { 
    loc: { 
      $near:{ 
        $geometry:{ 
          type: "Point", 
          coordinates: [113.323568, 23.146436] 
        }, 
        $maxDistance: 1000 
      } 
    } 
  } 
)


Suchergebnisse:

Der Code lautet wie folgt:


{ "_id" : ObjectId("556a651996f1ac2add8928fa"), "loc" : { "type" : "Point", "coordinates" : [ 113.330611, 23.147234 ] }, "name" : "Lin Hexi" }


Die php Der Code lautet wie folgt:


<?php 
// 连接mongodb 
function conn($dbhost, $dbname, $dbuser, $dbpasswd){ 
  $server = &#39;mongodb://&#39;.$dbuser.&#39;:&#39;.$dbpasswd.&#39;@&#39;.$dbhost.&#39;/&#39;.$dbname; 
  try{ 
    $conn = new MongoClient($server); 
    $db = $conn->selectDB($dbname); 
  } catch (MongoException $e){ 
    throw new ErrorException(&#39;Unable to connect to db server. Error:&#39; . $e->getMessage(), 31); 
  } 
  return $db; 
} 
 
// 插入坐标到mongodb 
function add($dbconn, $tablename, $longitude, $latitude, $name){ 
  $index = array(&#39;loc&#39;=>&#39;2dsphere&#39;); 
  $data = array( 
      &#39;loc&#39; => array( 
          &#39;type&#39; => &#39;Point&#39;, 
          &#39;coordinates&#39; => array(doubleval($longitude), doubleval($latitude)) 
      ), 
      &#39;name&#39; => $name 
  ); 
  $coll = $dbconn->selectCollection($tablename); 
  $coll->ensureIndex($index); 
  $result = $coll->insert($data, array(&#39;w&#39; => true)); 
  return (isset($result[&#39;ok&#39;]) && !empty($result[&#39;ok&#39;])) ? true : false; 
} 
 
// 搜寻附近的坐标 
function query($dbconn, $tablename, $longitude, $latitude, $maxdistance, $limit=10){ 
  $param = array( 
    &#39;loc&#39; => array( 
      &#39;$nearSphere&#39; => array( 
        &#39;$geometry&#39; => array( 
          &#39;type&#39; => &#39;Point&#39;, 
          &#39;coordinates&#39; => array(doubleval($longitude), doubleval($latitude)),  
        ), 
        &#39;$maxDistance&#39; => $maxdistance*1000 
      ) 
    ) 
  ); 
 
  $coll = $dbconn->selectCollection($tablename); 
  $cursor = $coll->find($param); 
  $cursor = $cursor->limit($limit); 
   
  $result = array(); 
  foreach($cursor as $v){ 
    $result[] = $v; 
  }  
 
  return $result; 
} 
 
$db = conn(&#39;localhost&#39;,&#39;lbs&#39;,&#39;root&#39;,&#39;123456&#39;); 
 
// 随机插入100条坐标纪录 
for($i=0; $i<100; $i++){ 
  $longitude = &#39;113.3&#39;.mt_rand(10000, 99999); 
  $latitude = &#39;23.15&#39;.mt_rand(1000, 9999); 
  $name = &#39;name&#39;.mt_rand(10000,99999); 
  add($db, &#39;lbs&#39;, $longitude, $latitude, $name); 
} 
 
// 搜寻一公里内的点 
$longitude = 113.323568; 
$latitude = 23.146436; 
$maxdistance = 1; 
$result = query($db, &#39;lbs&#39;, $longitude, $latitude, $maxdistance); 
print_r($result); 
?>


Um den PHP-Code zu demonstrieren, müssen Sie zunächst einen Benutzer erstellen und Auth in mongodbs lbs ausführen. Die Methode ist wie folgt:


use lbs; 
db.createUser( 
  { 
    "user":"root", 
    "pwd":"123456", 
    "roles":[] 
  } 
) 
 
db.auth( 
  { 
    "user":"root", 
    "pwd":"123456" 
  } 
)



Berechnen Sie den Abstand zwischen zwei geografische Koordinaten
Funktion: Berechnen Sie den sphärischen Abstand zwischen zwei Punkten basierend auf dem Pi-Verhältnis, dem Erdradiuskoeffizienten und dem Längen- und Breitengrad der beiden Punktkoordinaten.


Ermitteln Sie den Koordinatenabstand zwischen zwei Punkten:


<?php
/**
 * 计算两点地理坐标之间的距离
 * @param Decimal $longitude1 起点经度
 * @param Decimal $latitude1 起点纬度
 * @param Decimal $longitude2 终点经度 
 * @param Decimal $latitude2 终点纬度
 * @param Int   $unit    单位 1:米 2:公里
 * @param Int   $decimal  精度 保留小数位数
 * @return Decimal
 */
function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=2, $decimal=2){

  $EARTH_RADIUS = 6370.996; // 地球半径系数
  $PI = 3.1415926;

  $radLat1 = $latitude1 * $PI / 180.0;
  $radLat2 = $latitude2 * $PI / 180.0;

  $radLng1 = $longitude1 * $PI / 180.0;
  $radLng2 = $longitude2 * $PI /180.0;

  $a = $radLat1 - $radLat2;
  $b = $radLng1 - $radLng2;

  $distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));
  $distance = $distance * $EARTH_RADIUS * 1000;

  if($unit==2){
    $distance = $distance / 1000;
  }

  return round($distance, $decimal);

}

// 起点坐标
$longitude1 = 113.330405;
$latitude1 = 23.147255;

// 终点坐标
$longitude2 = 113.314271;
$latitude2 = 23.1323;

$distance = getDistance($longitude1, $latitude1, $longitude2, $latitude2, 1);
echo $distance.&#39;m&#39;; // 2342.38m

$distance = getDistance($longitude1, $latitude1, $longitude2, $latitude2, 2);
echo $distance.&#39;km&#39;; // 2.34km

?>




Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Studium aller hilfreich sein wird.

Verwandte Empfehlungen:

php So simulieren Sie mit Curl die Anmeldung auf der Renren-Schulwebsite

Eine einfache Möglichkeit, Prozesssteuerungsschalter in PHP zu implementieren

Zusammenfassung der Methoden zum Generieren von Kurz-URLs in PHP


Das obige ist der detaillierte Inhalt vonPHP-Geolokalisierungssuche und Entfernungsberechnung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn