=== modifié fichier modules/geocoder/geocoder.admin.inc
--- modules/geocoder/geocoder.admin.inc	2014-05-12 14:25:13 +0000
+++ modules/geocoder/geocoder.admin.inc	2014-09-09 15:02:43 +0000
@@ -25,6 +25,14 @@
     '#default_value' => empty($geocoder_settings['geocoder_apikey_yandex']) ? '' : $geocoder_settings['geocoder_apikey_yandex'],
     '#required' => FALSE,
   );
+  
+  $form['geocoder_region_google'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Google region code'),
+    '#description' => t('This regional context helps Google choose the right location. See ') . 'https://developers.google.com/maps/documentation/geocoding/#RegionCodes',
+    '#default_value' => empty($geocoder_settings['geocoder_region_google']) ? '' : $geocoder_settings['geocoder_region_google'],
+    '#required' => FALSE,
+  );
 
   $form['#submit'][] = 'geocoder_admin_settings_submit';
   return system_settings_form($form);
@@ -40,5 +48,6 @@
   $geocoder_settings= variable_get("geocoder_settings", array());
   $geocoder_settings['geocoder_apikey_yahoo'] = trim($form_state['values']['geocoder_apikey_yahoo']);
   $geocoder_settings['geocoder_apikey_yandex'] = trim($form_state['values']['geocoder_apikey_yandex']);
+  $geocoder_settings['geocoder_region_google'] = trim($form_state['values']['geocoder_region_google']);
   variable_set("geocoder_settings", $geocoder_settings);
 }

=== modifié fichier modules/geocoder/plugins/geocoder_handler/google.inc
--- modules/geocoder/plugins/geocoder_handler/google.inc	2014-05-12 14:25:13 +0000
+++ modules/geocoder/plugins/geocoder_handler/google.inc	2014-09-09 15:29:44 +0000
@@ -23,15 +23,29 @@
 /**
  * Process Markup
  */
-function geocoder_google($address, $options = array()) {
+function geocoder_google($address, $options = array(), $components = array()) {
   try {
     geophp_load();
 
     $query = array(
-      'address' => $address,
       'sensor' => 'false',
     );
 
+    if (!empty($components)) {
+      foreach ($components as $key => $value) {
+        $components[$key] = $key . ':' . $value;
+      }
+      $query['components'] = implode('|', $components);
+    }
+    else {
+      $query['address'] = $address;
+    }
+
+    $geocoder_settings= variable_get("geocoder_settings", array());
+    if (isset($geocoder_settings['geocoder_region_google']) && isset($geocoder_settings['geocoder_region_google'])) {
+      $query['region'] = $geocoder_settings['geocoder_region_google'];
+    }
+    
     $url = url("http://maps.googleapis.com/maps/api/geocode/json", array('query' => $query));
     $result = drupal_http_request($url);
 
@@ -127,7 +141,8 @@
   }
   if ($field['type'] == 'addressfield') {
     $address = geocoder_widget_parse_addressfield($field_item);
-    return geocoder_google($address, $options);
+    $components = geocoder_google_parse_addressfield($field_item);
+    return geocoder_google($address, $options, $components);
   }
   if ($field['type'] == 'location') {
     $address = geocoder_widget_parse_locationfield($field_item);
@@ -175,3 +190,16 @@
   
   return $form;
 }
+
+function geocoder_google_parse_addressfield($field_item) {
+  $components = array();
+
+  if (!empty($field_item['thoroughfare']))            $components['route'] = $field_item['thoroughfare'];
+  if (!empty($field_item['locality']))                $components['locality'] = $field_item['locality'];
+  if (!empty($field_item['sub_administrative_area'])) $components['administrative_area'] = $field_item['sub_administrative_area'];
+  elseif (!empty($field_item['administrative_area'])) $components['administrative_area'] = $field_item['administrative_area'];
+  if (!empty($field_item['country']))                 $components['country'] = $field_item['country'];
+  if (!empty($field_item['postal_code']))             $components['postal_code'] = $field_item['postal_code'];
+
+  return $components;
+}
\ Pas de retour à la ligne à la fin du fichier

=== modifié fichier modules/geocoder/plugins/geocoder_handler/mapquest_nominatim.inc
--- modules/geocoder/plugins/geocoder_handler/mapquest_nominatim.inc	2014-05-12 14:25:13 +0000
+++ modules/geocoder/plugins/geocoder_handler/mapquest_nominatim.inc	2014-09-09 15:30:16 +0000
@@ -22,18 +22,33 @@
 /**
  * Process Markup
  */
-function geocoder_mapquest_nominatim($address, $options = array()) {
+function geocoder_mapquest_nominatim($address, $options = array(), $components = array()) {
   $geocoder_settings = variable_get("geocoder_settings", array());
   $api_url = "http://open.mapquestapi.com/nominatim/v1/search";
-  $params = array(
-    'q' => str_replace(' ', '+', $address),
+  $static_params = array(
     'format' => 'json',
     'addressdetails' => 0,
     'limit' => 1,
     'osm_type' => 'N',
   );
-  $request = drupal_http_request($api_url . '?' . drupal_http_build_query($params));
-  $data = json_decode($request->data);
+  do {
+    if (!empty($components)) {
+      // Use structured request format for better results.
+      // See http://wiki.openstreetmap.org/wiki/Nominatim
+      $params = array_merge($static_params, $components);
+      // Mapquest can fail for an unknown street, even if it knows the city. So
+      // we'll ask again with less details if it fails.
+      array_shift($components);
+    }
+    else {
+      $params = $static_params;
+      $params['q'] = str_replace(' ', '+', $address);
+    }
+    $request = drupal_http_request($api_url . '?' . drupal_http_build_query($params));
+    
+    $data = json_decode($request->data);
+  }
+  while (empty($data) && !empty($components));
   return _geocoder_mapquest_nominatim_geometry($data);
 }
 
@@ -43,7 +58,8 @@
   }
   if ($field['type'] == 'addressfield') {
     $address = geocoder_widget_parse_addressfield($field_item);
-    return geocoder_mapquest_nominatim($address);
+    $components = geocoder_mapquest_nominatim_parse_addressfield($field_item);
+    return geocoder_mapquest_nominatim($address, array(), $components);
   }
   if ($field['type'] == 'location') {
     $address = geocoder_widget_parse_locationfield($field_item);
@@ -62,3 +78,18 @@
   geophp_load();
   return new Point($data[0]->lon, $data[0]->lat);
 }
+
+function geocoder_mapquest_nominatim_parse_addressfield($field_item) {
+  $components = array();
+
+  // Params order matters. The more precise params first.
+  // See geocoder_mapquest_nominatim().
+  if (!empty($field_item['thoroughfare']))            $components['street'] = $field_item['thoroughfare'];
+  if (!empty($field_item['postal_code']))             $components['postalcode'] = $field_item['postal_code'];
+  if (!empty($field_item['locality']))                $components['city'] = $field_item['locality'];
+  if (!empty($field_item['sub_administrative_area'])) $components['county'] = $field_item['sub_administrative_area'];
+  if (!empty($field_item['administrative_area']))     $components['state'] = $field_item['administrative_area'];
+  if (!empty($field_item['country']))                 $components['country'] = $field_item['country'];
+
+  return $components;
+}
