2018-07-11 00:38:27 +03:00
|
|
|
<?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)) {
|
2019-07-28 23:05:51 +03:00
|
|
|
$mLangPref = $oDB->getArraySQL($oDB->getDBQuotedList($mLangPref));
|
2018-07-11 00:38:27 +03:00
|
|
|
}
|
|
|
|
|
2019-03-03 22:44:22 +03:00
|
|
|
if (!isset($sHousenumber)) {
|
2018-07-11 00:38:27 +03:00
|
|
|
$sHousenumber = -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
$sSQL = 'SELECT *,';
|
2018-09-20 03:16:01 +03:00
|
|
|
$sSQL .= ' get_name_by_language(name,'.$mLangPref.') as localname';
|
2018-07-11 00:38:27 +03:00
|
|
|
$sSQL .= ' FROM get_addressdata('.$iPlaceID.','.$sHousenumber.')';
|
2018-09-20 03:16:01 +03:00
|
|
|
$sSQL .= ' ORDER BY rank_address DESC, isaddress DESC';
|
2018-07-11 00:38:27 +03:00
|
|
|
|
2019-03-10 17:42:58 +03:00
|
|
|
$this->aAddressLines = $oDB->getAll($sSQL);
|
2018-07-11 00:38:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
private static function isAddress($aLine)
|
|
|
|
{
|
2019-04-02 17:52:37 +03:00
|
|
|
return $aLine['isaddress'] || $aLine['type'] == 'country_code';
|
2018-07-11 00:38:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
public function getAddressDetails($bAll = false)
|
|
|
|
{
|
|
|
|
if ($bAll) {
|
|
|
|
return $this->aAddressLines;
|
|
|
|
}
|
|
|
|
|
2018-09-20 03:16:01 +03:00
|
|
|
return array_filter($this->aAddressLines, array(__CLASS__, 'isAddress'));
|
2018-07-11 00:38:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
public function getLocaleAddress()
|
|
|
|
{
|
|
|
|
$aParts = array();
|
|
|
|
$sPrevResult = '';
|
|
|
|
|
|
|
|
foreach ($this->aAddressLines as $aLine) {
|
2019-04-02 17:52:37 +03:00
|
|
|
if ($aLine['isaddress'] && $sPrevResult != $aLine['localname']) {
|
2018-07-11 00:38:27 +03:00
|
|
|
$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;
|
|
|
|
}
|
|
|
|
|
2019-10-30 20:49:02 +03:00
|
|
|
$sName = null;
|
|
|
|
if (isset($aLine['localname']) && $aLine['localname']!=='') {
|
2018-07-11 00:38:27 +03:00
|
|
|
$sName = $aLine['localname'];
|
2019-10-30 20:49:02 +03:00
|
|
|
} elseif (isset($aLine['housenumber']) && $aLine['housenumber']!=='') {
|
2018-07-11 00:38:27 +03:00
|
|
|
$sName = $aLine['housenumber'];
|
|
|
|
}
|
|
|
|
|
2019-10-30 20:49:02 +03:00
|
|
|
if (isset($sName)) {
|
2018-07-11 00:38:27 +03:00
|
|
|
$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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-10-30 20:49:02 +03:00
|
|
|
|
2018-07-11 00:38:27 +03:00
|
|
|
return $aAddress;
|
|
|
|
}
|
|
|
|
|
2020-04-01 11:27:17 +03:00
|
|
|
public function addGeocodeJsonAddressParts(&$aJson)
|
|
|
|
{
|
|
|
|
$aFieldMappings = array(
|
|
|
|
'house_number' => 'housenumber',
|
|
|
|
'road' => 'street',
|
|
|
|
'locality' => 'locality',
|
|
|
|
'postcode' => 'postcode',
|
|
|
|
'city' => 'city',
|
|
|
|
'district' => 'district',
|
|
|
|
'county' => 'county',
|
|
|
|
'state' => 'state',
|
|
|
|
'country' => 'country'
|
|
|
|
);
|
|
|
|
|
|
|
|
$aAddrNames = $this->getAddressNames();
|
|
|
|
foreach ($aFieldMappings as $sFrom => $sTo) {
|
|
|
|
if (isset($aAddrNames[$sFrom])) {
|
|
|
|
$aJson[$sTo] = $aAddrNames[$sFrom];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-11 00:38:27 +03:00
|
|
|
public function getAdminLevels()
|
|
|
|
{
|
|
|
|
$aAddress = array();
|
2018-12-06 23:18:47 +03:00
|
|
|
foreach (array_reverse($this->aAddressLines) as $aLine) {
|
2018-07-11 00:38:27 +03:00
|
|
|
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;
|
|
|
|
}
|
2018-08-02 01:06:02 +03:00
|
|
|
|
|
|
|
public function debugInfo()
|
|
|
|
{
|
|
|
|
return $this->aAddressLines;
|
|
|
|
}
|
2018-07-11 00:38:27 +03:00
|
|
|
}
|