/** * @param array $findZipCodes * @param string $city * @return string */ private function getQueryForZipCodesByRadius(array $findZipCodes, $city) { $geoLocation = new SJB_GeoLocation(); $radiusSearchUnit = SJB_System::getSettingByName('radius_search_unit'); if ($city) { $minLatitude = $maxLatitude = $findZipCodes[0]['latitude']; $minLongitude = $maxLongitude = $findZipCodes[0]['longitude']; $stateCode = $findZipCodes[0]['state_code']; $countrySid = $findZipCodes[0]['country_sid']; foreach ($findZipCodes as $zipCode) { if ($stateCode != $zipCode['state_code'] || $countrySid != $zipCode['country_sid']) { return ''; } else { $zipLatitude = $zipCode['latitude']; $zipLongitude = $zipCode['longitude']; if ($zipLatitude < $minLatitude) { $minLatitude = $zipLatitude; } else { if ($zipLatitude > $maxLatitude) { $maxLatitude = $zipLatitude; } } if ($zipLongitude < $minLongitude) { $minLongitude = $zipLongitude; } else { if ($zipLongitude > $maxLongitude) { $maxLongitude = $zipLongitude; } } } } $distance = SJB_LocationManager::getDistanceBetweenPointsInKm($minLatitude, $minLongitude, $maxLatitude, $maxLongitude); $distance /= 2; $distance += $radiusSearchUnit == 'kilometers' ? $this->value['radius'] : $this->value['radius'] * 1.60934; $centralLatitude = ($minLatitude + $maxLatitude) / 2; $centralLongitude = ($minLongitude + $maxLongitude) / 2; $centralLocation = $geoLocation->fromDegrees($centralLatitude, $centralLongitude); $query = SJB_LocationManager::findPlacesWithinDistance($centralLocation, $distance); $query .= " AND (`city` != '" . SJB_DB::quote($city) . "')"; } else { $query = array(); $distance = $radiusSearchUnit == 'kilometers' ? $this->value['radius'] : $this->value['radius'] * 1.60934; foreach ($findZipCodes as $zipCode) { $myLocation = $geoLocation->fromDegrees($zipCode['latitude'], $zipCode['longitude']); $query[] = SJB_LocationManager::findPlacesWithinDistance($myLocation, $distance); } $query = implode(' OR ', $query); } return "SELECT `name` FROM `locations` WHERE {$query}"; }