function loadParamArray($aParams)
{
if (isset($aParams['addressdetails'])) $this->bIncludeAddressDetails = (bool)$aParams['addressdetails'];
- if (isset($aParams['extratags'])) $this->bIncludeExtraTags = (bool)$aParams['extratags'];
- if (isset($aParams['namedetails'])) $this->bIncludeNameDetails = (bool)$aParams['namedetails'];
+ if ((float) CONST_Postgresql_Version > 9.2)
+ {
+ if (isset($aParams['extratags'])) $this->bIncludeExtraTags = (bool)$aParams['extratags'];
+ if (isset($aParams['namedetails'])) $this->bIncludeNameDetails = (bool)$aParams['namedetails'];
+ }
if (isset($aParams['bounded'])) $this->bBoundedSearch = (bool)$aParams['bounded'];
if (isset($aParams['dedupe'])) $this->bDeDupe = (bool)$aParams['dedupe'];
function getGroupedSearches($aSearches, $aPhraseTypes, $aPhrases, $aValidTokens, $aWordFrequencyScores, $bStructuredPhrases)
{
/*
- Calculate all searches using aValidTokens i.e.
- 'Wodsworth Road, Sheffield' =>
+ Calculate all searches using aValidTokens i.e.
+ 'Wodsworth Road, Sheffield' =>
- Phrase Wordset
- 0 0 (wodsworth road)
- 0 1 (wodsworth)(road)
- 1 0 (sheffield)
+ Phrase Wordset
+ 0 0 (wodsworth road)
+ 0 1 (wodsworth)(road)
+ 1 0 (sheffield)
- Score how good the search is so they can be ordered
+ Score how good the search is so they can be ordered
*/
foreach($aPhrases as $iPhrase => $sPhrase)
{
/* Perform the actual query lookup.
Returns an ordered list of results, each with the following fields:
- osm_type: type of corresponding OSM object
+ osm_type: type of corresponding OSM object
N - node
W - way
R - relation
P - postcode (internally computed)
- osm_id: id of corresponding OSM object
- class: general object class (corresponds to tag key of primary OSM tag)
- type: subclass of object (corresponds to tag value of primary OSM tag)
- admin_level: see http://wiki.openstreetmap.org/wiki/Admin_level
- rank_search: rank in search hierarchy
+ osm_id: id of corresponding OSM object
+ class: general object class (corresponds to tag key of primary OSM tag)
+ type: subclass of object (corresponds to tag value of primary OSM tag)
+ admin_level: see http://wiki.openstreetmap.org/wiki/Admin_level
+ rank_search: rank in search hierarchy
(see also http://wiki.openstreetmap.org/wiki/Nominatim/Development_overview#Country_to_street_level)
- rank_address: rank in address hierarchy (determines orer in address)
- place_id: internal key (may differ between different instances)
- country_code: ISO country code
- langaddress: localized full address
- placename: localized name of object
- ref: content of ref tag (if available)
- lon: longitude
- lat: latitude
- importance: importance of place based on Wikipedia link count
- addressimportance: cumulated importance of address elements
- extra_place: type of place (for admin boundaries, if there is a place tag)
- aBoundingBox: bounding Box
- label: short description of the object class/type (English only)
- name: full name (currently the same as langaddress)
- foundorder: secondary ordering for places with same importance
+ rank_address: rank in address hierarchy (determines orer in address)
+ place_id: internal key (may differ between different instances)
+ country_code: ISO country code
+ langaddress: localized full address
+ placename: localized name of object
+ ref: content of ref tag (if available)
+ lon: longitude
+ lat: latitude
+ importance: importance of place based on Wikipedia link count
+ addressimportance: cumulated importance of address elements
+ extra_place: type of place (for admin boundaries, if there is a place tag)
+ aBoundingBox: bounding Box
+ label: short description of the object class/type (English only)
+ name: full name (currently the same as langaddress)
+ foundorder: secondary ordering for places with same importance
*/
function lookup()
{
{
// Start with a blank search
$aSearches = array(
- array('iSearchRank' => 0, 'iNamePhrase' => -1, 'sCountryCode' => false, 'aName'=>array(), 'aAddress'=>array(), 'aFullNameAddress'=>array(),
- 'aNameNonSearch'=>array(), 'aAddressNonSearch'=>array(),
- 'sOperator'=>'', 'aFeatureName' => array(), 'sClass'=>'', 'sType'=>'', 'sHouseNumber'=>'', 'fLat'=>'', 'fLon'=>'', 'fRadius'=>'')
+ array('iSearchRank' => 0,
+ 'iNamePhrase' => -1,
+ 'sCountryCode' => false,
+ 'aName' => array(),
+ 'aAddress' => array(),
+ 'aFullNameAddress' => array(),
+ 'aNameNonSearch' => array(),
+ 'aAddressNonSearch' => array(),
+ 'sOperator' => '',
+ 'aFeatureName' => array(),
+ 'sClass' => '',
+ 'sType' => '',
+ 'sHouseNumber' => '',
+ 'fLat' => '',
+ 'fLon' => '',
+ 'fRadius' => ''
+ )
);
// Do we have a radius search?
{
$sSQL = "select place_id from placex where calculated_country_code='".$aSearch['sCountryCode']."' and rank_search = 4";
if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
- if ($bBoundingBoxSearch)
- $sSQL .= " and _st_intersects($this->sViewboxSmallSQL, geometry)";
+ if ($bBoundingBoxSearch)
+ $sSQL .= " and _st_intersects($this->sViewboxSmallSQL, geometry)";
$sSQL .= " order by st_area(geometry) desc limit 1";
if (CONST_Debug) var_dump($sSQL);
$aPlaceIDs = $this->oDB->getCol($sSQL);
if (!preg_match('/\pL/', $sWord)) unset($aRecheckWords[$i]);
}
- if (CONST_Debug) { echo '<i>Recheck words:<\i>'; var_dump($aRecheckWords); }
+ if (CONST_Debug) { echo '<i>Recheck words:<\i>'; var_dump($aRecheckWords); }
foreach($aSearchResults as $iResNum => $aResult)
{
if ($this->bIncludePolygonAsPoints)
{
- // Translate geometry string to point array
- if (preg_match('#POLYGON\\(\\(([- 0-9.,]+)#',$aPointPolygon['astext'],$aMatch))
- {
- preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/',$aMatch[1],$aPolyPoints,PREG_SET_ORDER);
- }
- elseif (preg_match('#MULTIPOLYGON\\(\\(\\(([- 0-9.,]+)#',$aPointPolygon['astext'],$aMatch))
- {
- preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/',$aMatch[1],$aPolyPoints,PREG_SET_ORDER);
- }
- elseif (preg_match('#POINT\\((-?[0-9.]+) (-?[0-9.]+)\\)#',$aPointPolygon['astext'],$aMatch))
+ $aPolyPoints[] = geometryText2Points($aPointPolygon['astext'],$fRadius);
+
+ // Output data suitable for display (points and a bounding box)
+ if (isset($aPolyPoints))
{
- $iSteps = max(8, min(100, ($fRadius * 40000)^2));
- $fStepSize = (2*pi())/$iSteps;
- $aPolyPoints = array();
- for($f = 0; $f < 2*pi(); $f += $fStepSize)
+ $aResult['aPolyPoints'] = array();
+ foreach($aPolyPoints as $aPoint)
{
- $aPolyPoints[] = array('',$aMatch[1]+($fRadius*sin($f)),$aMatch[2]+($fRadius*cos($f)));
+ $aResult['aPolyPoints'][] = array($aPoint[1], $aPoint[2]);
}
}
}
- // Output data suitable for display (points and a bounding box)
- if ($this->bIncludePolygonAsPoints && isset($aPolyPoints))
- {
- $aResult['aPolyPoints'] = array();
- foreach($aPolyPoints as $aPoint)
- {
- $aResult['aPolyPoints'][] = array($aPoint[1], $aPoint[2]);
- }
- }
-
if (abs($aPointPolygon['minlat'] - $aPointPolygon['maxlat']) < 0.0000001)
{
$aPointPolygon['minlat'] = $aPointPolygon['minlat'] - $fRadius;
}
else
{
- $aResult['sExtraTags'] = array();
+ $aResult['sExtraTags'] = (object) array();
}
}
}
else
{
- $aResult['sNameDetails'] = array();
+ $aResult['sNameDetails'] = (object) array();
}
}