X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/c8e79397f5b71eae8fd7738c931f7f80b1228654..1424e8e29bd54d3f713a38a834ff0c8ff5f463fb:/lib/PlaceLookup.php?ds=sidebyside diff --git a/lib/PlaceLookup.php b/lib/PlaceLookup.php index bd49543a..933ab00c 100644 --- a/lib/PlaceLookup.php +++ b/lib/PlaceLookup.php @@ -2,6 +2,8 @@ namespace Nominatim; +require_once(CONST_BasePath.'/lib/Result.php'); + class PlaceLookup { protected $oDB; @@ -45,27 +47,16 @@ class PlaceLookup $this->bNameDetails = $bNameDetails; } - public function setIncludePolygonAsPoints($b = true) { $this->bIncludePolygonAsPoints = $b; } - public function getIncludePolygonAsPoints() - { - return $this->bIncludePolygonAsPoints; - } - public function setIncludePolygonAsText($b = true) { $this->bIncludePolygonAsText = $b; } - public function getIncludePolygonAsText() - { - return $this->bIncludePolygonAsText; - } - public function setIncludePolygonAsGeoJSON($b = true) { $this->bIncludePolygonAsGeoJSON = $b; @@ -86,60 +77,64 @@ class PlaceLookup $this->fPolygonSimplificationThreshold = $f; } + private function languagePrefSql() + { + return 'ARRAY['.join(',', array_map('getDBQuoted', $this->aLangPrefOrder)).']'; + } + public function lookupOSMID($sType, $iID) { - $sSQL = "select place_id from placex where osm_type = '".pg_escape_string($sType)."' and osm_id = ".(int)$iID." order by type = 'postcode' asc"; + $sSQL = "select place_id from placex where osm_type = '".$sType."' and osm_id = ".$iID; $iPlaceID = chksql($this->oDB->getOne($sSQL)); - return $this->lookup((int)$iPlaceID); + if (!$iPlaceID) { + return null; + } + + return $this->lookup(new Result($iPlaceID)); } - public function lookup($iPlaceID, $sType = '', $fInterpolFraction = 0.0) + public function lookup($oResult) { - if (!$iPlaceID) return null; + if ($oResult === null) { + return null; + } - $sLanguagePrefArraySQL = "ARRAY[".join(',', array_map("getDBQuoted", $this->aLangPrefOrder))."]"; - $bIsTiger = CONST_Use_US_Tiger_Data && $sType == 'tiger'; - $bIsInterpolation = $sType == 'interpolation'; + $sLanguagePrefArraySQL = $this->languagePrefSql(); + $iPlaceID = $oResult->iId; - if ($bIsTiger) { - $sSQL = "select place_id,partition, 'T' as osm_type, place_id as osm_id, 'place' as class, 'house' as type, null as admin_level, housenumber, null as street, postcode,"; + if ($oResult->iTable == Result::TABLE_TIGER) { + $sSQL = "select place_id,partition, 'T' as osm_type, place_id as osm_id, 'place' as class, 'house' as type, null as admin_level,"; + $sSQL .= $oResult->iHouseNumber.' as housenumber, postcode,'; $sSQL .= " 'us' as country_code, parent_place_id, null as linked_place_id, 30 as rank_address, 30 as rank_search,"; $sSQL .= " coalesce(null,0.75-(30::float/40)) as importance, null as indexed_status, null as indexed_date, null as wikipedia, 'us' as country_code, "; - $sSQL .= " get_address_by_language(place_id, housenumber, $sLanguagePrefArraySQL) as langaddress,"; + $sSQL .= " get_address_by_language(place_id,".$oResult->iHouseNumber.", $sLanguagePrefArraySQL) as langaddress,"; $sSQL .= " null as placename,"; $sSQL .= " null as ref,"; if ($this->bExtraTags) $sSQL .= " null as extra,"; if ($this->bNameDetails) $sSQL .= " null as names,"; - $sSQL .= " ST_X(point) as lon, ST_Y(point) as lat from (select *, ST_LineInterpolatePoint(linegeo, (housenumber-startnumber::float)/(endnumber-startnumber)::float) as point from "; - $sSQL .= " (select *, "; - $sSQL .= " CASE WHEN interpolationtype='odd' THEN floor((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2+1"; - $sSQL .= " WHEN interpolationtype='even' THEN ((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2"; - $sSQL .= " WHEN interpolationtype='all' THEN (".$fInterpolFraction."*(endnumber-startnumber)+startnumber)::int"; - $sSQL .= " END as housenumber"; - $sSQL .= " from location_property_tiger where place_id = ".$iPlaceID.") as blub1) as blub2"; - } elseif ($bIsInterpolation) { - $sSQL = "select place_id, partition, 'W' as osm_type, osm_id, 'place' as class, 'house' as type, null admin_level, housenumber, null as street, postcode,"; + $sSQL .= " ST_X(point) as lon, ST_Y(point) as lat"; + $sSQL .= " FROM (select *, ST_LineInterpolatePoint(linegeo, (".$oResult->iHouseNumber."-startnumber::float)/(endnumber-startnumber)::float) as point "; + $sSQL .= " FROM location_property_tiger where place_id = ".$iPlaceID.") as blub"; + } elseif ($oResult->iTable == Result::TABLE_OSMLINE) { + $sSQL = "select place_id, partition, 'W' as osm_type, osm_id, 'place' as class, 'house' as type, null admin_level,"; + $sSQL .= $oResult->iHouseNumber.' as housenumber, postcode,'; $sSQL .= " country_code, parent_place_id, null as linked_place_id, 30 as rank_address, 30 as rank_search,"; $sSQL .= " (0.75-(30::float/40)) as importance, null as indexed_status, null as indexed_date, null as wikipedia, country_code, "; - $sSQL .= " get_address_by_language(place_id, housenumber, $sLanguagePrefArraySQL) as langaddress,"; + $sSQL .= " get_address_by_language(place_id,".$oResult->iHouseNumber.", $sLanguagePrefArraySQL) as langaddress,"; $sSQL .= " null as placename,"; $sSQL .= " null as ref,"; if ($this->bExtraTags) $sSQL .= " null as extra,"; if ($this->bNameDetails) $sSQL .= " null as names,"; - $sSQL .= " ST_X(point) as lon, ST_Y(point) as lat from (select *, ST_LineInterpolatePoint(linegeo, (housenumber-startnumber::float)/(endnumber-startnumber)::float) as point from "; - $sSQL .= " (select *, "; - $sSQL .= " CASE WHEN interpolationtype='odd' THEN floor((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2+1"; - $sSQL .= " WHEN interpolationtype='even' THEN ((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2"; - $sSQL .= " WHEN interpolationtype='all' THEN (".$fInterpolFraction."*(endnumber-startnumber)+startnumber)::int"; - $sSQL .= " END as housenumber"; - $sSQL .= " from location_property_osmline where place_id = ".$iPlaceID.") as blub1) as blub2"; + $sSQL .= " ST_X(point) as lon, ST_Y(point) as lat "; + $sSQL .= " FROM (select *, ST_LineInterpolatePoint(linegeo, (".$oResult->iHouseNumber."-startnumber::float)/(endnumber-startnumber)::float) as point "; + $sSQL .= " from location_property_osmline where place_id = ".$iPlaceID.") as blub"; // testcase: interpolationtype=odd, startnumber=1000, endnumber=1006, fInterpolFraction=1 => housenumber=1007 => error in st_lineinterpolatepoint // but this will never happen, because if the searched point is that close to the endnumber, the endnumber house will be directly taken from placex (in ReverseGeocode.php line 220) // and not interpolated } else { $sSQL = "select placex.place_id, partition, osm_type, osm_id, class,"; - $sSQL .= " type, admin_level, housenumber, street, postcode, country_code,"; + $sSQL .= " type, admin_level, housenumber, postcode, country_code,"; $sSQL .= " parent_place_id, linked_place_id, rank_address, rank_search, "; $sSQL .= " coalesce(importance,0.75-(rank_search::float/40)) as importance, indexed_status, indexed_date, wikipedia, country_code, "; $sSQL .= " get_address_by_language(place_id, -1, $sLanguagePrefArraySQL) as langaddress,"; @@ -158,8 +153,7 @@ class PlaceLookup if ($this->bAddressDetails) { // to get addressdetails for tiger data, the housenumber is needed - $iHousenumber = ($bIsTiger || $bIsInterpolation) ? $aPlace['housenumber'] : -1; - $aPlace['aAddress'] = $this->getAddressNames($aPlace['place_id'], $iHousenumber); + $aPlace['aAddress'] = $this->getAddressNames($aPlace['place_id'], $oResult->iHouseNumber); } if ($this->bExtraTags) {