667,13 → 667,20 |
* @param out lonlat: un tableau associatif contenant 'lon' et 'lat' si elles ont été déterminées |
* @param in opts: un tableau associatif optionnel écrasant ou ajoutant des valeurs d'API |
* @return boolean: selon que la fonction à réussi ou non |
* |
* opts['force-q']: force l'utilisation d'une requête en texte libre |
* quelque soit le remplissage des composants individuels |
* |
* Note: le code postal est contre-productif pour Nominatim: |
* https://lists.openstreetmap.org/pipermail/talk-fr/2013-April/057084.html |
*/ |
static function coordGuess(Array $data, Array &$lonlat, Array $opts = NULL) { |
if(!$data) return FALSE; |
$common_query = array('accept_language' => 'fr', 'format' => 'json', 'limit' => 1); |
if(! $data['adresse'] || (! $data['cp'] && ! $data['ville'])) { |
if(! $data['adresse'] || (! $data['cp'] && ! $data['ville']) || @$opts['force-q']) { |
unset($opts['force-q']); |
$query = array_merge($common_query, |
array('q' => implode(', ', $data)), |
array('q' => implode(', ', array_filter($data))), |
$opts ? $opts : array()); |
} |
else { |
699,6 → 706,7 |
* Retourne un tableau prêt à être utilisé par coordGuess(), c'est à dire initialisant toutes |
* les clefs nécessaires (même si NULL) et disposant systématiquement d'un pays. |
* Cela à partir d'un tableau au format de clefs prédéterminé. |
* S'occupe du filtrage basique des éléments pour maximiser les chances de détection. |
* |
* @param data: un tableau associatif contenant les clefs telles que nommées à l'issue du |
* du formulaire de saisie: 'cs_adresse_01', 'cs_code_postal', 'cs_ville' |
723,15 → 731,23 |
// pas de précision au n°, mais Nominatim peine avec des préfixes trop élaborés |
// coupons jusqu'à un élément reconnaissable s'il existe |
$adresse = @trim($in['cs_adresse_01']); |
$adresse = substr($adresse, stripos($adresse, "ville de ")); |
$adresse = substr($adresse, stripos($adresse, "impasse")); |
$adresse = substr($adresse, stripos($adresse, "chemin")); |
$adresse = substr($adresse, stripos($adresse, "route")); |
$adresse = substr($adresse, stripos($adresse, "rue")); |
$adresse = substr($adresse, stripos($adresse, "avenue")); |
$adresse = substr($adresse, stripos($adresse, "boulevard")); |
$adresse = substr($adresse, stripos($adresse, "place")); |
$adresse = substr($adresse, stripos($adresse, "promenade")); |
$adresse = substr($adresse, stripos($adresse, "allée")); |
$adresse = preg_replace("/[\r\n].*/", "", $adresse); |
|
$ville = preg_replace('/cedex.*/i', '', @trim($in['cs_ville'])); |
return array( |
'adresse' => $adresse, |
'cp' => @trim($in['cs_code_postal']) ? $in['cs_code_postal'] : '', |
'ville' => @trim($in['cs_ville']) ? $in['cs_ville'] : '', |
'ville' => $ville, |
'pays' => $pays !== FALSE ? $pays : 'France' |
); |
} |