return join(', ', $aParts);
}
- public function getAddressNames($sCountry = null)
+ public function getAddressNames()
{
$aAddress = array();
$sName = $aLine['housenumber'];
}
- if (isset($sName)) {
- if (!isset($aAddress[$sTypeLabel])
- || $aLine['class'] == 'place'
- ) {
- $aAddress[$sTypeLabel] = $sName;
- }
+ if (isset($sName)
+ && (!isset($aAddress[$sTypeLabel])
+ || $aLine['class'] == 'place')
+ ) {
+ $aAddress[$sTypeLabel] = $sName;
}
}
$conn->exec("SET DateStyle TO 'sql,european'");
$conn->exec("SET client_encoding TO 'utf-8'");
$iMaxExecution = ini_get('max_execution_time');
- if ($iMaxExecution > 0) $conn->setAttribute(\PDO::ATTR_TIMEOUT, $iMaxExecution); // seconds
+ if ($iMaxExecution > 0) {
+ $conn->setAttribute(\PDO::ATTR_TIMEOUT, $iMaxExecution); // seconds
+ }
$this->connection = $conn;
return true;
try {
$stmt = $this->getQueryStatement($sSQL, $aInputVars, $sErrMessage);
$row = $stmt->fetch(\PDO::FETCH_NUM);
- if ($row === false) return false;
+ if ($row === false) {
+ return false;
+ }
} catch (\PDOException $e) {
throw new \Nominatim\DatabaseError($sErrMessage, 500, null, $e, $sSQL);
}
if (preg_match('/^pgsql:(.+)$/', $sDSN, $aMatches)) {
foreach (explode(';', $aMatches[1]) as $sKeyVal) {
list($sKey, $sVal) = explode('=', $sKeyVal, 2);
- if ($sKey == 'host') $sKey = 'hostspec';
- if ($sKey == 'dbname') $sKey = 'database';
- if ($sKey == 'user') $sKey = 'username';
+ if ($sKey == 'host') {
+ $sKey = 'hostspec';
+ } elseif ($sKey == 'dbname') {
+ $sKey = 'database';
+ } elseif ($sKey == 'user') {
+ $sKey = 'username';
+ }
$aInfo[$sKey] = $sVal;
}
}
class DatabaseError extends \Exception
{
- public function __construct($message, $code = 500, Exception $previous = null, $oPDOErr, $sSql = null)
+ public function __construct($message, $code, $previous, $oPDOErr, $sSql = null)
{
parent::__construct($message, $code, $previous);
// https://secure.php.net/manual/en/class.pdoexception.php
echo '<th>Address Tokens</th><th>Address Not</th>';
echo '<th>country</th><th>operator</th>';
echo '<th>class</th><th>type</th><th>postcode</th><th>housenumber</th></tr>';
- foreach ($aSearches as $iRank => $aRankedSet) {
+ foreach ($aSearches as $aRankedSet) {
foreach ($aRankedSet as $aRow) {
$aRow->dumpAsHtmlTableRow($aWordsIDs);
}
$aParams['exclude_place_ids'] = implode(',', $this->aExcludePlaceIDs);
}
- if ($this->bBoundedSearch) $aParams['bounded'] = '1';
+ if ($this->bBoundedSearch) {
+ $aParams['bounded'] = '1';
+ }
if ($this->aCountryCodes) {
$aParams['countrycodes'] = implode(',', $this->aCountryCodes);
public function setLimit($iLimit = 10)
{
- if ($iLimit > 50) $iLimit = 50;
- if ($iLimit < 1) $iLimit = 1;
+ if ($iLimit > 50) {
+ $iLimit = 50;
+ } elseif ($iLimit < 1) {
+ $iLimit = 1;
+ }
$this->iFinalLimit = $iLimit;
$this->iLimit = $iLimit + min($iLimit, 10);
if ($sExcluded) {
foreach ($sExcluded as $iExcludedPlaceID) {
$iExcludedPlaceID = (int)$iExcludedPlaceID;
- if ($iExcludedPlaceID)
+ if ($iExcludedPlaceID) {
$aExcludePlaceIDs[$iExcludedPlaceID] = $iExcludedPlaceID;
+ }
}
- if (isset($aExcludePlaceIDs))
+ if (isset($aExcludePlaceIDs)) {
$this->aExcludePlaceIDs = $aExcludePlaceIDs;
+ }
}
// Only certain ranks of feature
$sFeatureType = $oParams->getString('featureType');
- if (!$sFeatureType) $sFeatureType = $oParams->getString('featuretype');
- if ($sFeatureType) $this->setFeatureType($sFeatureType);
+ if (!$sFeatureType) {
+ $sFeatureType = $oParams->getString('featuretype');
+ }
+ if ($sFeatureType) {
+ $this->setFeatureType($sFeatureType);
+ }
// Country code list
$sCountries = $oParams->getStringList('countrycodes');
$aCountries[] = strtolower($sCountryCode);
}
}
- if (isset($aCountries))
+ if (isset($aCountries)) {
$this->aCountryCodes = $aCountries;
+ }
}
$aViewbox = $oParams->getStringList('viewboxlbrt');
public function loadStructuredAddressElement($sValue, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank, $aItemListValues)
{
$sValue = trim($sValue);
- if (!$sValue) return false;
+ if (!$sValue) {
+ return false;
+ }
$this->aStructuredQuery[$sKey] = $sValue;
if ($this->iMinAddressRank == 0 && $this->iMaxAddressRank == 30) {
$this->iMinAddressRank = $iNewMinAddressRank;
$this->iMaxAddressRank = $iNewMaxAddressRank;
}
- if ($aItemListValues) $this->aAddressRankList = array_merge($this->aAddressRankList, $aItemListValues);
+ if ($aItemListValues) {
+ $this->aAddressRankList = array_merge($this->aAddressRankList, $aItemListValues);
+ }
return true;
}
public function fallbackStructuredQuery()
{
- if (!$this->aStructuredQuery) return false;
-
$aParams = $this->aStructuredQuery;
- if (count($aParams) == 1) return false;
+ if (!$aParams || count($aParams) == 1) {
+ return false;
+ }
$aOrderToFallback = array('postalcode', 'street', 'city', 'county', 'state');
// Add all words from this wordset
foreach ($aWordset as $iToken => $sToken) {
- //echo "<br><b>$sToken</b>";
$aNewWordsetSearches = array();
foreach ($aWordsetSearches as $oCurrentSearch) {
- //echo "<i>";
- //var_dump($oCurrentSearch);
- //echo "</i>";
-
// Tokens with full name matches.
foreach ($oValidTokens->get(' '.$sToken) as $oSearchTerm) {
$aNewSearches = $oCurrentSearch->extendWithFullTerm(
usort($aNewWordsetSearches, array('Nominatim\SearchDescription', 'bySearchRank'));
$aWordsetSearches = array_slice($aNewWordsetSearches, 0, 50);
}
- //var_Dump('<hr>',count($aWordsetSearches)); exit;
$aNewPhraseSearches = array_merge($aNewPhraseSearches, $aNewWordsetSearches);
usort($aNewPhraseSearches, array('Nominatim\SearchDescription', 'bySearchRank'));
$aSearchHash = array();
foreach ($aNewPhraseSearches as $iSearch => $aSearch) {
$sHash = serialize($aSearch);
- if (isset($aSearchHash[$sHash])) unset($aNewPhraseSearches[$iSearch]);
- else $aSearchHash[$sHash] = 1;
+ if (isset($aSearchHash[$sHash])) {
+ unset($aNewPhraseSearches[$iSearch]);
+ } else {
+ $aSearchHash[$sHash] = 1;
+ }
}
$aNewPhraseSearches = array_slice($aNewPhraseSearches, 0, 50);
$iSearchCount = 0;
$aSearches = array();
- foreach ($aGroupedSearches as $iScore => $aNewSearches) {
+ foreach ($aGroupedSearches as $aNewSearches) {
$iSearchCount += count($aNewSearches);
$aSearches = array_merge($aSearches, $aNewSearches);
- if ($iSearchCount > 50) break;
+ if ($iSearchCount > 50) {
+ break;
+ }
}
}
public function lookup()
{
Debug::newFunction('Geocode::lookup');
- if (!$this->sQuery && !$this->aStructuredQuery) return array();
+ if (!$this->sQuery && !$this->aStructuredQuery) {
+ return array();
+ }
Debug::printDebugArray('Geocode', $this);
Debug::newSection('Query Preprocessing');
- $sLanguagePrefArraySQL = $this->oDB->getArraySQL(
- $this->oDB->getDBQuotedList($this->aLangPrefOrder)
- );
-
$sQuery = $this->sQuery;
if (!preg_match('//u', $sQuery)) {
userError('Query string is not UTF-8 encoded.');
$aGroupedSearches = array();
foreach ($aSearches as $aSearch) {
if ($aSearch->getRank() < $this->iMaxRank) {
- if (!isset($aGroupedSearches[$aSearch->getRank()])) $aGroupedSearches[$aSearch->getRank()] = array();
+ if (!isset($aGroupedSearches[$aSearch->getRank()])) {
+ $aGroupedSearches[$aSearch->getRank()] = array();
+ }
$aGroupedSearches[$aSearch->getRank()][] = $aSearch;
}
}
$sHash = serialize($aSearch);
if (isset($aSearchHash[$sHash])) {
unset($aGroupedSearches[$iGroup][$iSearch]);
- if (empty($aGroupedSearches[$iGroup])) unset($aGroupedSearches[$iGroup]);
+ if (empty($aGroupedSearches[$iGroup])) {
+ unset($aGroupedSearches[$iGroup]);
+ }
} else {
$aSearchHash[$sHash] = 1;
}
}
}
- if ($iQueryLoop > 20) break;
+ if ($iQueryLoop > 20) {
+ break;
+ }
}
if (!empty($aResults)) {
$aResults = $tempIDs;
}
- if (!empty($aResults)) break;
- if ($iGroupLoop > 4) break;
- if ($iQueryLoop > 30) break;
+ if (!empty($aResults) || $iGroupLoop > 4 || $iQueryLoop > 30) {
+ break;
+ }
}
} else {
// Just interpret as a reverse geocode
// No results? Done
if (empty($aResults)) {
- if ($this->bFallback) {
- if ($this->fallbackStructuredQuery()) {
- return $this->lookup();
- }
+ if ($this->bFallback && $this->fallbackStructuredQuery()) {
+ return $this->lookup();
}
return array();
$aRecheckWords = preg_split('/\b[\s,\\-]*/u', $sQuery);
foreach ($aRecheckWords as $i => $sWord) {
- if (!preg_match('/[\pL\pN]/', $sWord)) unset($aRecheckWords[$i]);
+ if (!preg_match('/[\pL\pN]/', $sWord)) {
+ unset($aRecheckWords[$i]);
+ }
}
Debug::printVar('Recheck words', $aRecheckWords);
foreach ($aRecheckWords as $i => $sWord) {
if (stripos($sAddress, $sWord)!==false) {
$iCountWords++;
- if (preg_match('/(^|,)\s*'.preg_quote($sWord, '/').'\s*(,|$)/', $sAddress)) $iCountWords += 0.1;
+ if (preg_match('/(^|,)\s*'.preg_quote($sWord, '/').'\s*(,|$)/', $sAddress)) {
+ $iCountWords += 0.1;
+ }
}
}
$aToFilter = $aSearchResults;
$aSearchResults = array();
- $bFirst = true;
foreach ($aToFilter as $aResult) {
$this->aExcludePlaceIDs[$aResult['place_id']] = $aResult['place_id'];
- if ($bFirst) {
- $fLat = $aResult['lat'];
- $fLon = $aResult['lon'];
- if (isset($aResult['zoom'])) $iZoom = $aResult['zoom'];
- $bFirst = false;
- }
if (!$this->oPlaceLookup->doDeDupe() || (!isset($aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']])
&& !isset($aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name'].$aResult['admin_level']]))
) {
}
// Absolute limit on number of results
- if (count($aSearchResults) >= $this->iFinalLimit) break;
+ if (count($aSearchResults) >= $this->iFinalLimit) {
+ break;
+ }
}
Debug::printVar('Post-filter results', $aSearchResults);
$aLanguages = array();
$sLangString = $this->getString('accept-language', $sFallback);
- if ($sLangString) {
- if (preg_match_all('/(([a-z]{1,8})([-_][a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $sLangString, $aLanguagesParse, PREG_SET_ORDER)) {
- foreach ($aLanguagesParse as $iLang => $aLanguage) {
- $aLanguages[$aLanguage[1]] = isset($aLanguage[5])?(float)$aLanguage[5]:1 - ($iLang/100);
- if (!isset($aLanguages[$aLanguage[2]])) $aLanguages[$aLanguage[2]] = $aLanguages[$aLanguage[1]]/10;
+ if ($sLangString
+ && preg_match_all('/(([a-z]{1,8})([-_][a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $sLangString, $aLanguagesParse, PREG_SET_ORDER)
+ ) {
+ foreach ($aLanguagesParse as $iLang => $aLanguage) {
+ $aLanguages[$aLanguage[1]] = isset($aLanguage[5])?(float)$aLanguage[5]:1 - ($iLang/100);
+ if (!isset($aLanguages[$aLanguage[2]])) {
+ $aLanguages[$aLanguage[2]] = $aLanguages[$aLanguage[1]]/10;
}
- arsort($aLanguages);
}
+ arsort($aLanguages);
}
if (empty($aLanguages) && CONST_Default_Language) {
$aLanguages[CONST_Default_Language] = 1;
{
$aParams = array();
- if ($this->bAddressDetails) $aParams['addressdetails'] = '1';
- if ($this->bExtraTags) $aParams['extratags'] = '1';
- if ($this->bNameDetails) $aParams['namedetails'] = '1';
+ if ($this->bAddressDetails) {
+ $aParams['addressdetails'] = '1';
+ }
+ if ($this->bExtraTags) {
+ $aParams['extratags'] = '1';
+ }
+ if ($this->bNameDetails) {
+ $aParams['namedetails'] = '1';
+ }
- if ($this->bIncludePolygonAsText) $aParams['polygon_text'] = '1';
- if ($this->bIncludePolygonAsGeoJSON) $aParams['polygon_geojson'] = '1';
- if ($this->bIncludePolygonAsKML) $aParams['polygon_kml'] = '1';
- if ($this->bIncludePolygonAsSVG) $aParams['polygon_svg'] = '1';
+ if ($this->bIncludePolygonAsText) {
+ $aParams['polygon_text'] = '1';
+ }
+ if ($this->bIncludePolygonAsGeoJSON) {
+ $aParams['polygon_geojson'] = '1';
+ }
+ if ($this->bIncludePolygonAsKML) {
+ $aParams['polygon_kml'] = '1';
+ }
+ if ($this->bIncludePolygonAsSVG) {
+ $aParams['polygon_svg'] = '1';
+ }
if ($this->fPolygonSimplificationThreshold > 0.0) {
$aParams['polygon_threshold'] = $this->fPolygonSimplificationThreshold;
}
- if (!$this->bDeDupe) $aParams['dedupe'] = '0';
+ if (!$this->bDeDupe) {
+ $aParams['dedupe'] = '0';
+ }
return $aParams;
}
private function langAddressSql($sHousenumber)
{
- if ($this->bAddressDetails)
+ if ($this->bAddressDetails) {
return ''; // langaddress will be computed from address details
+ }
return 'get_address_by_language(place_id,'.$sHousenumber.','.$this->aLangPrefOrderSql.') AS langaddress,';
}
$sSQL .= ' housenumber,';
$sSQL .= ' country_code, ';
$sSQL .= ' importance, ';
- if (!$this->bDeDupe) $sSQL .= 'place_id,';
- if (!$this->bAddressDetails) $sSQL .= 'langaddress, ';
+ if (!$this->bDeDupe) {
+ $sSQL .= 'place_id,';
+ }
+ if (!$this->bAddressDetails) {
+ $sSQL .= 'langaddress, ';
+ }
$sSQL .= ' placename, ';
$sSQL .= ' ref, ';
- if ($this->bExtraTags) $sSQL .= 'extratags, ';
- if ($this->bNameDetails) $sSQL .= 'name, ';
+ if ($this->bExtraTags) {
+ $sSQL .= 'extratags, ';
+ }
+ if ($this->bNameDetails) {
+ $sSQL .= 'name, ';
+ }
$sSQL .= ' extra_place ';
$aSubSelects[] = $sSQL;
$sSQL .= $this->langAddressSql('-1');
$sSQL .= ' postcode as placename,';
$sSQL .= ' postcode as ref,';
- if ($this->bExtraTags) $sSQL .= 'null::text AS extra,';
- if ($this->bNameDetails) $sSQL .= 'null::text AS names,';
+ if ($this->bExtraTags) {
+ $sSQL .= 'null::text AS extra,';
+ }
+ if ($this->bNameDetails) {
+ $sSQL .= 'null::text AS names,';
+ }
$sSQL .= ' ST_x(geometry) AS lon, ST_y(geometry) AS lat,';
$sSQL .= ' (0.75-(rank_search::float/40)) AS importance, ';
$sSQL .= $this->addressImportanceSql('geometry', 'lp.parent_place_id');
$sSQL .= $this->langAddressSql('housenumber_for_place');
$sSQL .= ' null::text AS placename, ';
$sSQL .= ' null::text AS ref, ';
- if ($this->bExtraTags) $sSQL .= 'null::text AS extra,';
- if ($this->bNameDetails) $sSQL .= 'null::text AS names,';
+ if ($this->bExtraTags) {
+ $sSQL .= 'null::text AS extra,';
+ }
+ if ($this->bNameDetails) {
+ $sSQL .= 'null::text AS names,';
+ }
$sSQL .= ' st_x(centroid) AS lon, ';
$sSQL .= ' st_y(centroid) AS lat,';
$sSQL .= ' -1.15 AS importance, ';
$sSQL .= $this->langAddressSql('housenumber_for_place');
$sSQL .= ' null::text AS placename, ';
$sSQL .= ' null::text AS ref, ';
- if ($this->bExtraTags) $sSQL .= 'null::text AS extra, ';
- if ($this->bNameDetails) $sSQL .= 'null::text AS names, ';
+ if ($this->bExtraTags) {
+ $sSQL .= 'null::text AS extra, ';
+ }
+ if ($this->bNameDetails) {
+ $sSQL .= 'null::text AS names, ';
+ }
$sSQL .= ' st_x(centroid) AS lon, ';
$sSQL .= ' st_y(centroid) AS lat, ';
// slightly smaller than the importance for normal houses
{
$aOutlineResult = array();
- if (!$iPlaceID) return $aOutlineResult;
+ if (!$iPlaceID) {
+ return $aOutlineResult;
+ }
// Get the bounding box and outline polygon
$sSQL = 'select place_id,0 as numfeatures,st_area(geometry) as area,';
}
$sSQL .= ' ST_YMin(geometry) as minlat,ST_YMax(geometry) as maxlat,';
$sSQL .= ' ST_XMin(geometry) as minlon,ST_XMax(geometry) as maxlon';
- if ($this->bIncludePolygonAsGeoJSON) $sSQL .= ',ST_AsGeoJSON(geometry) as asgeojson';
- if ($this->bIncludePolygonAsKML) $sSQL .= ',ST_AsKML(geometry) as askml';
- if ($this->bIncludePolygonAsSVG) $sSQL .= ',ST_AsSVG(geometry) as assvg';
- if ($this->bIncludePolygonAsText) $sSQL .= ',ST_AsText(geometry) as astext';
+ if ($this->bIncludePolygonAsGeoJSON) {
+ $sSQL .= ',ST_AsGeoJSON(geometry) as asgeojson';
+ }
+ if ($this->bIncludePolygonAsKML) {
+ $sSQL .= ',ST_AsKML(geometry) as askml';
+ }
+ if ($this->bIncludePolygonAsSVG) {
+ $sSQL .= ',ST_AsSVG(geometry) as assvg';
+ }
+ if ($this->bIncludePolygonAsText) {
+ $sSQL .= ',ST_AsText(geometry) as astext';
+ }
if ($fLonReverse != null && $fLatReverse != null) {
$sFrom = ' from (SELECT * , CASE WHEN (class = \'highway\') AND (ST_GeometryType(geometry) = \'ST_LineString\') THEN ';
$sFrom .=' ST_ClosestPoint(geometry, ST_SetSRID(ST_Point('.$fLatReverse.','.$fLonReverse.'),4326))';
$aOutlineResult['lon'] = $aPointPolygon['centrelon'];
}
- if ($this->bIncludePolygonAsGeoJSON) $aOutlineResult['asgeojson'] = $aPointPolygon['asgeojson'];
- if ($this->bIncludePolygonAsKML) $aOutlineResult['askml'] = $aPointPolygon['askml'];
- if ($this->bIncludePolygonAsSVG) $aOutlineResult['assvg'] = $aPointPolygon['assvg'];
- if ($this->bIncludePolygonAsText) $aOutlineResult['astext'] = $aPointPolygon['astext'];
+ if ($this->bIncludePolygonAsGeoJSON) {
+ $aOutlineResult['asgeojson'] = $aPointPolygon['asgeojson'];
+ }
+ if ($this->bIncludePolygonAsKML) {
+ $aOutlineResult['askml'] = $aPointPolygon['askml'];
+ }
+ if ($this->bIncludePolygonAsSVG) {
+ $aOutlineResult['assvg'] = $aPointPolygon['assvg'];
+ }
+ if ($this->bIncludePolygonAsText) {
+ $aOutlineResult['astext'] = $aPointPolygon['astext'];
+ }
if (abs($aPointPolygon['minlat'] - $aPointPolygon['maxlat']) < 0.0000001) {
$aPointPolygon['minlat'] = $aPointPolygon['minlat'] - $fRadius;
protected function lookupLargeArea($sPointSQL, $iMaxRank)
{
- $oResult = null;
-
if ($iMaxRank > 4) {
$aPlace = $this->lookupPolygon($sPointSQL, $iMaxRank);
if ($aPlace) {
{
Debug::newFunction('lookupPolygon');
// polygon search begins at suburb-level
- if ($iMaxRank > 25) $iMaxRank = 25;
+ if ($iMaxRank > 25) {
+ $iMaxRank = 25;
+ }
// no polygon search over country-level
- if ($iMaxRank < 5) $iMaxRank = 5;
+ if ($iMaxRank < 5) {
+ $iMaxRank = 5;
+ }
// search for polygon
$sSQL = 'SELECT place_id, parent_place_id, rank_address, rank_search FROM';
$sSQL .= '(select place_id, parent_place_id, rank_address, rank_search, country_code, geometry';
if ($aPoly) {
// if a polygon is found, search for placenodes begins ...
- $iParentPlaceID = $aPoly['parent_place_id'];
$iRankAddress = $aPoly['rank_address'];
$iRankSearch = $aPoly['rank_search'];
$iPlaceID = $aPoly['place_id'];
public function lookupPoint($sPointSQL, $bDoInterpolation = true)
{
Debug::newFunction('lookupPoint');
- // starts if the search is on POI or street level,
- // searches for the nearest POI or street,
- // if a street is found and a POI is searched for,
- // the nearest POI which the found street is a parent of is choosen.
- $iMaxRank = $this->iMaxRank;
-
// Find the nearest point
$fSearchDiam = 0.006;
$oResult = null;
$aPlace = null;
// for POI or street level
- if ($iMaxRank >= 26) {
+ if ($this->iMaxRank >= 26) {
+ // starts if the search is on POI or street level,
+ // searches for the nearest POI or street,
+ // if a street is found and a POI is searched for,
+ // the nearest POI which the found street is a parent of is choosen.
$sSQL = 'select place_id,parent_place_id,rank_address,country_code,';
$sSQL .= ' ST_distance('.$sPointSQL.', geometry) as distance';
$sSQL .= ' FROM ';
$sSQL .= ' placex';
$sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')';
$sSQL .= ' AND';
- $sSQL .= ' rank_address between 26 and '.$iMaxRank;
+ $sSQL .= ' rank_address between 26 and '.$this->iMaxRank;
$sSQL .= ' and (name is not null or housenumber is not null';
$sSQL .= ' or rank_address between 26 and 27)';
$sSQL .= ' and (rank_address between 26 and 27';
if ($aPlace) {
// if street and maxrank > streetlevel
- if ($iRankAddress <= 27 && $iMaxRank > 27) {
+ if ($iRankAddress <= 27 && $this->iMaxRank > 27) {
// find the closest object (up to a certain radius) of which the street is a parent of
$sSQL = ' select place_id,';
$sSQL .= ' ST_distance('.$sPointSQL.', geometry) as distance';
}
}
- if ($bDoInterpolation && $iMaxRank >= 30) {
+ if ($bDoInterpolation && $this->iMaxRank >= 30) {
$fDistance = $fSearchDiam;
if ($aPlace) {
// We can't reliably go from the closest street to an
$oResult = new Result($aHouse['place_id'], Result::TABLE_OSMLINE);
$oResult->iHouseNumber = closestHouseNumber($aHouse);
$aPlace = $aHouse;
- $iRankAddress = 30;
}
}
}
} else {
// lower than street level ($iMaxRank < 26 )
- $oResult = $this->lookupLargeArea($sPointSQL, $iMaxRank);
+ $oResult = $this->lookupLargeArea($sPointSQL, $this->iMaxRank);
}
Debug::printVar('Final result', $oResult);
public function query(&$oDB, $iMinRank, $iMaxRank, $iLimit)
{
$aResults = array();
- $iHousenumber = -1;
if ($this->sCountryCode
&& empty($this->aName)
public function addEnvPair($sKey, $sVal)
{
if (isset($sKey) && $sKey && isset($sVal)) {
- if (!isset($this->aEnv)) $this->aEnv = $_ENV;
+ if (!isset($this->aEnv)) {
+ $this->aEnv = $_ENV;
+ }
$this->aEnv = array_merge($this->aEnv, array($sKey => $sVal), $_ENV);
}
return $this;
return $iStat;
}
-
-
private function escapeParam($sParam)
{
- if (preg_match('/^-*\w+$/', $sParam)) return $sParam;
- return escapeshellarg($sParam);
+ return (preg_match('/^-*\w+$/', $sParam)) ? $sParam : escapeshellarg($sParam);
}
}
$oDB->connect();
if (isset($aCMDResult['output-type'])) {
- if (!isset($aRankmap[$aCMDResult['output-type']])) fail('unknown output-type: '.$aCMDResult['output-type']);
+ if (!isset($aRankmap[$aCMDResult['output-type']])) {
+ fail('unknown output-type: '.$aCMDResult['output-type']);
+ }
$iOutputRank = $aRankmap[$aCMDResult['output-type']];
} else {
$iOutputRank = $aRankmap['street'];
// Preferred language
$oParams = new Nominatim\ParameterParser();
- if (!isset($aCMDResult['language'])) $aCMDResult['language'] = 'xx';
+ if (!isset($aCMDResult['language'])) {
+ $aCMDResult['language'] = 'xx';
+ }
$aLangPrefOrder = $oParams->getPreferredLanguages($aCMDResult['language']);
$sLanguagePrefArraySQL = $oDB->getArraySQL($oDB->getDBQuotedList($aLangPrefOrder));
// output formatting: build up a lookup table that maps address ranks to columns
$aColumnMapping = array();
$iNumCol = 0;
- if (!isset($aCMDResult['output-format'])) $aCMDResult['output-format'] = 'street;suburb;city;county;state;country';
+ if (!isset($aCMDResult['output-format'])) {
+ $aCMDResult['output-format'] = 'street;suburb;city;county;state;country';
+ }
foreach (preg_split('/\s*;\s*/', $aCMDResult['output-format']) as $sColumn) {
$bHasData = false;
foreach (preg_split('/\s*,\s*/', $sColumn) as $sRank) {
}
}
}
- if ($bHasData) $iNumCol++;
+ if ($bHasData) {
+ $iNumCol++;
+ }
}
// build the query for objects
if ($sOsmType) {
$sSQL = 'select place_id from placex where osm_type = :osm_type and osm_id = :osm_id';
$sParentId = $oDB->getOne($sSQL, array('osm_type' => $sOsmType, 'osm_id' => $sOsmId));
- if (!$sParentId) fail('Could not find place '.$sOsmType.' '.$sOsmId);
+ if (!$sParentId) {
+ fail('Could not find place '.$sOsmType.' '.$sOsmId);
+ }
}
if ($sParentId) {
$sPlacexSQL .= ' and place_id in (select place_id from place_addressline where address_place_id = '.$sParentId.' and isaddress)';
$oResults = $oDB->getQueryStatement($sPlacexSQL);
$fOutstream = fopen('php://output', 'w');
while ($aRow = $oResults->fetch()) {
- //var_dump($aRow);
$iPlaceID = $aRow['place_id'];
$sSQL = "select rank_address,get_name_by_language(name,$sLanguagePrefArraySQL) as localname from get_addressdata(:place_id, -1)";
$sSQL .= ' WHERE isaddress';
$fPostgresVersion = $oDB->getPostgresVersion();
$aDSNInfo = Nominatim\DB::parseDSN(getSetting('DATABASE_DSN'));
-if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
+if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) {
+ $aDSNInfo['port'] = 5432;
+}
// cache memory to be used by osm2pgsql, should not be more than the available memory
$iCacheMemory = (isset($aResult['osm2pgsql-cache'])?$aResult['osm2pgsql-cache']:2000);
$oPlaceLookup->setLanguagePreference(array('en'));
echo 'Warm reverse: ';
- if ($bVerbose) echo "\n";
+ if ($bVerbose) {
+ echo "\n";
+ }
for ($i = 0; $i < 1000; $i++) {
$fLat = rand(-9000, 9000) / 100;
$fLon = rand(-18000, 18000) / 100;
- if ($bVerbose) echo "$fLat, $fLon = ";
+ if ($bVerbose) {
+ echo "$fLat, $fLon = ";
+ }
$oLookup = $oReverseGeocode->lookup($fLat, $fLon);
$aSearchResults = $oLookup ? $oPlaceLookup->lookup(array($oLookup->iId => $oLookup)) : null;
$oGeocode = new Nominatim\Geocode($oDB);
echo 'Warm search: ';
- if ($bVerbose) echo "\n";
+ if ($bVerbose) {
+ echo "\n";
+ }
$sSQL = 'SELECT word FROM word WHERE word is not null ORDER BY search_name_count DESC LIMIT 1000';
foreach ($oDB->getCol($sSQL) as $sWord) {
- if ($bVerbose) echo "$sWord = ";
+ if ($bVerbose) {
+ echo "$sWord = ";
+ }
$oGeocode->setLanguagePreference(array('en'));
$oGeocode->setQuery($sWord);
foreach ($aSpec as $aLine) {
if (is_array($aLine)) {
- if ($aLine[0]) $aQuick['--'.$aLine[0]] = $aLine;
- if ($aLine[1]) $aQuick['-'.$aLine[1]] = $aLine;
+ if ($aLine[0]) {
+ $aQuick['--'.$aLine[0]] = $aLine;
+ }
+ if ($aLine[1]) {
+ $aQuick['-'.$aLine[1]] = $aLine;
+ }
$aCounts[$aLine[0]] = 0;
}
}
$xVal = array();
for ($n = $aLine[4]; $i < $iSize && $n; $n--) {
$i++;
- if ($i >= $iSize || $aArg[$i][0] == '-') showUsage($aSpec, $bExitOnError, 'Parameter of \''.$aLine[0].'\' is missing');
+ if ($i >= $iSize || $aArg[$i][0] == '-') {
+ showUsage($aSpec, $bExitOnError, 'Parameter of \''.$aLine[0].'\' is missing');
+ }
switch ($aLine[6]) {
case 'realpath':
break;
}
}
- if ($aLine[4] == 1) $xVal = $xVal[0];
+ if ($aLine[4] == 1) {
+ $xVal = $xVal[0];
+ }
} else {
$xVal = true;
}
}
if ($aLine[3] > 1) {
- if (!array_key_exists($aLine[0], $aResult)) $aResult[$aLine[0]] = array();
+ if (!array_key_exists($aLine[0], $aResult)) {
+ $aResult[$aLine[0]] = array();
+ }
$aResult[$aLine[0]][] = $xVal;
} else {
$aResult[$aLine[0]] = $xVal;
}
}
- if (array_key_exists('help', $aResult)) showUsage($aSpec);
- if ($bUnknown && $bExitOnUnknown) showUsage($aSpec, $bExitOnError, 'Unknown option \''.$bUnknown.'\'');
+ if (array_key_exists('help', $aResult)) {
+ showUsage($aSpec);
+ }
+ if ($bUnknown && $bExitOnUnknown) {
+ showUsage($aSpec, $bExitOnError, 'Unknown option \''.$bUnknown.'\'');
+ }
foreach ($aSpec as $aLine) {
if (is_array($aLine)) {
- if ($aCounts[$aLine[0]] < $aLine[2]) showUsage($aSpec, $bExitOnError, 'Option \''.$aLine[0].'\' is missing');
- if ($aCounts[$aLine[0]] > $aLine[3]) showUsage($aSpec, $bExitOnError, 'Option \''.$aLine[0].'\' is pressent too many times');
- switch ($aLine[6]) {
- case 'bool':
- if (!array_key_exists($aLine[0], $aResult))
- $aResult[$aLine[0]] = false;
- break;
+ if ($aCounts[$aLine[0]] < $aLine[2]) {
+ showUsage($aSpec, $bExitOnError, 'Option \''.$aLine[0].'\' is missing');
+ }
+ if ($aCounts[$aLine[0]] > $aLine[3]) {
+ showUsage($aSpec, $bExitOnError, 'Option \''.$aLine[0].'\' is pressent too many times');
+ }
+ if ($aLine[6] == 'bool' && !array_key_exists($aLine[0], $aResult)) {
+ $aResult[$aLine[0]] = false;
}
}
}
echo "\n";
}
$aNames = array();
- if ($aLine[1]) $aNames[] = '-'.$aLine[1];
- if ($aLine[0]) $aNames[] = '--'.$aLine[0];
+ if ($aLine[1]) {
+ $aNames[] = '-'.$aLine[1];
+ }
+ if ($aLine[0]) {
+ $aNames[] = '--'.$aLine[0];
+ }
$sName = join(', ', $aNames);
echo ' '.$sName.str_repeat(' ', 30-strlen($sName)).$aLine[7]."\n";
} else {
header('Access-Control-Allow-Headers: '.$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']);
}
}
-if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'OPTIONS') exit;
+if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
+ exit;
+}
-if (CONST_Debug) header('Content-type: text/html; charset=utf-8');
+if (CONST_Debug) {
+ header('Content-type: text/html; charset=utf-8');
+}
// Temporary hack to set the direcory via environment instead of
// the installed scripts. Neither setting is part of the official
// set of settings.
- defined('CONST_DataDir') or define('CONST_DataDir', $_SERVER['NOMINATIM_DATADIR']);
- defined('CONST_SqlDir') or define('CONST_SqlDir', $_SERVER['NOMINATIM_SQLDIR']);
defined('CONST_ConfigDir') or define('CONST_ConfigDir', $_SERVER['NOMINATIM_CONFIGDIR']);
- defined('CONST_Default_ModulePath') or define('CONST_Default_ModulePath', $_SERVER['NOMINATIM_DATABASE_MODULE_SRC_PATH']);
}
function getSetting($sConfName, $sDefault = null)
|| strcmp($sVal, '1') == 0;
}
-function getSettingConfig($sConfName, $sSystemConfig)
-{
- $sValue = $_SERVER['NOMINATIM_'.$sConfName];
-
- if (!$sValue) {
- return CONST_ConfigDir.'/'.$sSystemConfig;
- }
-
- return $sValue;
-}
-
function fail($sError, $sUserError = false)
{
- if (!$sUserError) $sUserError = $sError;
+ if (!$sUserError) {
+ $sUserError = $sError;
+ }
error_log('ERROR: '.$sError);
- var_dump($sUserError)."\n";
+ var_dump($sUserError);
+ echo "\n";
exit(-1);
}
function byImportance($a, $b)
{
- if ($a['importance'] != $b['importance'])
+ if ($a['importance'] != $b['importance']) {
return ($a['importance'] > $b['importance']?-1:1);
+ }
return $a['foundorder'] <=> $b['foundorder'];
}
if (!function_exists('array_key_last')) {
function array_key_last(array $array)
{
- if (!empty($array)) return key(array_slice($array, -1, 1, true));
+ if (!empty($array)) {
+ return key(array_slice($array, -1, 1, true));
+ }
}
}
{
$fStartTime = microtime(true);
$aStartTime = explode('.', $fStartTime);
- if (!isset($aStartTime[1])) $aStartTime[1] = '0';
+ if (!isset($aStartTime[1])) {
+ $aStartTime[1] = '0';
+ }
$sOutputFormat = '';
- if (isset($_GET['format'])) $sOutputFormat = $_GET['format'];
+ if (isset($_GET['format'])) {
+ $sOutputFormat = $_GET['format'];
+ }
if ($sType == 'reverse') {
$sOutQuery = (isset($_GET['lat'])?$_GET['lat']:'').'/';
- if (isset($_GET['lon'])) $sOutQuery .= $_GET['lon'];
- if (isset($_GET['zoom'])) $sOutQuery .= '/'.$_GET['zoom'];
+ if (isset($_GET['lon'])) {
+ $sOutQuery .= $_GET['lon'];
+ }
+ if (isset($_GET['zoom'])) {
+ $sOutQuery .= '/'.$_GET['zoom'];
+ }
} else {
$sOutQuery = $sQuery;
}
);
if (CONST_Log_DB) {
- if (isset($_GET['email']))
+ if (isset($_GET['email'])) {
$sUserAgent = $_GET['email'];
- elseif (isset($_SERVER['HTTP_REFERER']))
+ } elseif (isset($_SERVER['HTTP_REFERER'])) {
$sUserAgent = $_SERVER['HTTP_REFERER'];
- elseif (isset($_SERVER['HTTP_USER_AGENT']))
+ } elseif (isset($_SERVER['HTTP_USER_AGENT'])) {
$sUserAgent = $_SERVER['HTTP_USER_AGENT'];
- else $sUserAgent = '';
+ } else {
+ $sUserAgent = '';
+ }
$sSQL = 'insert into new_query_log (type,starttime,query,ipaddress,useragent,language,format,searchterm)';
$sSQL .= ' values (';
$sSQL .= join(',', $oDB->getDBQuotedList(array(
if (CONST_Log_DB) {
$aEndTime = explode('.', $fEndTime);
- if (!$aEndTime[1]) $aEndTime[1] = '0';
+ if (!$aEndTime[1]) {
+ $aEndTime[1] = '0';
+ }
$sEndTime = date('Y-m-d H:i:s', $aEndTime[0]).'.'.$aEndTime[1];
$sSQL = 'update new_query_log set endtime = '.$oDB->getDBQuoted($sEndTime).', results = '.$iNumResults;
$data = array();
- if (isset($aTagsBlacklist))
+ if (isset($aTagsBlacklist)) {
$data['blackList'] = $aTagsBlacklist;
- if (isset($aTagsWhitelist))
+ }
+ if (isset($aTagsWhitelist)) {
$data['whiteList'] = $aTagsWhitelist;
+ }
$jsonFile = fopen($jsonPhraseSettingsFile, 'w');
fwrite($jsonFile, json_encode($data));
function formatOSMType($sType, $bIncludeExternal = true)
{
- if ($sType == 'N') return 'node';
- if ($sType == 'W') return 'way';
- if ($sType == 'R') return 'relation';
+ if ($sType == 'N') {
+ return 'node';
+ }
+ if ($sType == 'W') {
+ return 'way';
+ }
+ if ($sType == 'R') {
+ return 'relation';
+ }
- if (!$bIncludeExternal) return '';
+ if (!$bIncludeExternal) {
+ return '';
+ }
- if ($sType == 'T') return 'way';
- if ($sType == 'I') return 'way';
+ if ($sType == 'T') {
+ return 'way';
+ }
+ if ($sType == 'I') {
+ return 'way';
+ }
// not handled: P, L
$aFilteredPlaces = array();
if (empty($aPlace)) {
- if (isset($sError))
+ if (isset($sError)) {
$aFilteredPlaces['error'] = $sError;
- else $aFilteredPlaces['error'] = 'Unable to geocode';
+ } else {
+ $aFilteredPlaces['error'] = 'Unable to geocode';
+ }
javascript_renderData($aFilteredPlaces);
} else {
$aFilteredPlaces = array(
)
);
- if (isset($aPlace['place_id'])) $aFilteredPlaces['properties']['geocoding']['place_id'] = $aPlace['place_id'];
+ if (isset($aPlace['place_id'])) {
+ $aFilteredPlaces['properties']['geocoding']['place_id'] = $aPlace['place_id'];
+ }
$sOSMType = formatOSMType($aPlace['osm_type']);
if ($sOSMType) {
$aFilteredPlaces['properties']['geocoding']['osm_type'] = $sOSMType;
$aFilteredPlaces = array();
if (empty($aPlace)) {
- if (isset($sError))
+ if (isset($sError)) {
$aFilteredPlaces['error'] = $sError;
- else $aFilteredPlaces['error'] = 'Unable to geocode';
+ } else {
+ $aFilteredPlaces['error'] = 'Unable to geocode';
+ }
javascript_renderData($aFilteredPlaces);
} else {
$aFilteredPlaces = array(
'properties' => array()
);
- if (isset($aPlace['place_id'])) $aFilteredPlaces['properties']['place_id'] = $aPlace['place_id'];
+ if (isset($aPlace['place_id'])) {
+ $aFilteredPlaces['properties']['place_id'] = $aPlace['place_id'];
+ }
$sOSMType = formatOSMType($aPlace['osm_type']);
if ($sOSMType) {
$aFilteredPlaces['properties']['osm_type'] = $sOSMType;
if (isset($aPlace['address'])) {
$aFilteredPlaces['properties']['address'] = $aPlace['address']->getAddressNames();
}
- if (isset($aPlace['sExtraTags'])) $aFilteredPlaces['properties']['extratags'] = $aPlace['sExtraTags'];
- if (isset($aPlace['sNameDetails'])) $aFilteredPlaces['properties']['namedetails'] = $aPlace['sNameDetails'];
+ if (isset($aPlace['sExtraTags'])) {
+ $aFilteredPlaces['properties']['extratags'] = $aPlace['sExtraTags'];
+ }
+ if (isset($aPlace['sNameDetails'])) {
+ $aFilteredPlaces['properties']['namedetails'] = $aPlace['sNameDetails'];
+ }
if (isset($aPlace['aBoundingBox'])) {
$aFilteredPlaces['bbox'] = array(
$aFilteredPlaces = array();
if (empty($aPlace)) {
- if (isset($sError))
+ if (isset($sError)) {
$aFilteredPlaces['error'] = $sError;
- else $aFilteredPlaces['error'] = 'Unable to geocode';
+ } else {
+ $aFilteredPlaces['error'] = 'Unable to geocode';
+ }
} else {
- if (isset($aPlace['place_id'])) $aFilteredPlaces['place_id'] = $aPlace['place_id'];
+ if (isset($aPlace['place_id'])) {
+ $aFilteredPlaces['place_id'] = $aPlace['place_id'];
+ }
$aFilteredPlaces['licence'] = 'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright';
$sOSMType = formatOSMType($aPlace['osm_type']);
if ($sOSMType) {
$aFilteredPlaces['osm_type'] = $sOSMType;
$aFilteredPlaces['osm_id'] = $aPlace['osm_id'];
}
- if (isset($aPlace['lat'])) $aFilteredPlaces['lat'] = $aPlace['lat'];
- if (isset($aPlace['lon'])) $aFilteredPlaces['lon'] = $aPlace['lon'];
+ if (isset($aPlace['lat'])) {
+ $aFilteredPlaces['lat'] = $aPlace['lat'];
+ }
+ if (isset($aPlace['lon'])) {
+ $aFilteredPlaces['lon'] = $aPlace['lon'];
+ }
if ($sOutputFormat == 'jsonv2' || $sOutputFormat == 'geojson') {
$aFilteredPlaces['place_rank'] = $aPlace['rank_search'];
if (isset($aPlace['address'])) {
$aFilteredPlaces['address'] = $aPlace['address']->getAddressNames();
}
- if (isset($aPlace['sExtraTags'])) $aFilteredPlaces['extratags'] = $aPlace['sExtraTags'];
- if (isset($aPlace['sNameDetails'])) $aFilteredPlaces['namedetails'] = $aPlace['sNameDetails'];
+ if (isset($aPlace['sExtraTags'])) {
+ $aFilteredPlaces['extratags'] = $aPlace['sExtraTags'];
+ }
+ if (isset($aPlace['sNameDetails'])) {
+ $aFilteredPlaces['namedetails'] = $aPlace['sNameDetails'];
+ }
if (isset($aPlace['aBoundingBox'])) {
$aFilteredPlaces['boundingbox'] = $aPlace['aBoundingBox'];
echo ">\n";
if (empty($aPlace)) {
- if (isset($sError))
+ if (isset($sError)) {
echo "<error>$sError</error>";
- else echo '<error>Unable to geocode</error>';
+ } else {
+ echo '<error>Unable to geocode</error>';
+ }
} else {
echo '<result';
- if ($aPlace['place_id']) echo ' place_id="'.$aPlace['place_id'].'"';
+ if ($aPlace['place_id']) {
+ echo ' place_id="'.$aPlace['place_id'].'"';
+ }
$sOSMType = formatOSMType($aPlace['osm_type']);
- if ($sOSMType) echo ' osm_type="'.$sOSMType.'"'.' osm_id="'.$aPlace['osm_id'].'"';
- if ($aPlace['ref']) echo ' ref="'.htmlspecialchars($aPlace['ref']).'"';
- if (isset($aPlace['lat'])) echo ' lat="'.htmlspecialchars($aPlace['lat']).'"';
- if (isset($aPlace['lon'])) echo ' lon="'.htmlspecialchars($aPlace['lon']).'"';
+ if ($sOSMType) {
+ echo ' osm_type="'.$sOSMType.'"'.' osm_id="'.$aPlace['osm_id'].'"';
+ }
+ if ($aPlace['ref']) {
+ echo ' ref="'.htmlspecialchars($aPlace['ref']).'"';
+ }
+ if (isset($aPlace['lat'])) {
+ echo ' lat="'.htmlspecialchars($aPlace['lat']).'"';
+ }
+ if (isset($aPlace['lon'])) {
+ echo ' lon="'.htmlspecialchars($aPlace['lon']).'"';
+ }
if (isset($aPlace['aBoundingBox'])) {
echo ' boundingbox="';
echo join(',', $aPlace['aBoundingBox']);
$aPlaceDetails['geometry'] = json_decode($aPointDetails['asgeojson']);
$funcMapAddressLine = function ($aFull) {
- $aMapped = array(
- 'localname' => $aFull['localname'],
- 'place_id' => isset($aFull['place_id']) ? (int) $aFull['place_id'] : null,
- 'osm_id' => isset($aFull['osm_id']) ? (int) $aFull['osm_id'] : null,
- 'osm_type' => isset($aFull['osm_type']) ? $aFull['osm_type'] : null,
- 'place_type' => isset($aFull['place_type']) ? $aFull['place_type'] : null,
- 'class' => $aFull['class'],
- 'type' => $aFull['type'],
- 'admin_level' => isset($aFull['admin_level']) ? (int) $aFull['admin_level'] : null,
- 'rank_address' => $aFull['rank_address'] ? (int) $aFull['rank_address'] : null,
- 'distance' => (float) $aFull['distance'],
- 'isaddress' => isset($aFull['isaddress']) ? (bool) $aFull['isaddress'] : null
- );
-
- return $aMapped;
+ return array(
+ 'localname' => $aFull['localname'],
+ 'place_id' => isset($aFull['place_id']) ? (int) $aFull['place_id'] : null,
+ 'osm_id' => isset($aFull['osm_id']) ? (int) $aFull['osm_id'] : null,
+ 'osm_type' => isset($aFull['osm_type']) ? $aFull['osm_type'] : null,
+ 'place_type' => isset($aFull['place_type']) ? $aFull['place_type'] : null,
+ 'class' => $aFull['class'],
+ 'type' => $aFull['type'],
+ 'admin_level' => isset($aFull['admin_level']) ? (int) $aFull['admin_level'] : null,
+ 'rank_address' => $aFull['rank_address'] ? (int) $aFull['rank_address'] : null,
+ 'distance' => (float) $aFull['distance'],
+ 'isaddress' => isset($aFull['isaddress']) ? (bool) $aFull['isaddress'] : null
+ );
};
$funcMapKeyword = function ($aFull) {
- $aMapped = array(
- 'id' => (int) $aFull['word_id'],
- 'token' => $aFull['word_token']
- );
- return $aMapped;
+ return array(
+ 'id' => (int) $aFull['word_id'],
+ 'token' => $aFull['word_token']
+ );
};
if ($aAddressLines) {
if ($bGroupHierarchy) {
$aPlaceDetails['hierarchy'] = array();
foreach ($aHierarchyLines as $aAddressLine) {
- if ($aAddressLine['type'] == 'yes') $sType = $aAddressLine['class'];
- else $sType = $aAddressLine['type'];
+ if ($aAddressLine['type'] == 'yes') {
+ $sType = $aAddressLine['class'];
+ } else {
+ $sType = $aAddressLine['type'];
+ }
- if (!isset($aPlaceDetails['hierarchy'][$sType]))
+ if (!isset($aPlaceDetails['hierarchy'][$sType])) {
$aPlaceDetails['hierarchy'][$sType] = array();
+ }
$aPlaceDetails['hierarchy'][$sType][] = $funcMapAddressLine($aAddressLine);
}
} else {
$error['details'] = $exception->getFile() . '('. $exception->getLine() . ')';
}
- echo javascript_renderData(array('error' => $error));
+ javascript_renderData(array('error' => $error));
$aOutput['batch'] = array();
foreach ($aBatchResults as $aSearchResults) {
- if (!$aSearchResults) $aSearchResults = array();
+ if (!$aSearchResults) {
+ $aSearchResults = array();
+ }
$aFilteredPlaces = array();
foreach ($aSearchResults as $iResNum => $aPointDetails) {
$aPlace = array(
)
);
- if (isset($aPointDetails['place_id'])) $aPlace['properties']['geocoding']['place_id'] = $aPointDetails['place_id'];
+ if (isset($aPointDetails['place_id'])) {
+ $aPlace['properties']['geocoding']['place_id'] = $aPointDetails['place_id'];
+ }
$sOSMType = formatOSMType($aPointDetails['osm_type']);
if ($sOSMType) {
$aPlace['properties']['geocoding']['osm_type'] = $sOSMType;
'place_id'=>$aPointDetails['place_id'],
)
);
-
+
$sOSMType = formatOSMType($aPointDetails['osm_type']);
if ($sOSMType) {
$aPlace['properties']['osm_type'] = $sOSMType;
}
- if (isset($aPointDetails['sExtraTags'])) $aPlace['properties']['extratags'] = $aPointDetails['sExtraTags'];
- if (isset($aPointDetails['sNameDetails'])) $aPlace['properties']['namedetails'] = $aPointDetails['sNameDetails'];
+ if (isset($aPointDetails['sExtraTags'])) {
+ $aPlace['properties']['extratags'] = $aPointDetails['sExtraTags'];
+ }
+ if (isset($aPointDetails['sNameDetails'])) {
+ $aPlace['properties']['namedetails'] = $aPointDetails['sNameDetails'];
+ }
$aFilteredPlaces[] = $aPlace;
}
'place_id'=>$aPointDetails['place_id'],
'licence'=>'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright',
);
-
+
$sOSMType = formatOSMType($aPointDetails['osm_type']);
if ($sOSMType) {
$aPlace['osm_type'] = $sOSMType;
$aPlace['geokml'] = $aPointDetails['askml'];
}
- if (isset($aPointDetails['sExtraTags'])) $aPlace['extratags'] = $aPointDetails['sExtraTags'];
- if (isset($aPointDetails['sNameDetails'])) $aPlace['namedetails'] = $aPointDetails['sNameDetails'];
+ if (isset($aPointDetails['sExtraTags'])) {
+ $aPlace['extratags'] = $aPointDetails['sExtraTags'];
+ }
+ if (isset($aPointDetails['sNameDetails'])) {
+ $aPlace['namedetails'] = $aPointDetails['sNameDetails'];
+ }
$aFilteredPlaces[] = $aPlace;
}
echo " timestamp='".date(DATE_RFC822)."'";
echo " attribution='Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'";
echo " querystring='".htmlspecialchars($sQuery, ENT_QUOTES)."'";
-if (isset($aMoreParams['viewbox'])) echo " viewbox='".htmlspecialchars($aMoreParams['viewbox'], ENT_QUOTES)."'";
+if (isset($aMoreParams['viewbox'])) {
+ echo " viewbox='".htmlspecialchars($aMoreParams['viewbox'], ENT_QUOTES)."'";
+}
if (isset($aMoreParams['exclude_place_ids'])) {
echo " exclude_place_ids='".htmlspecialchars($aMoreParams['exclude_place_ids'])."'";
}
// now compute all possible tokens
$aWordLists = array();
$aTokens = array();
- foreach ($aNormPhrases as $sTitle => $sPhrase) {
+ foreach ($aNormPhrases as $sPhrase) {
if (strlen($sPhrase) > 0) {
$aWords = explode(' ', $sPhrase);
Tokenizer::addTokens($aTokens, $aWords);
if (CONST_Use_US_Tiger_Data) {
$iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_property_tiger WHERE place_id = '.$iPlaceID);
- if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
+ if ($iParentPlaceID) {
+ $iPlaceID = $iParentPlaceID;
+ }
}
// interpolated house numbers
$iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_property_osmline WHERE place_id = '.$iPlaceID);
-if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
+if ($iParentPlaceID) {
+ $iPlaceID = $iParentPlaceID;
+}
// artificial postcodes
$iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_postcode WHERE place_id = '.$iPlaceID);
-if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
+if ($iParentPlaceID) {
+ $iPlaceID = $iParentPlaceID;
+}
$hLog = logStart($oDB, 'details', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
foreach ($aOsmIds as $sItem) {
// Skip empty sItem
- if (empty($sItem)) continue;
-
+ if (empty($sItem)) {
+ continue;
+ }
+
$sType = $sItem[0];
$iId = (int) substr($sItem, 1);
if ($iId > 0 && ($sType == 'N' || $sType == 'W' || $sType == 'R')) {
// key names
$oResult = $oPlace;
unset($oResult['aAddress']);
- if (isset($oPlace['aAddress'])) $oResult['address'] = $oPlace['aAddress'];
+ if (isset($oPlace['aAddress'])) {
+ $oResult['address'] = $oPlace['aAddress'];
+ }
if ($sOutputFormat != 'geocodejson') {
unset($oResult['langaddress']);
$oResult['name'] = $oPlace['langaddress'];
}
-if (CONST_Debug) exit;
+if (CONST_Debug) {
+ exit;
+}
$sXmlRootTag = 'lookupresults';
$sQuery = join(',', $aCleanedQueryParts);
$iDays++;
}
- if ($bReduced) $aWhere[] = "errormessage like 'Area reduced%'";
- if ($sClass) $sWhere[] = "class = '".pg_escape_string($sClass)."'";
+ if ($bReduced) {
+ $aWhere[] = "errormessage like 'Area reduced%'";
+ }
+ if ($sClass) {
+ $sWhere[] = "class = '".pg_escape_string($sClass)."'";
+ }
if (!empty($aWhere)) {
$sSQL .= ' WHERE '.join(' and ', $aWhere);
$sMoreURL = '/search.php?'.http_build_query($aMoreParams);
}
-if (CONST_Debug) exit;
+if (CONST_Debug) {
+ exit;
+}
$sOutputTemplate = ($sOutputFormat == 'jsonv2') ? 'json' : $sOutputFormat;
include(CONST_LibDir.'/template/search-'.$sOutputTemplate.'.php');
self.ignore_sql_errors = ignore_sql_errors
def __enter__(self):
- pass
+ return self
def __exit__(self, exc_type, exc_value, traceback):
if __has_psycopg2_errors__:
if exc_type == psycopg2.errors.DeadlockDetected: # pylint: disable=E1101
self.handler()
return True
- else:
- if exc_type == psycopg2.extensions.TransactionRollbackError:
- if exc_value.pgcode == '40P01':
- self.handler()
- return True
+ elif exc_type == psycopg2.extensions.TransactionRollbackError \
+ and exc_value.pgcode == '40P01':
+ self.handler()
+ return True
if self.ignore_sql_errors and isinstance(exc_value, psycopg2.Error):
LOG.info("SQL error ignored: %s", exc_value)
yield thread
if command_stat > self.REOPEN_CONNECTIONS_AFTER:
- for thread in self.threads:
- while not thread.is_done():
- thread.wait()
- thread.connect()
+ self._reconnect_threads()
ready = self.threads
command_stat = 0
else:
self.wait_time += time.time() - tstart
+ def _reconnect_threads(self):
+ for thread in self.threads:
+ while not thread.is_done():
+ thread.wait()
+ thread.connect()
+
+
def __enter__(self):
return self
def index_full(self, analyse=True):
- """ Index the complete database. This will first index boudnaries
+ """ Index the complete database. This will first index boundaries
followed by all other objects. When `analyse` is True, then the
database will be analysed at the appropriate places to
ensure that database statistics are updated.
with connect(self.dsn) as conn:
conn.autocommit = True
- if analyse:
- def _analyze():
+ def _analyze():
+ if analyse:
with conn.cursor() as cur:
cur.execute('ANALYZE')
- else:
- def _analyze():
- pass
self.index_by_rank(0, 4)
_analyze()
pos += 1
force_space = False
- results = set()
-
+ # No variants detected? Fast return.
if startpos == 0:
trans_name = self.to_ascii.transliterate(norm_name).strip()
+ return [trans_name] if trans_name else []
+
+ return self._compute_result_set(partials, baseform[startpos:])
+
+
+ def _compute_result_set(self, partials, prefix):
+ results = set()
+
+ for variant in partials:
+ vname = variant + prefix
+ trans_name = self.to_ascii.transliterate(vname[1:-1]).strip()
if trans_name:
results.add(trans_name)
- else:
- for variant in partials:
- name = variant + baseform[startpos:]
- trans_name = self.to_ascii.transliterate(name[1:-1]).strip()
- if trans_name:
- results.add(trans_name)
return list(results)
self.add_country_names(country_feature.lower(), names)
address = place.get('address')
-
if address:
- hnrs = []
- addr_terms = []
- for key, value in address.items():
- if key == 'postcode':
- self._add_postcode(value)
- elif key in ('housenumber', 'streetnumber', 'conscriptionnumber'):
- hnrs.append(value)
- elif key == 'street':
- token_info.add_street(*self._compute_name_tokens({'name': value}))
- elif key == 'place':
- token_info.add_place(*self._compute_name_tokens({'name': value}))
- elif not key.startswith('_') and \
- key not in ('country', 'full'):
- addr_terms.append((key, *self._compute_name_tokens({'name': value})))
-
- if hnrs:
- hnrs = self._split_housenumbers(hnrs)
- token_info.add_housenumbers(self.conn, [self._make_standard_hnr(n) for n in hnrs])
-
- if addr_terms:
- token_info.add_address_terms(addr_terms)
+ self._process_place_address(token_info, address)
return token_info.data
+ def _process_place_address(self, token_info, address):
+ hnrs = []
+ addr_terms = []
+ for key, value in address.items():
+ if key == 'postcode':
+ self._add_postcode(value)
+ elif key in ('housenumber', 'streetnumber', 'conscriptionnumber'):
+ hnrs.append(value)
+ elif key == 'street':
+ token_info.add_street(*self._compute_name_tokens({'name': value}))
+ elif key == 'place':
+ token_info.add_place(*self._compute_name_tokens({'name': value}))
+ elif not key.startswith('_') and \
+ key not in ('country', 'full'):
+ addr_terms.append((key, *self._compute_name_tokens({'name': value})))
+
+ if hnrs:
+ hnrs = self._split_housenumbers(hnrs)
+ token_info.add_housenumbers(self.conn, [self._make_standard_hnr(n) for n in hnrs])
+
+ if addr_terms:
+ token_info.add_address_terms(addr_terms)
+
+
def _compute_name_tokens(self, names):
""" Computes the full name and partial name tokens for the given
dictionary of names.
self.add_country_names(country_feature.lower(), names)
address = place.get('address')
-
if address:
- hnrs = []
- addr_terms = []
- for key, value in address.items():
- if key == 'postcode':
- self._add_postcode(value)
- elif key in ('housenumber', 'streetnumber', 'conscriptionnumber'):
- hnrs.append(value)
- elif key == 'street':
- token_info.add_street(self.conn, value)
- elif key == 'place':
- token_info.add_place(self.conn, value)
- elif not key.startswith('_') and \
- key not in ('country', 'full'):
- addr_terms.append((key, value))
-
- if hnrs:
- token_info.add_housenumbers(self.conn, hnrs)
-
- if addr_terms:
- token_info.add_address_terms(self.conn, addr_terms)
+ self._process_place_address(token_info, address)
return token_info.data
- def _add_postcode(self, postcode):
- """ Make sure the normalized postcode is present in the word table.
- """
- if re.search(r'[:,;]', postcode) is None:
- self._cache.add_postcode(self.conn, self.normalize_postcode(postcode))
+ def _process_place_address(self, token_info, address):
+ hnrs = []
+ addr_terms = []
+
+ for key, value in address.items():
+ if key == 'postcode':
+ # Make sure the normalized postcode is present in the word table.
+ if re.search(r'[:,;]', value) is None:
+ self._cache.add_postcode(self.conn,
+ self.normalize_postcode(value))
+ elif key in ('housenumber', 'streetnumber', 'conscriptionnumber'):
+ hnrs.append(value)
+ elif key == 'street':
+ token_info.add_street(self.conn, value)
+ elif key == 'place':
+ token_info.add_place(self.conn, value)
+ elif not key.startswith('_') and key not in ('country', 'full'):
+ addr_terms.append((key, value))
+
+ if hnrs:
+ token_info.add_housenumbers(self.conn, hnrs)
+
+ if addr_terms:
+ token_info.add_address_terms(self.conn, addr_terms)
+
class _TokenInfo:
if drop:
conn.drop_table('planet_osm_nodes')
- if drop:
- if options['flatnode_file']:
- Path(options['flatnode_file']).unlink()
+ if drop and options['flatnode_file']:
+ Path(options['flatnode_file']).unlink()
def create_tables(conn, config, reverse_only=False):
conn.commit()
+def _quote_php_variable(var_type, config, conf_name):
+ if var_type == bool:
+ return 'true' if config.get_bool(conf_name) else 'false'
+
+ if var_type == int:
+ return getattr(config, conf_name)
+
+ if not getattr(config, conf_name):
+ return 'false'
+
+ quoted = getattr(config, conf_name).replace("'", "\\'")
+ return f"'{quoted}'"
+
+
def setup_website(basedir, config, conn):
""" Create the website script stubs.
"""
config.project_dir / 'tokenizer'))
for php_name, conf_name, var_type in PHP_CONST_DEFS:
- if var_type == bool:
- varout = 'true' if config.get_bool(conf_name) else 'false'
- elif var_type == int:
- varout = getattr(config, conf_name)
- elif not getattr(config, conf_name):
- varout = 'false'
- else:
- varout = "'{}'".format(getattr(config, conf_name).replace("'", "\\'"))
+ varout = _quote_php_variable(var_type, config, conf_name)
- template += "@define('CONST_{}', {});\n".format(php_name, varout)
+ template += f"@define('CONST_{php_name}', {varout});\n"
- template += "\nrequire_once('{}/website/{{}}');\n".format(config.lib_dir.php)
+ template += f"\nrequire_once('{config.lib_dir.php}/website/{{}}');\n"
search_name_table_exists = bool(conn and conn.table_exists('search_name'))
from nominatim.tools.special_phrases.importer_statistics import SpecialPhrasesImporterStatistics
LOG = logging.getLogger()
+
+def _classtype_table(phrase_class, phrase_type):
+ """ Return the name of the table for the given class and type.
+ """
+ return f'place_classtype_{phrase_class}_{phrase_type}'
+
class SPImporter():
# pylint: disable-msg=too-many-instance-attributes
"""
phrase_class = pair[0]
phrase_type = pair[1]
- table_name = 'place_classtype_{}_{}'.format(phrase_class, phrase_type)
+ table_name = _classtype_table(phrase_class, phrase_type)
if table_name in self.table_phrases_to_delete:
self.statistics_handler.notify_one_table_ignored()
"""
Create table place_classtype of the given phrase_class/phrase_type if doesn't exit.
"""
- table_name = 'place_classtype_{}_{}'.format(phrase_class, phrase_type)
+ table_name = _classtype_table(phrase_class, phrase_type)
with self.db_connection.cursor() as db_cursor:
db_cursor.execute(SQL("""
CREATE TABLE IF NOT EXISTS {{}} {}
Create indexes on centroid and place_id for the place_classtype table.
"""
index_prefix = 'idx_place_classtype_{}_{}_'.format(phrase_class, phrase_type)
- base_table = 'place_classtype_{}_{}'.format(phrase_class, phrase_type)
+ base_table = _classtype_table(phrase_class, phrase_type)
#Index on centroid
if not self.db_connection.index_exists(index_prefix + 'centroid'):
with self.db_connection.cursor() as db_cursor:
"""
Grant access on read to the table place_classtype for the webuser.
"""
- table_name = 'place_classtype_{}_{}'.format(phrase_class, phrase_type)
+ table_name = _classtype_table(phrase_class, phrase_type)
with self.db_connection.cursor() as db_cursor:
db_cursor.execute(SQL("""GRANT SELECT ON {} TO {}""")
.format(Identifier(table_name),
(self.phplib_dir / 'migration/PhraseSettingsToJson.php').resolve(),
file_path], check=True)
LOG.warning('special_phrase configuration file has been converted to json.')
- return json_file_path
except subprocess.CalledProcessError:
LOG.error('Error while converting %s to json.', file_path)
raise
- else:
- return json_file_path
+
+ return json_file_path