diff --git a/views/views_geojson_bbox_argument.inc b/views/views_geojson_bbox_argument.inc
index 1dc429f..c9f2143 100644
--- a/views/views_geojson_bbox_argument.inc
+++ b/views/views_geojson_bbox_argument.inc
@@ -2,7 +2,7 @@
 
 /**
  * @file
- *
+ * Defines an argument handler that handles a bbox string.
  */
 
 /**
@@ -10,28 +10,62 @@
  */
 class views_geojson_bbox_argument extends views_handler_argument {
 
-  /*
+  /**
    * Filter options definition.
    */
-  function option_definition() {
+  public function option_definition() {
     $options = parent::option_definition();
+    $options['search_api_location_field'] = array('default' => '');
     return $options;
   }
 
   /**
-   *
+   * Provide additional option form elements.
    */
-  function default_argument_form(&$form, &$form_state) {
+  public function default_argument_form(&$form, &$form_state) {
     parent::default_argument_form($form, $form_state);
     // Clarify this, since we're treating pulling from the query string as
     // different than a normal arg.
     $form['no_argument']['#title'] = 'When the filter value is NOT in the URL <em>as a normal Drupal argument</em>';
+
+    // If this is a search api index provide a select box to define which field
+    // is the location field to use.
+    if (module_exists('search_api') && strpos($this->view->base_table, 'search_api_index_') === 0) {
+      $index_name = str_replace('search_api_index_', '', $this->view->base_table);
+      if ($index = search_api_index_load($index_name)) {
+        $location_fields = array();
+        foreach (search_api_location_get_location_fields($index) as $key => $field) {
+          $location_fields[$key] = $field['name'];
+        }
+        $form['search_api_location_field'] = array(
+          '#type' => 'select',
+          '#title' => t('Search API location field'),
+          '#description' => t('This view was recognized as Search API view. Please defined the location field to use'),
+          '#default_value' => $this->options['search_api_location_field'],
+          '#options' => $location_fields,
+          '#weight' => -1,
+        );
+      }
+    }
   }
 
-  /*
-   * Split BBOX string into {left, bottom, right, top}
+  /**
+   * Parses the combined bbox value into the single values.
+   *
+   * A bbox is defined as: left,bottom,right,top. This method splits the
+   * combined values into it's parts and returns them as associative array.
+   *
+   * @param string $bbox_coords_str
+   *   Combined bbox argument in the format: left,bottom,right,top
+   *
+   * @return array
+   *   Associative array with the bbox coordinates in the keys:
+   *   - left
+   *   - bottom
+   *   - right
+   *   - top
    */
-  function _explode_bbox_coords($bbox_coords_str) {
+  protected function parseBboxString($bbox_coords_str) {
     $bbox_coords = explode(',', $bbox_coords_str);
     if (count($bbox_coords) == 4) {
       $bbox = array(
@@ -44,10 +78,79 @@ class views_geojson_bbox_argument extends views_handler_argument {
     }
   }
 
-  /*
+  /**
+   * Get the "radius" of the bounding box rectangle.
+   *
+   * @see views_geojson_bbox_argument::parseBboxString()
+   *
+   * @param array $corners
+   *   The corner coordinates as returned by
+   *   views_geojson_bbox_argument::parseBboxString().
+   *
+   * @return float
+   *   The radius in kilometres.
+   */
+  protected function calcRadius($corners) {
+    $delta_lon = $corners['right'] - $corners['bottom'];
+    $distance = sin(deg2rad($corners['bottom'])) * sin(deg2rad($corners['top'])) + cos(deg2rad($corners['bottom'])) * cos(deg2rad($corners['top'])) * cos(deg2rad($delta_lon));
+
+    $distance = acos($distance);
+    $distance = rad2deg($distance);
+
+    // Convert to kilometers.
+    $distance = $distance * 111.12;
+    $distance = round($distance, 4);
+
+    return $distance;
+  }
+
+  /**
+   * Calculates the center point of the bounding box rectangle.
+   *
+   * @see views_geojson_bbox_argument::parseBboxString()
+   *
+   * @param array $corners
+   *   The corner coordinates as returned by
+   *   views_geojson_bbox_argument::parseBboxString().
+   *
+   * @return array
+   *   Associative array with center coordinates of the bbox. Keys:
+   *   - lat
+   *   - lon
+   */
+  protected function calcCenter($corners) {
+    $point['lat'] = ($corners['bottom'] + $corners['top']) / 2;
+    $point['lon'] = ($corners['left'] + $corners['right']) / 2;
+    return $point;
+  }
+
+  /**
    * Use the filter to modify the query.
    */
-  function query($group_by = FALSE) {
+  public function query($group_by = FALSE) {
+    $bbox = $this->parseBboxString($this->argument);
+
+    // If this a search api index create the search_api_location options and
+    // let the index services handle the query.
+    if (strpos($this->view->base_table, 'search_api_index_') === 0) {
+      $location_options = $this->query->getOption('search_api_location', array());
+      // Calculate additional information to provide to search_api_location
+      // integrations.
+      $radius = $this->calcRadius($bbox) / 2;
+      $center = $this->calcCenter($bbox);
+      $location_options[] = array(
+        'field' => $this->options['search_api_location_field'],
+        'lat' => $center['lat'],
+        'lon' => $center['lon'],
+        'radius' => $radius,
+        'bbox' => $bbox,
+        'method' => 'bbox',
+      );
+      // Add it to the query.
+      $this->query->setOption('search_api_location', $location_options);
+      return;
+    }
+
     $this->ensure_my_table();
     // TODO: this argument should be set in
     // views_plugin_argument_default_bboxquery::get_argument
@@ -55,9 +158,7 @@ class views_geojson_bbox_argument extends views_handler_argument {
     // @see http://drupal.org/node/1884214
     if ((empty($this->argument)) || ($this->view->base_field == 'search_api_id')) {
       return;
-     }
-    $this->ensure_my_table();
-    $bbox = $this->_explode_bbox_coords($this->argument);
+    }
 
     // If bbox not set properly, don't edit the query.
     // @TODO: Move this into argument validation?
@@ -89,7 +190,8 @@ class views_geojson_bbox_argument extends views_handler_argument {
       // latlon, since we're just going to get lat & lon from geofield anyway.
       $lat_field_obj = $lon_field_obj = $this->view->field[$data_source['geofield']];
       $lat_field_table = $lon_field_table = $lat_field_obj->table;
-    } else {
+    }
+    else {
       return;
     }
 
@@ -98,38 +200,42 @@ class views_geojson_bbox_argument extends views_handler_argument {
     if (isset($lat_field_obj->field_info) && $lat_field_obj->field_info['type'] == 'geofield') {
       // @TODO: Maybe the field name can really just be "${lat_field_obj}_lat"?
       $lat_field_name = $lat_field_obj->field_info['storage']['details']['sql']['FIELD_LOAD_CURRENT'][$lat_field_table]['lat'];
-    } else {
+    }
+    else {
       $lat_field_name = $lat_field_obj->real_field;
     }
     if (isset($lon_field_obj->field_info) && $lon_field_obj->field_info['type'] == 'geofield') {
       $lon_field_name = $lon_field_obj->field_info['storage']['details']['sql']['FIELD_LOAD_CURRENT'][$lon_field_table]['lon'];
-    } else {
+    }
+    else {
       $lon_field_name = $lon_field_obj->real_field;
     }
 
     // Add JOIN(s) to query.
     $this->query->ensure_table($lat_field_table);
-     if ($lon_field_table != $lat_field_table) {
+    if ($lon_field_table != $lat_field_table) {
       $this->query->ensure_table($lon_field_table);
     }
 
     // Add WHERE(s) to query.
     $left = $bbox['left'];
     $right = $bbox['right'];
-    // OpenLayers' longitude bbox values can be >180 or <-180 when the map wraps around.
-    // We need to turn these into BETWEENs with OR.
+    // OpenLayers' longitude bbox values can be >180 or <-180 when the map wraps
+    // around. We need to turn these into BETWEENs with OR.
     if ($right - $left < 360) {
       $group = $this->query->set_where_group('AND');
       if ($left > -180) {
         $this->query->add_where($group, "$lon_field_table.$lon_field_name", $left, '>=');
-      } else {
+      }
+      else {
         $this->query->set_where_group('OR', $group);
         $left = -1 * ($left % 180);
         $this->query->add_where($group, "$lon_field_table.$lon_field_name", array($left, 0), 'BETWEEN');
       }
       if ($right < 180) {
         $this->query->add_where($group, "$lon_field_table.$lon_field_name", $right, '<=');
-      } else {
+      }
+      else {
         $this->query->set_where_group('OR', $group);
         $right = -1 * ($right % 180);
         $this->query->add_where($group, "$lon_field_table.$lon_field_name", array($right, 0), 'BETWEEN');
