mirror of
https://github.com/osm-search/Nominatim.git
synced 2024-11-30 22:09:31 +03:00
25baaf530d
Introduces new AddressDetails class which is responsible for address lookups. Saves always the complete result and then allows filtering throught the different access function. Remove special handling in Geocode() and use there the lookup throught PlaceLookup() as well.
118 lines
3.4 KiB
PHP
118 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace Nominatim;
|
|
|
|
require_once(CONST_BasePath.'/lib/ClassTypes.php');
|
|
|
|
/**
|
|
* Detailed list of address parts for a single result
|
|
*/
|
|
class AddressDetails
|
|
{
|
|
private $aAddressLines;
|
|
|
|
public function __construct(&$oDB, $iPlaceID, $sHousenumber, $mLangPref)
|
|
{
|
|
if (is_array($mLangPref)) {
|
|
$mLangPref = 'ARRAY['.join(',', array_map('getDBQuoted', $mLangPref)).']';
|
|
}
|
|
|
|
if (!$sHousenumber) {
|
|
$sHousenumber = -1;
|
|
}
|
|
|
|
$sSQL = 'SELECT *,';
|
|
$sSQL .= ' get_name_by_language(name,'.$mLangPref.') as localname';
|
|
$sSQL .= ' FROM get_addressdata('.$iPlaceID.','.$sHousenumber.')';
|
|
$sSQL .= ' ORDER BY rank_address desc,isaddress DESC';
|
|
|
|
$this->aAddressLines = chksql($oDB->getAll($sSQL));
|
|
}
|
|
|
|
private static function isAddress($aLine)
|
|
{
|
|
return $aLine['isaddress'] == 't' || $aLine['type'] == 'country_code';
|
|
}
|
|
|
|
public function getAddressDetails($bAll = false)
|
|
{
|
|
if ($bAll) {
|
|
return $this->aAddressLines;
|
|
}
|
|
|
|
return array_filter($this->aAddressLines, 'AddressDetails::isAddress');
|
|
}
|
|
|
|
public function getLocaleAddress()
|
|
{
|
|
$aParts = array();
|
|
$sPrevResult = '';
|
|
|
|
foreach ($this->aAddressLines as $aLine) {
|
|
if ($aLine['isaddress'] == 't' && $sPrevResult != $aLine['localname']) {
|
|
$sPrevResult = $aLine['localname'];
|
|
$aParts[] = $sPrevResult;
|
|
}
|
|
}
|
|
|
|
return join(', ', $aParts);
|
|
}
|
|
|
|
public function getAddressNames()
|
|
{
|
|
$aAddress = array();
|
|
$aFallback = array();
|
|
|
|
foreach ($this->aAddressLines as $aLine) {
|
|
if (!self::isAddress($aLine)) {
|
|
continue;
|
|
}
|
|
|
|
$bFallback = false;
|
|
$aTypeLabel = ClassTypes\getInfo($aLine);
|
|
|
|
if ($aTypeLabel === false) {
|
|
$aTypeLabel = ClassTypes\getFallbackInfo($aLine);
|
|
$bFallback = true;
|
|
}
|
|
|
|
$sName = false;
|
|
if (isset($aLine['localname']) && $aLine['localname']) {
|
|
$sName = $aLine['localname'];
|
|
} elseif (isset($aLine['housenumber']) && $aLine['housenumber']) {
|
|
$sName = $aLine['housenumber'];
|
|
}
|
|
|
|
if ($sName) {
|
|
$sTypeLabel = strtolower(isset($aTypeLabel['simplelabel']) ? $aTypeLabel['simplelabel'] : $aTypeLabel['label']);
|
|
$sTypeLabel = str_replace(' ', '_', $sTypeLabel);
|
|
if (!isset($aAddress[$sTypeLabel])
|
|
|| isset($aFallback[$sTypeLabel])
|
|
|| $aLine['class'] == 'place'
|
|
) {
|
|
$aAddress[$sTypeLabel] = $sName;
|
|
if ($bFallback) {
|
|
$aFallback[$sTypeLabel] = $bFallback;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return $aAddress;
|
|
}
|
|
|
|
public function getAdminLevels()
|
|
{
|
|
$aAddress = array();
|
|
foreach ($this->aAddressLines as $aLine) {
|
|
if (self::isAddress($aLine)
|
|
&& isset($aLine['admin_level'])
|
|
&& $aLine['admin_level'] < 15
|
|
&& !isset($aAddress['level'.$aLine['admin_level']])
|
|
) {
|
|
$aAddress['level'.$aLine['admin_level']] = $aLine['localname'];
|
|
}
|
|
}
|
|
return $aAddress;
|
|
}
|
|
}
|