緯度経度から距離を求める

ある地点Aから半径D内にあるものBを座標から計算し、そのidを取得するスクリプト。A、Bはそれぞれ複数あるものとし、また座標は10進法で示されているとする。

  • $mainArr:基準とする配列
  • $subArr:対象とする配列
$mainArr = array(
array("id" => "1", "lat" => "138.5308503", "lon" => "38.35030980"),
array("id" => "2", "lat" => "138.0935304", "lon" => "38.70928344"),
array("id" => "3", "lat" => "138.2733980", "lon" => "38.39500453")
);
$subArr= array(
array("id" => "1", "lat" => "138.5308503", "lon" => "38.35030980"),
array("id" => "2", "lat" => "138.0935304", "lon" => "38.70928344"),
array("id" => "3", "lat" => "138.2733980", "lon" => "38.39500453")
);
$c = new latlon();
$rs = $c->checkCoordList($mainArr, $subArr);
print_r($rs);
class latlon {
function latlon(){;}
function checkCoordList($mainArr, $subArr) {
$rd = 1000000;//測定したい半径(m)
$radius = 6378137;//地球の半径(m)
//lat 緯度 lon 経度
foreach($mainArr as $val){
$slat = $this->getCoordSec($val['lat']);
$slon = $this->getCoordSec($val['lon']);
foreach($subArr as $subval){
$glat = $this->getCoordSec($subval['lat']);
$glon = $this->getCoordSec($subval['lon']);
$deg = ($this->getCoordSec($val['lat']) + $this->getCoordSec($subval['lat'])) / 2;
$dlon = ($glon - $slon) * cos($deg);
$dlat = $glat - $slat;
$d = sqrt(pow($dlon,2) + pow($dlat,2)) * $radius;
if(($d <= $rd) && ($d > 0)){
$a['m'] = $val['id'];
$a['s'] = $subval['id'];
$maplist[] = $a;
$a = array();
}
}
}
return $maplist;
}
//ラジアンを取得
function getCoordSec($num) {
$s = $num * pi() / 180;
return $s;
}
}

参考

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA