예제 #1
0
 public function testGetCoordinates()
 {
     foreach (self::$_fields as $level => $fields) {
         $location = new CM_Model_Location($level, $fields['id']);
         $coordinates = $location->getCoordinates();
         if ($level >= CM_Model_Location::LEVEL_CITY) {
             $this->assertInternalType('array', $coordinates);
             $this->assertCount(2, $coordinates);
             $this->assertInternalType('float', $coordinates['lat']);
             $this->assertInternalType('float', $coordinates['lon']);
         } else {
             $this->assertNull($location->getCoordinates());
         }
     }
 }
예제 #2
0
 /**
  * @param CM_Model_Location $location
  * @return int|null
  */
 public function getDistance(CM_Model_Location $location)
 {
     $currentCoordinates = $this->getCoordinates();
     $againstCoordinates = $location->getCoordinates();
     if (!$currentCoordinates || !$againstCoordinates) {
         return null;
     }
     $pi180 = M_PI / 180;
     $currentCoordinates['lat'] *= $pi180;
     $currentCoordinates['lon'] *= $pi180;
     $againstCoordinates['lat'] *= $pi180;
     $againstCoordinates['lon'] *= $pi180;
     $arcCosine = acos(sin($currentCoordinates['lat']) * sin($againstCoordinates['lat']) + cos($currentCoordinates['lat']) * cos($againstCoordinates['lat']) * cos($currentCoordinates['lon'] - $againstCoordinates['lon']));
     return (int) round(self::EARTH_RADIUS * $arcCosine);
 }
예제 #3
0
파일: Query.php 프로젝트: cargomedia/cm
 /**
  * @param string            $field
  * @param CM_Model_Location $location
  */
 public function sortGeoDistance($field, CM_Model_Location $location)
 {
     if (!$location->getCoordinates()) {
         return;
     }
     $this->_sort(array('_geo_distance' => array($field => $location->getCoordinates())));
 }