ホームページ >バックエンド開発 >PHPチュートリアル >PHP 地理位置情報の検索と距離の計算

PHP 地理位置情報の検索と距離の計算

墨辰丷
墨辰丷オリジナル
2018-06-05 14:34:302231ブラウズ

この記事では主に PHP の地理的位置検索と距離計算について紹介します。興味のある方はぜひ参考にしてください。

地理的位置検索
LBS は、各場所の緯度と経度の座標を保存し、近くの場所を検索し、クエリの効率を向上させるために地理的場所のインデックスを確立します。
Mongodb の地理的位置インデックス、2D および 2DSphere、平面と球体に対応します。

1. lbs コレクションの保管場所の座標を作成します


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: "天平架" 
  } 
)


2. 地理的な場所のインデックスを作成します



3. 現在の場所は次のとおりです。タイムズスクエア、

座標 :



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


1キロ以内の近くの地点を近いものから遠い順に並べて検索します

113.323568, 23.146436


検索結果:

コードは次のとおりです:

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

php コードは次のとおりです:

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


PHP コードをデモンストレーションするには、まずユーザーを作成し、mongodb の lbs で認証を実行する必要があります。方法は次のとおりです:


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




2 点の地理座標間の距離を計算します

機能: パイと地球の半径係数と、 2 点座標の経度と緯度。
2 点の座標距離を取得します:


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





概要

: 以上がこの記事の全内容です。皆様のお役に立てれば幸いです。勉強。

関連する推奨事項:

php Curlを使用して学校のRenrenネットワークへのログインをシミュレートする簡単な方法


PHPで短いURLを生成する方法のまとめ


以上がPHP 地理位置情報の検索と距離の計算の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。