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()); } } }
/** * @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); }
/** * @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()))); }