function location_views_filter_handler_proximity in Location 5.3
Same name and namespace in other branches
- 5 contrib/location_views/location_views.module \location_views_filter_handler_proximity()
1 call to location_views_filter_handler_proximity()
- location_views_filter_handler_user_proximity in contrib/
location_views/ location_views.module - Proximity filter Uses functions and queries created in location.inc and earth.inc and re-factors them to work in views
1 string reference to 'location_views_filter_handler_proximity'
- location_views_tables in contrib/
location_views/ location_views.module - Implementation of hook_views_tables().
File
- contrib/
location_views/ location_views.module, line 943 - Views-enables the location module.
Code
function location_views_filter_handler_proximity($op, $filter, $filterinfo, &$query, $table = 'location') {
$unit = 'miles';
$distance = $filter['operator'];
if (is_array($filter['value']) && isset($filter['value']['latitude'])) {
$lat = $filter['value']['latitude'];
$lon = $filter['value']['longitude'];
}
else {
$zip = $filter['value'];
// @@@ This needs to factor in country.
$result = db_query("SELECT * FROM {zipcodes} WHERE zip = '%s'", $zip);
while ($arr = db_fetch_array($result)) {
$lat = $arr['latitude'];
$lon = $arr['longitude'];
}
}
if (!$lat || !$lon) {
return;
}
$divisor = $unit == 'km' ? 1000 : 1609.347;
$latrange = earth_latitude_range($lon, $lat, $distance * $divisor);
$lonrange = earth_longitude_range($lon, $lat, $distance * $divisor);
$query
->ensure_table($table);
$query
->add_orderby(NULL, "((" . earth_distance_sql($lon, $lat) . ") / {$divisor})", 'ASC', 'distance');
$query
->add_where("{$table}.longitude IS NOT NULL");
$query
->add_where("{$table}.latitude > %f AND {$table}.latitude < %f AND {$table}.longitude > %f AND {$table}.longitude < %f", $latrange[0], $latrange[1], $lonrange[0], $lonrange[1]);
}