You are here

function location_views_filter_handler_proximity in Location 5.3

Same name and namespace in other branches
  1. 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]);
}