X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/0e4f80bf1bcedcb595a844ff7e1b6fd106ca2356..301fd7f7e8d97755849e26427c12eed070f21b5f:/website/details.php diff --git a/website/details.php b/website/details.php old mode 100755 new mode 100644 index c9e86312..91440b54 --- a/website/details.php +++ b/website/details.php @@ -1,19 +1,17 @@ getSet('format', array('html', 'json'), 'html'); +$sOutputFormat = $oParams->getSet('format', array('json'), 'json'); +set_exception_handler_by_format($sOutputFormat); $aLangPrefOrder = $oParams->getPreferredLanguages(); -$sLanguagePrefArraySQL = 'ARRAY['.join(',', array_map('getDBQuoted', $aLangPrefOrder)).']'; $sPlaceId = $oParams->getString('place_id'); $sOsmType = $oParams->getSet('osmtype', array('N', 'W', 'R')); @@ -21,26 +19,37 @@ $iOsmId = $oParams->getInt('osmid', -1); $sClass = $oParams->getString('class'); $bIncludeKeywords = $oParams->getBool('keywords', false); -$bIncludeAddressDetails = $oParams->getBool('addressdetails', $sOutputFormat == 'html'); +$bIncludeAddressDetails = $oParams->getBool('addressdetails', false); $bIncludeLinkedPlaces = $oParams->getBool('linkedplaces', true); -$bIncludeHierarchy = $oParams->getBool('hierarchy', $sOutputFormat == 'html'); +$bIncludeHierarchy = $oParams->getBool('hierarchy', false); $bGroupHierarchy = $oParams->getBool('group_hierarchy', false); -$bIncludePolygonAsGeoJSON = $oParams->getBool('polygon_geojson', $sOutputFormat == 'html'); +$bIncludePolygonAsGeoJSON = $oParams->getBool('polygon_geojson', false); -$oDB =& getDB(); +$oDB = new Nominatim\DB(CONST_Database_DSN); +$oDB->connect(); + +$sLanguagePrefArraySQL = $oDB->getArraySQL($oDB->getDBQuotedList($aLangPrefOrder)); if ($sOsmType && $iOsmId > 0) { - $sSQL = sprintf( - "SELECT place_id FROM placex WHERE osm_type='%s' AND osm_id=%d", - $sOsmType, - $iOsmId - ); + $sSQL = 'SELECT place_id FROM placex WHERE osm_type = :type AND osm_id = :id'; + $aSQLParams = array(':type' => $sOsmType, ':id' => $iOsmId); // osm_type and osm_id are not unique enough if ($sClass) { - $sSQL .= " AND class='".$sClass."'"; + $sSQL .= ' AND class= :class'; + $aSQLParams[':class'] = $sClass; } $sSQL .= ' ORDER BY class ASC'; - $sPlaceId = chksql($oDB->getOne($sSQL)); + $sPlaceId = $oDB->getOne($sSQL, $aSQLParams); + + + // Nothing? Maybe it's an interpolation. + // XXX Simply returns the first parent street it finds. It should + // get a house number and get the right interpolation. + if (!$sPlaceId && $sOsmType == 'W' && (!$sClass || $sClass == 'place')) { + $sSQL = 'SELECT place_id FROM location_property_osmline' + .' WHERE osm_id = :id LIMIT 1'; + $sPlaceId = $oDB->getOne($sSQL, array(':id' => $iOsmId)); + } // Be nice about our error messages for broken geometry @@ -55,12 +64,12 @@ if ($sOsmType && $iOsmId > 0) { $sSQL .= ' ST_AsText(prevgeometry) AS prevgeom, '; $sSQL .= ' ST_AsText(newgeometry) AS newgeom'; $sSQL .= ' FROM import_polygon_error '; - $sSQL .= " WHERE osm_type = '".$sOsmType."'"; - $sSQL .= ' AND osm_id = '.$iOsmId; + $sSQL .= ' WHERE osm_type = :type'; + $sSQL .= ' AND osm_id = :id'; $sSQL .= ' ORDER BY updated DESC'; $sSQL .= ' LIMIT 1'; - $aPointDetails = chksql($oDB->getRow($sSQL)); - if (!PEAR::isError($aPointDetails) && $aPointDetails) { + $aPointDetails = $oDB->getRow($sSQL, array(':type' => $sOsmType, ':id' => $iOsmId)); + if ($aPointDetails) { if (preg_match('/\[(-?\d+\.\d+) (-?\d+\.\d+)\]/', $aPointDetails['errormessage'], $aMatches)) { $aPointDetails['error_x'] = $aMatches[1]; $aPointDetails['error_y'] = $aMatches[2]; @@ -68,32 +77,32 @@ if ($sOsmType && $iOsmId > 0) { $aPointDetails['error_x'] = 0; $aPointDetails['error_y'] = 0; } - include(CONST_BasePath.'/lib/template/details-error-'.$sOutputFormat.'.php'); + include(CONST_LibDir.'/template/details-error-'.$sOutputFormat.'.php'); exit; } } } -if (!$sPlaceId) userError('Please select a place id'); +if ($sPlaceId === false) userError('Please select a place id'); $iPlaceID = (int)$sPlaceId; if (CONST_Use_US_Tiger_Data) { - $iParentPlaceID = chksql($oDB->getOne('SELECT parent_place_id FROM location_property_tiger WHERE place_id = '.$iPlaceID)); + $iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_property_tiger WHERE place_id = '.$iPlaceID); if ($iParentPlaceID) $iPlaceID = $iParentPlaceID; } // interpolated house numbers -$iParentPlaceID = chksql($oDB->getOne('SELECT parent_place_id FROM location_property_osmline WHERE place_id = '.$iPlaceID)); +$iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_property_osmline WHERE place_id = '.$iPlaceID); if ($iParentPlaceID) $iPlaceID = $iParentPlaceID; // artificial postcodes -$iParentPlaceID = chksql($oDB->getOne('SELECT parent_place_id FROM location_postcode WHERE place_id = '.$iPlaceID)); +$iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_postcode WHERE place_id = '.$iPlaceID); if ($iParentPlaceID) $iPlaceID = $iParentPlaceID; if (CONST_Use_Aux_Location_data) { - $iParentPlaceID = chksql($oDB->getOne('SELECT parent_place_id FROM location_property_aux WHERE place_id = '.$iPlaceID)); + $iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_property_aux WHERE place_id = '.$iPlaceID); if ($iParentPlaceID) $iPlaceID = $iParentPlaceID; } @@ -107,7 +116,6 @@ $sSQL .= ' ROUND(EXTRACT(epoch FROM indexed_date)) AS indexed_epoch,'; $sSQL .= ' parent_place_id, '; $sSQL .= ' rank_address, '; $sSQL .= ' rank_search, '; -$sSQL .= ' get_searchrank_label(rank_search) AS rank_search_label,'; // only used in HTML output $sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) AS localname, "; $sSQL .= " ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') AS isarea, "; $sSQL .= ' ST_y(centroid) AS lat, '; @@ -129,38 +137,29 @@ if ($bIncludePolygonAsGeoJSON) { $sSQL .= ' FROM placex '; $sSQL .= " WHERE place_id = $iPlaceID"; -$aPointDetails = chksql($oDB->getRow($sSQL), 'Could not get details of place object.'); +$aPointDetails = $oDB->getRow($sSQL, null, 'Could not get details of place object.'); if (!$aPointDetails) { userError('Unknown place id.'); } $aPointDetails['localname'] = $aPointDetails['localname']?$aPointDetails['localname']:$aPointDetails['housenumber']; -$aPointDetails['icon'] = Nominatim\ClassTypes\getProperty($aPointDetails, 'icon', false); +$aPointDetails['rank_search_label'] = getSearchRankLabel($aPointDetails['rank_search']); // only used in HTML format // Get all alternative names (languages, etc) $sSQL = 'SELECT (each(name)).key,(each(name)).value FROM placex '; $sSQL .= "WHERE place_id = $iPlaceID ORDER BY (each(name)).key"; $aPointDetails['aNames'] = $oDB->getAssoc($sSQL); -if (PEAR::isError($aPointDetails['aNames'])) { // possible timeout - $aPointDetails['aNames'] = array(); -} // Address tags $sSQL = 'SELECT (each(address)).key as key,(each(address)).value FROM placex '; $sSQL .= "WHERE place_id = $iPlaceID ORDER BY key"; $aPointDetails['aAddressTags'] = $oDB->getAssoc($sSQL); -if (PEAR::isError($aPointDetails['aAddressTags'])) { // possible timeout - $aPointDetails['aAddressTags'] = array(); -} // Extra tags $sSQL = 'SELECT (each(extratags)).key,(each(extratags)).value FROM placex '; $sSQL .= "WHERE place_id = $iPlaceID ORDER BY (each(extratags)).key"; $aPointDetails['aExtraTags'] = $oDB->getAssoc($sSQL); -if (PEAR::isError($aPointDetails['aExtraTags'])) { // possible timeout - $aPointDetails['aExtraTags'] = array(); -} // Address $aAddressLines = false; @@ -192,9 +191,6 @@ if ($bIncludeLinkedPlaces) { $sSQL .= " get_name_by_language(name, $sLanguagePrefArraySQL), "; $sSQL .= ' housenumber'; $aLinkedLines = $oDB->getAll($sSQL); - if (PEAR::isError($aLinkedLines)) { // possible timeout - $aLinkedLines = array(); - } } // All places this is an imediate parent of @@ -226,42 +222,29 @@ if ($bIncludeHierarchy) { $sSQL .= ' localname, '; $sSQL .= ' housenumber'; $aHierarchyLines = $oDB->getAll($sSQL); - if (PEAR::isError($aHierarchyLines)) { // possible timeout - $aHierarchyLines = array(); - } } $aPlaceSearchNameKeywords = false; $aPlaceSearchAddressKeywords = false; if ($bIncludeKeywords) { $sSQL = "SELECT * FROM search_name WHERE place_id = $iPlaceID"; - $aPlaceSearchName = $oDB->getRow($sSQL); // can be null - if (!$aPlaceSearchName || PEAR::isError($aPlaceSearchName)) { // possible timeout - $aPlaceSearchName = array(); - } + $aPlaceSearchName = $oDB->getRow($sSQL); if (!empty($aPlaceSearchName)) { - $sSQL = 'SELECT * FROM word WHERE word_id in ('.substr($aPlaceSearchName['name_vector'], 1, -1).')'; - $aPlaceSearchNameKeywords = $oDB->getAll($sSQL); - if (PEAR::isError($aPlaceSearchNameKeywords)) { // possible timeout - $aPlaceSearchNameKeywords = array(); + $sWordIds = substr($aPlaceSearchName['name_vector'], 1, -1); + if (!empty($sWordIds)) { + $sSQL = 'SELECT * FROM word WHERE word_id in ('.$sWordIds.')'; + $aPlaceSearchNameKeywords = $oDB->getAll($sSQL); } - $sSQL = 'SELECT * FROM word WHERE word_id in ('.substr($aPlaceSearchName['nameaddress_vector'], 1, -1).')'; - $aPlaceSearchAddressKeywords = $oDB->getAll($sSQL); - if (PEAR::isError($aPlaceSearchAddressKeywords)) { // possible timeout - $aPlaceSearchAddressKeywords = array(); + $sWordIds = substr($aPlaceSearchName['nameaddress_vector'], 1, -1); + if (!empty($sWordIds)) { + $sSQL = 'SELECT * FROM word WHERE word_id in ('.$sWordIds.')'; + $aPlaceSearchAddressKeywords = $oDB->getAll($sSQL); } } } logEnd($oDB, $hLog, 1); -if ($sOutputFormat=='html') { - $sSQL = "SELECT TO_CHAR(lastimportdate,'YYYY/MM/DD HH24:MI')||' GMT' FROM import_status LIMIT 1"; - $sDataDate = chksql($oDB->getOne($sSQL)); - $sTileURL = CONST_Map_Tile_URL; - $sTileAttribution = CONST_Map_Tile_Attribution; -} - -include(CONST_BasePath.'/lib/template/details-'.$sOutputFormat.'.php'); +include(CONST_LibDir.'/template/details-'.$sOutputFormat.'.php');