From 5a10ab142a636a7ffbd4bed1dc095657bff77890 Mon Sep 17 00:00:00 2001 From: =?utf8?q?St=C3=A9phane=20Jacob?= Date: Sat, 21 Feb 2009 17:03:38 +0100 Subject: [PATCH] Adds a postal formated address to the addresses data. --- htdocs/javascript/profile.js | 1 + include/geocoding.inc.php | 54 ++++++++++++++++++++++++++++++++++++--- modules/profile/addresses.inc.php | 2 +- templates/geoloc/form.address.tpl | 1 + 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/htdocs/javascript/profile.js b/htdocs/javascript/profile.js index 19589e4..efcfe07 100644 --- a/htdocs/javascript/profile.js +++ b/htdocs/javascript/profile.js @@ -343,6 +343,7 @@ function validGeoloc(id, geoloc) { if (geoloc == 1) { $('#addresses_' + id + '_cont').find('[name*=text]').val($('#addresses_' + id + '_cont').find('[name*=geoloc]').val()); + $('#addresses_' + id + '_cont').find('[name*=postalText]').val($('#addresses_' + id + '_cont').find('[name*=geocodedPostalText]').val()); } $('#addresses_' + id + '_cont').find('[name*=text]').removeClass('error'); $('#addresses_' + id + '_cont').find('[name*=geoloc_choice]').val(geoloc); diff --git a/include/geocoding.inc.php b/include/geocoding.inc.php index c888a85..8052070 100644 --- a/include/geocoding.inc.php +++ b/include/geocoding.inc.php @@ -121,8 +121,8 @@ class GMapsGeocoder extends Geocoder { } public function stripGeocodingFromAddress(array $address) { - unset($address['geoloc'], $address['geoloc_choice'], $address['countryId'], - $address['country'], $address['administrativeAreaName'], + unset($address['geoloc'], $address['geoloc_choice'], $address['geocodedPostalText'], + $address['countryId'], $address['country'], $address['administrativeAreaName'], $address['subAdministrativeAreaName'], $address['localityName'], $address['thoroughfareName'], $address['postalCode']); $address['accuracy'] = 0; @@ -163,7 +163,7 @@ class GMapsGeocoder extends Geocoder { // Prepares address to be geocoded private function prepareAddress($address) { $address['text'] = preg_replace('/\s*\n\s*/m', "\n", trim($address['text'])); - // TODO: $address['postalAddress'] = getPostalAddress($address['text']); + $address['postalText'] = $this->getPostalAddress($address['text']); $address['updateTime'] = time(); unset($address['changed']); return $address; @@ -316,6 +316,7 @@ class GMapsGeocoder extends Geocoder { if ($extraLines) { $address['geoloc'] = $extraLines . "\n" . $address['geoloc']; } + $address['geocodedPostalText'] = $this->getPostalAddress($address['geoloc']); $geoloc = strtoupper(preg_replace(array("/[0-9,\"'#~:;_\- ]/", "/\r\n/"), array("", "\n"), $address['geoloc'])); $text = strtoupper(preg_replace(array("/[0-9,\"'#~:;_\- ]/", "/\r\n/"), @@ -338,10 +339,55 @@ class GMapsGeocoder extends Geocoder { } if ($same) { $address['text'] = $address['geoloc']; - unset($address['geoloc']); + $address['postalText'] = $address['geocodedPostalText']; + unset($address['geoloc'], $address['geocodedPostalText']); } } + // Returns the address formated for postal use. + // The main rules are (cf AFNOR XPZ 10-011): + // -everything in upper case; + // -if there are more then than 38 characters in a lign, split it; + // -if there are more then than 32 characters in the description of the "street", use abbreviations. + private function getPostalAddress($text) { + static $abbreviations = array( + "IMPASSE" => "IMP", + "RUE" => "R", + "AVENUE" => "AV", + "BOULEVARD" => "BVD", + "ROUTE" => "R", + "STREET" => "ST", + "ROAD" => "RD", + ); + + $text = strtoupper($text); + $arrayText = explode("\n", $text); + $postalText = ""; + + foreach ($arrayText as $i => $lign) { + $postalText .= (($i == 0) ? "" : "\n"); + if (($length = strlen($lign)) > 32) { + $words = explode(" ", $lign); + $count = 0; + foreach ($words as $word) { + if (isset($abbreviations[$word])) { + $word = $abbreviations[$word]; + } + if ($count + ($wordLength = strlen($word)) <= 38) { + $postalText .= (($count == 0) ? "" : " ") . $word; + $count += (($count == 0) ? 0 : 1) + $wordLength; + } else { + $postalText .= "\n" . $word; + $count = strlen($word); + } + } + } else { + $postalText .= $lign; + } + } + return $postalText; + } + // Search for the lign from the given address that is the closest to the geocoded thoroughfareName // and replaces the corresponding lign in the geocoded text by it. static protected function fixStreetNumber(&$address) diff --git a/modules/profile/addresses.inc.php b/modules/profile/addresses.inc.php index 5388595..d073956 100644 --- a/modules/profile/addresses.inc.php +++ b/modules/profile/addresses.inc.php @@ -126,7 +126,7 @@ class ProfileAddress extends ProfileGeocoding VALUES ({?}, 'home', {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, FROM_UNIXTIME({?}), {?}, {?}, {?}, {?}, {?}, {?})", S::i('uid'), $addrid, $flags, $address['accuracy'], - $address['text'], 'postalText'/*$address['postalText']*/, $address['postalCode'], $address['localityId'], + $address['text'], $address['postalText'], $address['postalCode'], $address['localityId'], $address['subAdministrativeAreaId'], $address['administrativeAreaId'], $address['countryId'], $address['latitude'], $address['longitude'], $address['updateTime'], $address['pub'], $address['comment'], diff --git a/templates/geoloc/form.address.tpl b/templates/geoloc/form.address.tpl index 0f5cc34..cf589af 100644 --- a/templates/geoloc/form.address.tpl +++ b/templates/geoloc/form.address.tpl @@ -43,6 +43,7 @@ {if $address.geoloc} + {/if} -- 2.1.4