Ejemplo n.º 1
0
 /**
  * 逆ジオコーディング
  * 引数の緯度経度に近い地理情報を近い順に複数返す。
  * 
  * @param float $lat   緯度
  * @param float $lng   軽度
  * @param int   $limit 取得件数
  * @return Dm_Geocoder_Address[]
  */
 public static function reverseGeocode($lat, $lng, $limit = 10)
 {
     $prefectures = array_keys(Dm_Geocoder_Prefecture::get());
     $addressList = array();
     //都道府県のCSV毎ループ
     foreach ($prefectures as $prefecture) {
         $location = Dm_Geocoder_Prefecture::getLocation($prefecture);
         $tolerance = 1.0;
         //ある程度の範囲までを対象とする
         if ($location['minLat'] - $tolerance > $lat) {
             continue;
         }
         if ($location['maxLat'] + $tolerance < $lat) {
             continue;
         }
         if ($location['minLng'] - $tolerance > $lng) {
             continue;
         }
         if ($location['maxLng'] + $tolerance < $lng) {
             continue;
         }
         $reader = new Dm_Geocoder_GISCSV_Reader($prefecture);
         // CSVの1行毎にループ
         // $rowはDm_Geocoder_Addressオブジェクト
         foreach ($reader as $key => $row) {
             $count = count($addressList);
             $distance = self::location_distance($row->lat, $row->lng, $lat, $lng);
             if ($count < $limit) {
                 $addressList[] = array('address' => $row, 'distance' => $distance['distance']);
                 //1件目なら後続の処理は飛ばす
                 if ($count === 0) {
                     continue;
                 }
                 //距離順にソート
                 usort($addressList, array(__CLASS__, 'compareDistance'));
             } else {
                 //保持している中で一番遠いaddressオブジェクト
                 $end = end($addressList);
                 $endDistance = $end['distance'];
                 $nowDistance = self::location_distance($row->lat, $row->lng, $lat, $lng);
                 $nowDistance = $nowDistance['distance'];
                 if ($endDistance > $nowDistance) {
                     $addressList[] = array('address' => $row, 'distance' => $distance['distance']);
                     //近い順にソートする
                     usort($addressList, array(__CLASS__, 'compareDistance'));
                     //1つ追加したので、(一番遠い)末尾から1つ削除する
                     array_pop($addressList);
                 }
             }
         }
     }
     foreach ($addressList as $key => $row) {
         $addressList[$key] = $row['address'];
     }
     return $addressList;
 }