$oParams = new Nominatim\ParameterParser();
-$sOutputFormat = 'html';
+$sOutputFormat = $oParams->getSet('format', array('html', 'json'), 'html');
+
$aLangPrefOrder = $oParams->getPreferredLanguages();
$sLanguagePrefArraySQL = 'ARRAY['.join(',', array_map('getDBQuoted', $aLangPrefOrder)).']';
$sPlaceId = $oParams->getString('place_id');
$sOsmType = $oParams->getSet('osmtype', array('N', 'W', 'R'));
$iOsmId = $oParams->getInt('osmid', -1);
+$sClass = $oParams->getString('class');
+
+$bIncludeAddressDetails = $oParams->getBool('addressdetails', $sOutputFormat == 'html');
+$bIncludeLinkedPlaces = $oParams->getBool('linkedplaces', $sOutputFormat == 'html');
+$bIncludeChildPlaces = $oParams->getBool('childplaces', $sOutputFormat == 'html');
+$bGroupParents = $oParams->getBool('group_parents', false);
$oDB =& getDB();
if ($sOsmType && $iOsmId > 0) {
$sSQL = sprintf(
- "SELECT place_id FROM placex WHERE osm_type='%s' AND osm_id=%d ORDER BY type='postcode' ASC",
+ "SELECT place_id FROM placex WHERE osm_type='%s' AND osm_id=%d",
$sOsmType,
$iOsmId
);
+ // osm_type and osm_id are not unique enough
+ if ($sClass) {
+ $sSQL .= " AND class='".$sClass."'";
+ }
+ $sSQL .= ' ORDER BY class ASC';
$sPlaceId = chksql($oDB->getOne($sSQL));
// Be nice about our error messages for broken geometry
}
// Get all alternative names (languages, etc)
-$sSQL = "SELECT (each(name)).key,(each(name)).value FROM placex WHERE place_id = $iPlaceID ORDER BY (each(name)).key";
+$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'] = [];
}
// Address tags
-$sSQL = "SELECT (each(address)).key as key,(each(address)).value FROM placex WHERE place_id = $iPlaceID ORDER BY key";
+$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'] = [];
}
// Extra tags
-$sSQL = "SELECT (each(extratags)).key,(each(extratags)).value FROM placex WHERE place_id = $iPlaceID ORDER BY (each(extratags)).key";
+$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'] = [];
}
// Address
-$aAddressLines = getAddressDetails($oDB, $sLanguagePrefArraySQL, $iPlaceID, $aPointDetails['country_code'], -1, true);
+$aAddressLines = false;
+if ($bIncludeAddressDetails) {
+ $aAddressLines = getAddressDetails(
+ $oDB,
+ $sLanguagePrefArraySQL,
+ $iPlaceID,
+ $aPointDetails['country_code'],
+ -1,
+ true
+ );
+}
// Linked places
-$sSQL = 'SELECT placex.place_id, osm_type, osm_id, class, type, housenumber,';
-$sSQL .= ' admin_level, rank_address, ';
-$sSQL .= " ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') AS isarea,";
-$sSQL .= " ST_DistanceSpheroid(geometry, placegeometry, 'SPHEROID[\"WGS 84\",6378137,298.257223563, AUTHORITY[\"EPSG\",\"7030\"]]') AS distance, ";
-$sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) AS localname, ";
-$sSQL .= ' length(name::text) AS namelength ';
-$sSQL .= ' FROM ';
-$sSQL .= ' placex, ';
-$sSQL .= ' ( ';
-$sSQL .= ' SELECT centroid AS placegeometry ';
-$sSQL .= ' FROM placex ';
-$sSQL .= " WHERE place_id = $iPlaceID ";
-$sSQL .= ' ) AS x';
-$sSQL .= " WHERE linked_place_id = $iPlaceID";
-$sSQL .= ' ORDER BY ';
-$sSQL .= ' rank_address ASC, ';
-$sSQL .= ' rank_search ASC, ';
-$sSQL .= " get_name_by_language(name, $sLanguagePrefArraySQL), ";
-$sSQL .= ' housenumber';
-$aLinkedLines = $oDB->getAll($sSQL);
-if (PEAR::isError($aLinkedLines)) { // possible timeout
- $aLinkedLines = [];
+$aLinkedLines = false;
+if ($bIncludeLinkedPlaces) {
+ $sSQL = 'SELECT placex.place_id, osm_type, osm_id, class, type, housenumber,';
+ $sSQL .= ' admin_level, rank_address, ';
+ $sSQL .= " ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') AS isarea,";
+ $sSQL .= " ST_DistanceSpheroid(geometry, placegeometry, 'SPHEROID[\"WGS 84\",6378137,298.257223563, AUTHORITY[\"EPSG\",\"7030\"]]') AS distance, ";
+ $sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) AS localname, ";
+ $sSQL .= ' length(name::text) AS namelength ';
+ $sSQL .= ' FROM ';
+ $sSQL .= ' placex, ';
+ $sSQL .= ' ( ';
+ $sSQL .= ' SELECT centroid AS placegeometry ';
+ $sSQL .= ' FROM placex ';
+ $sSQL .= " WHERE place_id = $iPlaceID ";
+ $sSQL .= ' ) AS x';
+ $sSQL .= " WHERE linked_place_id = $iPlaceID";
+ $sSQL .= ' ORDER BY ';
+ $sSQL .= ' rank_address ASC, ';
+ $sSQL .= ' rank_search ASC, ';
+ $sSQL .= " get_name_by_language(name, $sLanguagePrefArraySQL), ";
+ $sSQL .= ' housenumber';
+ $aLinkedLines = $oDB->getAll($sSQL);
+ if (PEAR::isError($aLinkedLines)) { // possible timeout
+ $aLinkedLines = [];
+ }
}
// All places this is an imediate parent of
-$sSQL = 'SELECT obj.place_id, osm_type, osm_id, class, type, housenumber,';
-$sSQL .= " admin_level, rank_address, ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') AS isarea,";
-$sSQL .= " ST_DistanceSpheroid(geometry, placegeometry, 'SPHEROID[\"WGS 84\",6378137,298.257223563, AUTHORITY[\"EPSG\",\"7030\"]]') AS distance, ";
-$sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) AS localname, ";
-$sSQL .= ' length(name::text) AS namelength ';
-$sSQL .= ' FROM ';
-$sSQL .= ' ( ';
-$sSQL .= ' SELECT placex.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, rank_search, geometry, name ';
-$sSQL .= ' FROM placex ';
-$sSQL .= " WHERE parent_place_id = $iPlaceID ";
-$sSQL .= ' ORDER BY ';
-$sSQL .= ' rank_address ASC, ';
-$sSQL .= ' rank_search ASC ';
-$sSQL .= ' LIMIT 500 ';
-$sSQL .= ' ) AS obj,';
-$sSQL .= ' ( ';
-$sSQL .= ' SELECT centroid AS placegeometry ';
-$sSQL .= ' FROM placex ';
-$sSQL .= " WHERE place_id = $iPlaceID ";
-$sSQL .= ' ) AS x';
-$sSQL .= ' ORDER BY ';
-$sSQL .= ' rank_address ASC, ';
-$sSQL .= ' rank_search ASC, ';
-$sSQL .= ' localname, ';
-$sSQL .= ' housenumber';
-$aParentOfLines = $oDB->getAll($sSQL);
-if (PEAR::isError($aParentOfLines)) { // possible timeout
- $aParentOfLines = [];
+$aParentOfLines = false;
+if ($bIncludeChildPlaces) {
+ $sSQL = 'SELECT obj.place_id, osm_type, osm_id, class, type, housenumber,';
+ $sSQL .= " admin_level, rank_address, ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') AS isarea,";
+ $sSQL .= " ST_DistanceSpheroid(geometry, placegeometry, 'SPHEROID[\"WGS 84\",6378137,298.257223563, AUTHORITY[\"EPSG\",\"7030\"]]') AS distance, ";
+ $sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) AS localname, ";
+ $sSQL .= ' length(name::text) AS namelength ';
+ $sSQL .= ' FROM ';
+ $sSQL .= ' ( ';
+ $sSQL .= ' SELECT placex.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, rank_search, geometry, name ';
+ $sSQL .= ' FROM placex ';
+ $sSQL .= " WHERE parent_place_id = $iPlaceID ";
+ $sSQL .= ' ORDER BY ';
+ $sSQL .= ' rank_address ASC, ';
+ $sSQL .= ' rank_search ASC ';
+ $sSQL .= ' LIMIT 500 ';
+ $sSQL .= ' ) AS obj,';
+ $sSQL .= ' ( ';
+ $sSQL .= ' SELECT centroid AS placegeometry ';
+ $sSQL .= ' FROM placex ';
+ $sSQL .= " WHERE place_id = $iPlaceID ";
+ $sSQL .= ' ) AS x';
+ $sSQL .= ' ORDER BY ';
+ $sSQL .= ' rank_address ASC, ';
+ $sSQL .= ' rank_search ASC, ';
+ $sSQL .= ' localname, ';
+ $sSQL .= ' housenumber';
+ $aParentOfLines = $oDB->getAll($sSQL);
+ if (PEAR::isError($aParentOfLines)) { // possible timeout
+ $aParentOfLines = [];
+ }
}
$aPlaceSearchNameKeywords = false;
$aPlaceSearchAddressKeywords = false;
if ($oParams->getBool('keywords')) {
$sSQL = "SELECT * FROM search_name WHERE place_id = $iPlaceID";
- $aPlaceSearchName = $oDB->getRow($sSQL);
- if (PEAR::isError($aPlaceSearchName)) { // possible timeout
+ $aPlaceSearchName = $oDB->getRow($sSQL); // can be null
+ if (!$aPlaceSearchName || PEAR::isError($aPlaceSearchName)) { // possible timeout
$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 = [];
- }
+ 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 = [];
+ }
- $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 = [];
+ $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 = [];
+ }
}
}
logEnd($oDB, $hLog, 1);
if ($sOutputFormat=='html') {
- $sSQL = "SELECT TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' FROM import_status LIMIT 1";
+ $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;