forked from hans/Nominatim
rename lib to lib-php
This commit is contained in:
28
lib-php/website/deletable.php
Normal file
28
lib-php/website/deletable.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
require_once(CONST_LibDir.'/init-website.php');
|
||||
require_once(CONST_LibDir.'/log.php');
|
||||
require_once(CONST_LibDir.'/output.php');
|
||||
ini_set('memory_limit', '200M');
|
||||
|
||||
$oParams = new Nominatim\ParameterParser();
|
||||
$sOutputFormat = $oParams->getSet('format', array('json'), 'json');
|
||||
set_exception_handler_by_format($sOutputFormat);
|
||||
|
||||
$oDB = new Nominatim\DB(CONST_Database_DSN);
|
||||
$oDB->connect();
|
||||
|
||||
$sSQL = 'select placex.place_id, country_code,';
|
||||
$sSQL .= " name->'name' as name, i.* from placex, import_polygon_delete i";
|
||||
$sSQL .= ' where placex.osm_id = i.osm_id and placex.osm_type = i.osm_type';
|
||||
$sSQL .= ' and placex.class = i.class and placex.type = i.type';
|
||||
$aPolygons = $oDB->getAll($sSQL, null, 'Could not get list of deleted OSM elements.');
|
||||
|
||||
if (CONST_Debug) {
|
||||
var_dump($aPolygons);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($sOutputFormat == 'json') {
|
||||
javascript_renderData($aPolygons);
|
||||
}
|
||||
250
lib-php/website/details.php
Normal file
250
lib-php/website/details.php
Normal file
@@ -0,0 +1,250 @@
|
||||
<?php
|
||||
|
||||
require_once(CONST_LibDir.'/init-website.php');
|
||||
require_once(CONST_LibDir.'/log.php');
|
||||
require_once(CONST_LibDir.'/output.php');
|
||||
require_once(CONST_LibDir.'/AddressDetails.php');
|
||||
ini_set('memory_limit', '200M');
|
||||
|
||||
$oParams = new Nominatim\ParameterParser();
|
||||
|
||||
$sOutputFormat = $oParams->getSet('format', array('json'), 'json');
|
||||
set_exception_handler_by_format($sOutputFormat);
|
||||
|
||||
$aLangPrefOrder = $oParams->getPreferredLanguages();
|
||||
|
||||
$sPlaceId = $oParams->getString('place_id');
|
||||
$sOsmType = $oParams->getSet('osmtype', array('N', 'W', 'R'));
|
||||
$iOsmId = $oParams->getInt('osmid', -1);
|
||||
$sClass = $oParams->getString('class');
|
||||
|
||||
$bIncludeKeywords = $oParams->getBool('keywords', false);
|
||||
$bIncludeAddressDetails = $oParams->getBool('addressdetails', false);
|
||||
$bIncludeLinkedPlaces = $oParams->getBool('linkedplaces', true);
|
||||
$bIncludeHierarchy = $oParams->getBool('hierarchy', false);
|
||||
$bGroupHierarchy = $oParams->getBool('group_hierarchy', false);
|
||||
$bIncludePolygonAsGeoJSON = $oParams->getBool('polygon_geojson', false);
|
||||
|
||||
$oDB = new Nominatim\DB(CONST_Database_DSN);
|
||||
$oDB->connect();
|
||||
|
||||
$sLanguagePrefArraySQL = $oDB->getArraySQL($oDB->getDBQuotedList($aLangPrefOrder));
|
||||
|
||||
if ($sOsmType && $iOsmId > 0) {
|
||||
$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= :class';
|
||||
$aSQLParams[':class'] = $sClass;
|
||||
}
|
||||
$sSQL .= ' ORDER BY class ASC';
|
||||
$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
|
||||
|
||||
if (!$sPlaceId) {
|
||||
$sSQL = 'SELECT ';
|
||||
$sSQL .= ' osm_type, ';
|
||||
$sSQL .= ' osm_id, ';
|
||||
$sSQL .= ' errormessage, ';
|
||||
$sSQL .= ' class, ';
|
||||
$sSQL .= ' type, ';
|
||||
$sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) AS localname,";
|
||||
$sSQL .= ' ST_AsText(prevgeometry) AS prevgeom, ';
|
||||
$sSQL .= ' ST_AsText(newgeometry) AS newgeom';
|
||||
$sSQL .= ' FROM import_polygon_error ';
|
||||
$sSQL .= ' WHERE osm_type = :type';
|
||||
$sSQL .= ' AND osm_id = :id';
|
||||
$sSQL .= ' ORDER BY updated DESC';
|
||||
$sSQL .= ' LIMIT 1';
|
||||
$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];
|
||||
} else {
|
||||
$aPointDetails['error_x'] = 0;
|
||||
$aPointDetails['error_y'] = 0;
|
||||
}
|
||||
include(CONST_LibDir.'/template/details-error-'.$sOutputFormat.'.php');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ($sPlaceId === false) userError('Please select a place id');
|
||||
|
||||
$iPlaceID = (int)$sPlaceId;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
// interpolated house numbers
|
||||
$iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_property_osmline WHERE place_id = '.$iPlaceID);
|
||||
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 (CONST_Use_Aux_Location_data) {
|
||||
$iParentPlaceID = $oDB->getOne('SELECT parent_place_id FROM location_property_aux WHERE place_id = '.$iPlaceID);
|
||||
if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
|
||||
}
|
||||
|
||||
$hLog = logStart($oDB, 'details', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
|
||||
|
||||
// Get the details for this point
|
||||
$sSQL = 'SELECT place_id, osm_type, osm_id, class, type, name, admin_level,';
|
||||
$sSQL .= ' housenumber, postcode, country_code,';
|
||||
$sSQL .= ' importance, wikipedia,';
|
||||
$sSQL .= ' ROUND(EXTRACT(epoch FROM indexed_date)) AS indexed_epoch,';
|
||||
$sSQL .= ' parent_place_id, ';
|
||||
$sSQL .= ' rank_address, ';
|
||||
$sSQL .= ' rank_search, ';
|
||||
$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, ';
|
||||
$sSQL .= ' ST_x(centroid) AS lon, ';
|
||||
$sSQL .= ' CASE ';
|
||||
$sSQL .= ' WHEN importance = 0 OR importance IS NULL ';
|
||||
$sSQL .= ' THEN 0.75-(rank_search::float/40) ';
|
||||
$sSQL .= ' ELSE importance ';
|
||||
$sSQL .= ' END as calculated_importance, ';
|
||||
if ($bIncludePolygonAsGeoJSON) {
|
||||
$sSQL .= ' ST_AsGeoJSON(CASE ';
|
||||
$sSQL .= ' WHEN ST_NPoints(geometry) > 5000 ';
|
||||
$sSQL .= ' THEN ST_SimplifyPreserveTopology(geometry, 0.0001) ';
|
||||
$sSQL .= ' ELSE geometry ';
|
||||
$sSQL .= ' END) as asgeojson';
|
||||
} else {
|
||||
$sSQL .= ' ST_AsGeoJSON(centroid) as asgeojson';
|
||||
}
|
||||
$sSQL .= ' FROM placex ';
|
||||
$sSQL .= " WHERE place_id = $iPlaceID";
|
||||
|
||||
$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['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);
|
||||
|
||||
// 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);
|
||||
|
||||
// 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);
|
||||
|
||||
// Address
|
||||
$aAddressLines = false;
|
||||
if ($bIncludeAddressDetails) {
|
||||
$oDetails = new Nominatim\AddressDetails($oDB, $iPlaceID, -1, $sLanguagePrefArraySQL);
|
||||
$aAddressLines = $oDetails->getAddressDetails(true);
|
||||
}
|
||||
|
||||
// Linked places
|
||||
$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);
|
||||
}
|
||||
|
||||
// All places this is an imediate parent of
|
||||
$aHierarchyLines = false;
|
||||
if ($bIncludeHierarchy) {
|
||||
$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';
|
||||
$aHierarchyLines = $oDB->getAll($sSQL);
|
||||
}
|
||||
|
||||
$aPlaceSearchNameKeywords = false;
|
||||
$aPlaceSearchAddressKeywords = false;
|
||||
if ($bIncludeKeywords) {
|
||||
$sSQL = "SELECT * FROM search_name WHERE place_id = $iPlaceID";
|
||||
$aPlaceSearchName = $oDB->getRow($sSQL);
|
||||
|
||||
if (!empty($aPlaceSearchName)) {
|
||||
$sWordIds = substr($aPlaceSearchName['name_vector'], 1, -1);
|
||||
if (!empty($sWordIds)) {
|
||||
$sSQL = 'SELECT * FROM word WHERE word_id in ('.$sWordIds.')';
|
||||
$aPlaceSearchNameKeywords = $oDB->getAll($sSQL);
|
||||
}
|
||||
|
||||
$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);
|
||||
|
||||
include(CONST_LibDir.'/template/details-'.$sOutputFormat.'.php');
|
||||
87
lib-php/website/lookup.php
Normal file
87
lib-php/website/lookup.php
Normal file
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
require_once(CONST_LibDir.'/init-website.php');
|
||||
require_once(CONST_LibDir.'/log.php');
|
||||
require_once(CONST_LibDir.'/PlaceLookup.php');
|
||||
require_once(CONST_LibDir.'/output.php');
|
||||
ini_set('memory_limit', '200M');
|
||||
|
||||
$oParams = new Nominatim\ParameterParser();
|
||||
|
||||
// Format for output
|
||||
$sOutputFormat = $oParams->getSet('format', array('xml', 'json', 'jsonv2', 'geojson', 'geocodejson'), 'xml');
|
||||
set_exception_handler_by_format($sOutputFormat);
|
||||
|
||||
// Preferred language
|
||||
$aLangPrefOrder = $oParams->getPreferredLanguages();
|
||||
|
||||
$oDB = new Nominatim\DB(CONST_Database_DSN);
|
||||
$oDB->connect();
|
||||
|
||||
$hLog = logStart($oDB, 'place', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
|
||||
|
||||
$aSearchResults = array();
|
||||
$aCleanedQueryParts = array();
|
||||
|
||||
$oPlaceLookup = new Nominatim\PlaceLookup($oDB);
|
||||
$oPlaceLookup->loadParamArray($oParams);
|
||||
$oPlaceLookup->setIncludeAddressDetails($oParams->getBool('addressdetails', true));
|
||||
|
||||
$aOsmIds = explode(',', $oParams->getString('osm_ids', ''));
|
||||
|
||||
if (count($aOsmIds) > CONST_Places_Max_ID_count) {
|
||||
userError('Bulk User: Only ' . CONST_Places_Max_ID_count . ' ids are allowed in one request.');
|
||||
}
|
||||
|
||||
foreach ($aOsmIds as $sItem) {
|
||||
// Skip empty sItem
|
||||
if (empty($sItem)) continue;
|
||||
|
||||
$sType = $sItem[0];
|
||||
$iId = (int) substr($sItem, 1);
|
||||
if ($iId > 0 && ($sType == 'N' || $sType == 'W' || $sType == 'R')) {
|
||||
$aCleanedQueryParts[] = $sType . $iId;
|
||||
$oPlace = $oPlaceLookup->lookupOSMID($sType, $iId);
|
||||
if ($oPlace) {
|
||||
// we want to use the search-* output templates, so we need to fill
|
||||
// $aSearchResults and slightly change the (reverse search) oPlace
|
||||
// key names
|
||||
$oResult = $oPlace;
|
||||
unset($oResult['aAddress']);
|
||||
if (isset($oPlace['aAddress'])) $oResult['address'] = $oPlace['aAddress'];
|
||||
if ($sOutputFormat != 'geocodejson') {
|
||||
unset($oResult['langaddress']);
|
||||
$oResult['name'] = $oPlace['langaddress'];
|
||||
}
|
||||
|
||||
$aOutlineResult = $oPlaceLookup->getOutlines(
|
||||
$oPlace['place_id'],
|
||||
$oPlace['lon'],
|
||||
$oPlace['lat'],
|
||||
Nominatim\ClassTypes\getDefRadius($oPlace)
|
||||
);
|
||||
|
||||
if ($aOutlineResult) {
|
||||
$oResult = array_merge($oResult, $aOutlineResult);
|
||||
}
|
||||
|
||||
$aSearchResults[] = $oResult;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (CONST_Debug) exit;
|
||||
|
||||
$sXmlRootTag = 'lookupresults';
|
||||
$sQuery = join(',', $aCleanedQueryParts);
|
||||
// we initialize these to avoid warnings in our logfile
|
||||
$sViewBox = '';
|
||||
$bShowPolygons = '';
|
||||
$aExcludePlaceIDs = array();
|
||||
$sMoreURL = '';
|
||||
|
||||
logEnd($oDB, $hLog, 1);
|
||||
|
||||
$sOutputTemplate = ($sOutputFormat == 'jsonv2') ? 'json' : $sOutputFormat;
|
||||
include(CONST_LibDir.'/template/search-'.$sOutputTemplate.'.php');
|
||||
51
lib-php/website/polygons.php
Normal file
51
lib-php/website/polygons.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
require_once(CONST_LibDir.'/init-website.php');
|
||||
require_once(CONST_LibDir.'/log.php');
|
||||
require_once(CONST_LibDir.'/output.php');
|
||||
ini_set('memory_limit', '200M');
|
||||
|
||||
$oParams = new Nominatim\ParameterParser();
|
||||
$sOutputFormat = $oParams->getSet('format', array('json'), 'json');
|
||||
set_exception_handler_by_format($sOutputFormat);
|
||||
|
||||
$iDays = $oParams->getInt('days', false);
|
||||
$bReduced = $oParams->getBool('reduced', false);
|
||||
$sClass = $oParams->getString('class', false);
|
||||
|
||||
$oDB = new Nominatim\DB(CONST_Database_DSN);
|
||||
$oDB->connect();
|
||||
|
||||
$iTotalBroken = (int) $oDB->getOne('SELECT count(*) FROM import_polygon_error');
|
||||
|
||||
$aPolygons = array();
|
||||
while ($iTotalBroken && empty($aPolygons)) {
|
||||
$sSQL = 'SELECT osm_type, osm_id, class, type, name->\'name\' as "name",';
|
||||
$sSQL .= 'country_code, errormessage, updated';
|
||||
$sSQL .= ' FROM import_polygon_error';
|
||||
|
||||
$aWhere = array();
|
||||
if ($iDays) {
|
||||
$aWhere[] = "updated > 'now'::timestamp - '".$iDays." day'::interval";
|
||||
$iDays++;
|
||||
}
|
||||
|
||||
if ($bReduced) $aWhere[] = "errormessage like 'Area reduced%'";
|
||||
if ($sClass) $sWhere[] = "class = '".pg_escape_string($sClass)."'";
|
||||
|
||||
if (!empty($aWhere)) {
|
||||
$sSQL .= ' WHERE '.join(' and ', $aWhere);
|
||||
}
|
||||
|
||||
$sSQL .= ' ORDER BY updated desc LIMIT 1000';
|
||||
$aPolygons = $oDB->getAll($sSQL);
|
||||
}
|
||||
|
||||
if (CONST_Debug) {
|
||||
var_dump($aPolygons);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($sOutputFormat == 'json') {
|
||||
javascript_renderData($aPolygons);
|
||||
}
|
||||
87
lib-php/website/reverse.php
Normal file
87
lib-php/website/reverse.php
Normal file
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
require_once(CONST_LibDir.'/init-website.php');
|
||||
require_once(CONST_LibDir.'/log.php');
|
||||
require_once(CONST_LibDir.'/PlaceLookup.php');
|
||||
require_once(CONST_LibDir.'/ReverseGeocode.php');
|
||||
require_once(CONST_LibDir.'/output.php');
|
||||
ini_set('memory_limit', '200M');
|
||||
|
||||
$oParams = new Nominatim\ParameterParser();
|
||||
|
||||
// Format for output
|
||||
$sOutputFormat = $oParams->getSet('format', array('xml', 'json', 'jsonv2', 'geojson', 'geocodejson'), 'xml');
|
||||
set_exception_handler_by_format($sOutputFormat);
|
||||
|
||||
// Preferred language
|
||||
$aLangPrefOrder = $oParams->getPreferredLanguages();
|
||||
|
||||
$oDB = new Nominatim\DB(CONST_Database_DSN);
|
||||
$oDB->connect();
|
||||
|
||||
$hLog = logStart($oDB, 'reverse', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
|
||||
|
||||
$oPlaceLookup = new Nominatim\PlaceLookup($oDB);
|
||||
$oPlaceLookup->loadParamArray($oParams);
|
||||
$oPlaceLookup->setIncludeAddressDetails($oParams->getBool('addressdetails', true));
|
||||
|
||||
$sOsmType = $oParams->getSet('osm_type', array('N', 'W', 'R'));
|
||||
$iOsmId = $oParams->getInt('osm_id', -1);
|
||||
$fLat = $oParams->getFloat('lat');
|
||||
$fLon = $oParams->getFloat('lon');
|
||||
$iZoom = $oParams->getInt('zoom', 18);
|
||||
|
||||
if ($sOsmType && $iOsmId > 0) {
|
||||
$aPlace = $oPlaceLookup->lookupOSMID($sOsmType, $iOsmId);
|
||||
} elseif ($fLat !== false && $fLon !== false) {
|
||||
$oReverseGeocode = new Nominatim\ReverseGeocode($oDB);
|
||||
$oReverseGeocode->setZoom($iZoom);
|
||||
|
||||
$oLookup = $oReverseGeocode->lookup($fLat, $fLon);
|
||||
|
||||
if ($oLookup) {
|
||||
$aPlaces = $oPlaceLookup->lookup(array($oLookup->iId => $oLookup));
|
||||
if (!empty($aPlaces)) {
|
||||
$aPlace = reset($aPlaces);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
userError('Need coordinates or OSM object to lookup.');
|
||||
}
|
||||
|
||||
if (isset($aPlace)) {
|
||||
$aOutlineResult = $oPlaceLookup->getOutlines(
|
||||
$aPlace['place_id'],
|
||||
$aPlace['lon'],
|
||||
$aPlace['lat'],
|
||||
Nominatim\ClassTypes\getDefRadius($aPlace),
|
||||
$fLat,
|
||||
$fLon
|
||||
);
|
||||
|
||||
if ($aOutlineResult) {
|
||||
$aPlace = array_merge($aPlace, $aOutlineResult);
|
||||
}
|
||||
} else {
|
||||
$aPlace = array();
|
||||
}
|
||||
|
||||
logEnd($oDB, $hLog, count($aPlace) ? 1 : 0);
|
||||
|
||||
if (CONST_Debug) {
|
||||
var_dump($aPlace);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($sOutputFormat == 'geocodejson') {
|
||||
$sQuery = $fLat.','.$fLon;
|
||||
if (isset($aPlace['place_id'])) {
|
||||
$fDistance = $oDB->getOne(
|
||||
'SELECT ST_Distance(ST_SetSRID(ST_Point(:lon,:lat),4326), centroid) FROM placex where place_id = :placeid',
|
||||
array(':lon' => $fLon, ':lat' => $fLat, ':placeid' => $aPlace['place_id'])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$sOutputTemplate = ($sOutputFormat == 'jsonv2') ? 'json' : $sOutputFormat;
|
||||
include(CONST_LibDir.'/template/address-'.$sOutputTemplate.'.php');
|
||||
83
lib-php/website/search.php
Normal file
83
lib-php/website/search.php
Normal file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
|
||||
require_once(CONST_LibDir.'/init-website.php');
|
||||
require_once(CONST_LibDir.'/log.php');
|
||||
require_once(CONST_LibDir.'/Geocode.php');
|
||||
require_once(CONST_LibDir.'/output.php');
|
||||
ini_set('memory_limit', '200M');
|
||||
|
||||
$oDB = new Nominatim\DB(CONST_Database_DSN);
|
||||
$oDB->connect();
|
||||
$oParams = new Nominatim\ParameterParser();
|
||||
|
||||
$oGeocode = new Nominatim\Geocode($oDB);
|
||||
|
||||
$aLangPrefOrder = $oParams->getPreferredLanguages();
|
||||
$oGeocode->setLanguagePreference($aLangPrefOrder);
|
||||
|
||||
// Format for output
|
||||
$sOutputFormat = $oParams->getSet('format', array('xml', 'json', 'jsonv2', 'geojson', 'geocodejson'), 'jsonv2');
|
||||
set_exception_handler_by_format($sOutputFormat);
|
||||
|
||||
$oGeocode->loadParamArray($oParams, null);
|
||||
|
||||
if (CONST_Search_BatchMode && isset($_GET['batch'])) {
|
||||
$aBatch = json_decode($_GET['batch'], true);
|
||||
$aBatchResults = array();
|
||||
foreach ($aBatch as $aBatchParams) {
|
||||
$oBatchGeocode = clone $oGeocode;
|
||||
$oBatchParams = new Nominatim\ParameterParser($aBatchParams);
|
||||
$oBatchGeocode->loadParamArray($oBatchParams);
|
||||
$oBatchGeocode->setQueryFromParams($oBatchParams);
|
||||
$aSearchResults = $oBatchGeocode->lookup();
|
||||
$aBatchResults[] = $aSearchResults;
|
||||
}
|
||||
include(CONST_LibDir.'/template/search-batch-json.php');
|
||||
exit;
|
||||
}
|
||||
|
||||
$oGeocode->setQueryFromParams($oParams);
|
||||
|
||||
if (!$oGeocode->getQueryString()
|
||||
&& isset($_SERVER['PATH_INFO'])
|
||||
&& strlen($_SERVER['PATH_INFO']) > 0
|
||||
&& $_SERVER['PATH_INFO'][0] == '/'
|
||||
) {
|
||||
$sQuery = substr(rawurldecode($_SERVER['PATH_INFO']), 1);
|
||||
|
||||
// reverse order of '/' separated string
|
||||
$aPhrases = explode('/', $sQuery);
|
||||
$aPhrases = array_reverse($aPhrases);
|
||||
$sQuery = join(', ', $aPhrases);
|
||||
$oGeocode->setQuery($sQuery);
|
||||
}
|
||||
|
||||
$hLog = logStart($oDB, 'search', $oGeocode->getQueryString(), $aLangPrefOrder);
|
||||
|
||||
$aSearchResults = $oGeocode->lookup();
|
||||
|
||||
logEnd($oDB, $hLog, count($aSearchResults));
|
||||
|
||||
$sQuery = $oGeocode->getQueryString();
|
||||
|
||||
$aMoreParams = $oGeocode->getMoreUrlParams();
|
||||
$aMoreParams['format'] = $sOutputFormat;
|
||||
if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
|
||||
$aMoreParams['accept-language'] = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
|
||||
}
|
||||
|
||||
if (isset($_SERVER['REQUEST_SCHEME'])
|
||||
&& isset($_SERVER['SERVER_NAME'])
|
||||
&& isset($_SERVER['DOCUMENT_URI'])
|
||||
) {
|
||||
$sMoreURL = $_SERVER['REQUEST_SCHEME'].'://'
|
||||
.$_SERVER['SERVER_NAME'].$_SERVER['DOCUMENT_URI'].'/?'
|
||||
.http_build_query($aMoreParams);
|
||||
} else {
|
||||
$sMoreURL = '/search.php'.http_build_query($aMoreParams);
|
||||
}
|
||||
|
||||
if (CONST_Debug) exit;
|
||||
|
||||
$sOutputTemplate = ($sOutputFormat == 'jsonv2') ? 'json' : $sOutputFormat;
|
||||
include(CONST_LibDir.'/template/search-'.$sOutputTemplate.'.php');
|
||||
47
lib-php/website/status.php
Normal file
47
lib-php/website/status.php
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
require_once(CONST_LibDir.'/init-website.php');
|
||||
require_once(CONST_LibDir.'/ParameterParser.php');
|
||||
require_once(CONST_LibDir.'/Status.php');
|
||||
|
||||
$oParams = new Nominatim\ParameterParser();
|
||||
$sOutputFormat = $oParams->getSet('format', array('text', 'json'), 'text');
|
||||
|
||||
$oDB = new Nominatim\DB(CONST_Database_DSN);
|
||||
|
||||
if ($sOutputFormat == 'json') {
|
||||
header('content-type: application/json; charset=UTF-8');
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
$oStatus = new Nominatim\Status($oDB);
|
||||
$oStatus->status();
|
||||
} catch (Exception $oErr) {
|
||||
if ($sOutputFormat == 'json') {
|
||||
$aResponse = array(
|
||||
'status' => $oErr->getCode(),
|
||||
'message' => $oErr->getMessage()
|
||||
);
|
||||
javascript_renderData($aResponse);
|
||||
} else {
|
||||
header('HTTP/1.0 500 Internal Server Error');
|
||||
echo 'ERROR: '.$oErr->getMessage();
|
||||
}
|
||||
exit;
|
||||
}
|
||||
|
||||
|
||||
if ($sOutputFormat == 'json') {
|
||||
$epoch = $oStatus->dataDate();
|
||||
$aResponse = array(
|
||||
'status' => 0,
|
||||
'message' => 'OK',
|
||||
'data_updated' => (new DateTime('@'.$epoch))->format(DateTime::RFC3339)
|
||||
);
|
||||
javascript_renderData($aResponse);
|
||||
} else {
|
||||
echo 'OK';
|
||||
}
|
||||
|
||||
exit;
|
||||
Reference in New Issue
Block a user