{
$aResult = array(array(join(' ',$aWords)));
$sFirstToken = '';
- if ($iDepth < 8) {
+ if ($iDepth < 7) {
while(sizeof($aWords) > 1)
{
$sWord = array_shift($aWords);
if ($aItemListValues) $aAddressRankList = array_merge($aAddressRankList, $aItemListValues);
return true;
}
+
+ function addQuotes($s)
+ {
+ return "'".$s."'";
+ }
NEW.centroid := null;
-- reclaculate country and partition
- IF NEW.rank_search >= 4 THEN
- --NEW.calculated_country_code := lower(get_country_code(NEW.geometry, NEW.country_code));
- NEW.calculated_country_code := lower(get_country_code(place_centroid));
+ IF NEW.rank_search = 4 THEN
+ -- for countries, believe the mapped country code,
+ -- so that we remain in the right partition if the boundaries
+ -- suddenly expand.
+ NEW.partition := get_partition(place_centroid, lower(NEW.country_code));
+ IF NEW.partition = 0 THEN
+ NEW.calculated_country_code := lower(get_country_code(place_centroid));
+ NEW.partition := get_partition(place_centroid, NEW.calculated_country_code);
+ ELSE
+ NEW.calculated_country_code := lower(NEW.country_code);
+ END IF;
ELSE
- NEW.calculated_country_code := NULL;
+ IF NEW.rank_search > 4 THEN
+ --NEW.calculated_country_code := lower(get_country_code(NEW.geometry, NEW.country_code));
+ NEW.calculated_country_code := lower(get_country_code(place_centroid));
+ ELSE
+ NEW.calculated_country_code := NULL;
+ END IF;
+ NEW.partition := get_partition(place_centroid, NEW.calculated_country_code);
END IF;
- NEW.partition := get_partition(place_centroid, NEW.calculated_country_code);
NEW.geometry_sector := geometry_sector(NEW.partition, place_centroid);
-- Adding ourselves to the list simplifies address calculations later
INSERT INTO place_addressline VALUES (NEW.place_id, location.place_id, true, location_isaddress, location.distance, location.rank_address);
IF location_isaddress THEN
- address_havelevel[location.rank_address] := true;
- IF NOT location.isguess THEN
- SELECT geometry FROM placex WHERE place_id = location.place_id INTO location_parent;
- END IF;
- END IF;
- --RAISE WARNING ' Terms: (%) %',location, nameaddress_vector;
+ address_havelevel[location.rank_address] := true;
+ IF NOT location.isguess THEN
+ SELECT geometry FROM placex WHERE place_id = location.place_id INTO location_parent;
+ END IF;
+
+ IF location.rank_address > parent_place_id_rank THEN
+ NEW.parent_place_id = location.place_id;
+ parent_place_id_rank = location.rank_address;
+ END IF;
- IF location.rank_address > parent_place_id_rank THEN
- NEW.parent_place_id = location.place_id;
- parent_place_id_rank = location.rank_address;
END IF;
+ --RAISE WARNING ' Terms: (%) %',location, nameaddress_vector;
+
END IF;
END LOOP;
{
$osm2pgsql .= ' --flat-nodes '.CONST_Osm2pgsql_Flatnode_File;
}
+ $osm2pgsql .= ' --tablespace-slim-index ssd --tablespace-main-index ssd --tablespace-main-data ssd --tablespace-slim-data data';
$osm2pgsql .= ' -lsc -O gazetteer --hstore';
- $osm2pgsql .= ' -C '.$iCacheMemory;
+ $osm2pgsql .= ' -C 16000';
$osm2pgsql .= ' -P '.$aDSNInfo['port'];
$osm2pgsql .= ' -d '.$aDSNInfo['database'].' '.$aCMDResult['osm-file'];
passthruCheckReturn($osm2pgsql);
$sSQL .= "select 'P',nextval('seq_postcodes'),'place','postcode',postcode,calculated_country_code,";
$sSQL .= "ST_SetSRID(ST_Point(x,y),4326) as geometry from (select calculated_country_code,postcode,";
$sSQL .= "avg(st_x(st_centroid(geometry))) as x,avg(st_y(st_centroid(geometry))) as y ";
- $sSQL .= "from placex where postcode is not null group by calculated_country_code,postcode) as x";
+ $sSQL .= "from placex where postcode is not null and calculated_country_code not in ('ie') group by calculated_country_code,postcode) as x";
if (!pg_query($oDB->connection, $sSQL)) fail(pg_last_error($oDB->connection));
$sSQL = "insert into placex (osm_type,osm_id,class,type,postcode,calculated_country_code,geometry) ";
if (!file_exists(CONST_Osmosis_Binary))
{
echo "Please download osmosis.\nIf it is already installed, check the path in your local settings (settings/local.php) file.\n";
- fail("osmosis not found in '".CONST_Osmosis_Binary."'");
- }
- if (file_exists(CONST_BasePath.'/settings/configuration.txt'))
- {
- echo "settings/configuration.txt already exists\n";
+ if (!$aCMDResult['all'])
+ {
+ fail("osmosis not found in '".CONST_Osmosis_Binary."'");
+ }
}
else
{
- passthru(CONST_Osmosis_Binary.' --read-replication-interval-init '.CONST_BasePath.'/settings');
- // update osmosis configuration.txt with our settings
- passthru("sed -i 's!baseUrl=.*!baseUrl=".CONST_Replication_Url."!' ".CONST_BasePath.'/settings/configuration.txt');
- passthru("sed -i 's:maxInterval = .*:maxInterval = ".CONST_Replication_MaxInterval.":' ".CONST_BasePath.'/settings/configuration.txt');
- }
-
- // Find the last node in the DB
- $iLastOSMID = $oDB->getOne("select max(id) from planet_osm_nodes");
-
- // Lookup the timestamp that node was created (less 3 hours for margin for changsets to be closed)
- $sLastNodeURL = 'http://www.openstreetmap.org/api/0.6/node/'.$iLastOSMID."/1";
- $sLastNodeXML = file_get_contents($sLastNodeURL);
- preg_match('#timestamp="(([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z)"#', $sLastNodeXML, $aLastNodeDate);
- $iLastNodeTimestamp = strtotime($aLastNodeDate[1]) - (3*60*60);
-
+ if (file_exists(CONST_BasePath.'/settings/configuration.txt'))
+ {
+ echo "settings/configuration.txt already exists\n";
+ }
+ else
+ {
+ passthru(CONST_Osmosis_Binary.' --read-replication-interval-init '.CONST_BasePath.'/settings');
+ // update osmosis configuration.txt with our settings
+ passthru("sed -i 's!baseUrl=.*!baseUrl=".CONST_Replication_Url."!' ".CONST_BasePath.'/settings/configuration.txt');
+ passthru("sed -i 's:maxInterval = .*:maxInterval = ".CONST_Replication_MaxInterval.":' ".CONST_BasePath.'/settings/configuration.txt');
+ }
- // Search for the correct state file - uses file timestamps so need to sort by date descending
- $sRepURL = CONST_Replication_Url."/";
- $sRep = file_get_contents($sRepURL."?C=M;O=D");
- // download.geofabrik.de: <a href="000/">000/</a></td><td align="right">26-Feb-2013 11:53 </td>
- // planet.openstreetmap.org: <a href="273/">273/</a> 22-Mar-2013 07:41 -
- preg_match_all('#<a href="[0-9]{3}/">([0-9]{3}/)</a>.*(([0-9]{2})-([A-z]{3})-([0-9]{4}) ([0-9]{2}):([0-9]{2}))#', $sRep, $aRepMatches, PREG_SET_ORDER);
- $aPrevRepMatch = false;
- foreach($aRepMatches as $aRepMatch)
- {
- if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
- $aPrevRepMatch = $aRepMatch;
- }
- if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
+ // Find the last node in the DB
+ $iLastOSMID = $oDB->getOne("select max(id) from planet_osm_nodes");
+
+ // Lookup the timestamp that node was created (less 3 hours for margin for changsets to be closed)
+ $sLastNodeURL = 'http://www.openstreetmap.org/api/0.6/node/'.$iLastOSMID."/1";
+ $sLastNodeXML = file_get_contents($sLastNodeURL);
+ preg_match('#timestamp="(([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z)"#', $sLastNodeXML, $aLastNodeDate);
+ $iLastNodeTimestamp = strtotime($aLastNodeDate[1]) - (3*60*60);
+
+ // Search for the correct state file - uses file timestamps so need to sort by date descending
+ $sRepURL = CONST_Replication_Url."/";
+ $sRep = file_get_contents($sRepURL."?C=M;O=D");
+ // download.geofabrik.de: <a href="000/">000/</a></td><td align="right">26-Feb-2013 11:53 </td>
+ // planet.openstreetmap.org: <a href="273/">273/</a> 22-Mar-2013 07:41 -
+ preg_match_all('#<a href="[0-9]{3}/">([0-9]{3}/)</a>.*(([0-9]{2})-([A-z]{3})-([0-9]{4}) ([0-9]{2}):([0-9]{2}))#', $sRep, $aRepMatches, PREG_SET_ORDER);
+ $aPrevRepMatch = false;
+ foreach($aRepMatches as $aRepMatch)
+ {
+ if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
+ $aPrevRepMatch = $aRepMatch;
+ }
+ if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
- $sRepURL .= $aRepMatch[1];
- $sRep = file_get_contents($sRepURL."?C=M;O=D");
- preg_match_all('#<a href="[0-9]{3}/">([0-9]{3}/)</a>.*(([0-9]{2})-([A-z]{3})-([0-9]{4}) ([0-9]{2}):([0-9]{2}))#', $sRep, $aRepMatches, PREG_SET_ORDER);
- $aPrevRepMatch = false;
- foreach($aRepMatches as $aRepMatch)
- {
- if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
- $aPrevRepMatch = $aRepMatch;
- }
- if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
+ $sRepURL .= $aRepMatch[1];
+ $sRep = file_get_contents($sRepURL."?C=M;O=D");
+ preg_match_all('#<a href="[0-9]{3}/">([0-9]{3}/)</a>.*(([0-9]{2})-([A-z]{3})-([0-9]{4}) ([0-9]{2}):([0-9]{2}))#', $sRep, $aRepMatches, PREG_SET_ORDER);
+ $aPrevRepMatch = false;
+ foreach($aRepMatches as $aRepMatch)
+ {
+ if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
+ $aPrevRepMatch = $aRepMatch;
+ }
+ if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
- $sRepURL .= $aRepMatch[1];
- $sRep = file_get_contents($sRepURL."?C=M;O=D");
- preg_match_all('#<a href="[0-9]{3}.state.txt">([0-9]{3}).state.txt</a>.*(([0-9]{2})-([A-z]{3})-([0-9]{4}) ([0-9]{2}):([0-9]{2}))#', $sRep, $aRepMatches, PREG_SET_ORDER);
- $aPrevRepMatch = false;
- foreach($aRepMatches as $aRepMatch)
- {
- if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
- $aPrevRepMatch = $aRepMatch;
+ $sRepURL .= $aRepMatch[1];
+ $sRep = file_get_contents($sRepURL."?C=M;O=D");
+ preg_match_all('#<a href="[0-9]{3}.state.txt">([0-9]{3}).state.txt</a>.*(([0-9]{2})-([A-z]{3})-([0-9]{4}) ([0-9]{2}):([0-9]{2}))#', $sRep, $aRepMatches, PREG_SET_ORDER);
+ $aPrevRepMatch = false;
+ foreach($aRepMatches as $aRepMatch)
+ {
+ if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
+ $aPrevRepMatch = $aRepMatch;
+ }
+ if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
+
+ $sRepURL .= $aRepMatch[1].'.state.txt';
+ echo "Getting state file: $sRepURL\n";
+ $sStateFile = file_get_contents($sRepURL);
+ if (!$sStateFile || strlen($sStateFile) > 1000) fail("unable to obtain state file");
+ file_put_contents(CONST_BasePath.'/settings/state.txt', $sStateFile);
+ echo "Updating DB status\n";
+ pg_query($oDB->connection, 'TRUNCATE import_status');
+ $sSQL = "INSERT INTO import_status VALUES('".$aRepMatch[2]."')";
+ pg_query($oDB->connection, $sSQL);
}
- if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
-
- $sRepURL .= $aRepMatch[1].'.state.txt';
- echo "Getting state file: $sRepURL\n";
- $sStateFile = file_get_contents($sRepURL);
- if (!$sStateFile || strlen($sStateFile) > 1000) fail("unable to obtain state file");
- file_put_contents(CONST_BasePath.'/settings/state.txt', $sStateFile);
- echo "Updating DB status\n";
- pg_query($oDB->connection, 'TRUNCATE import_status');
- $sSQL = "INSERT INTO import_status VALUES('".$aRepMatch[2]."')";
- pg_query($oDB->connection, $sSQL);
}
if ($aCMDResult['index'] || $aCMDResult['all'])
showUsage($aCMDOptions, true, 'Select either import of hourly or daily');
}
- if (!isset($aResult['index-instances'])) $aResult['index-instances'] = 1;
if (!isset($aResult['index-rank'])) $aResult['index-rank'] = 0;
/*
// Lock to prevent multiple copies running
$sNextFile = $aResult['import-diff'];
if (!file_exists($sNextFile))
{
- echo "Cannot open $nextFile\n";
+ echo "Cannot open $sNextFile\n";
exit;
}
// Don't update the import status - we don't know what this file contains
if ($aResult['index'])
{
+ if (!isset($aResult['index-instances'])) $aResult['index-instances'] = 1;
passthru(CONST_BasePath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -t '.$aResult['index-instances'].' -r '.$aResult['index-rank']);
}
{
$sCMDImport .= ' --flat-nodes '.CONST_Osm2pgsql_Flatnode_File;
}
- $sCMDIndex = $sBasePath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -t '.$aResult['index-instances'];
+ $sCMDIndex = $sBasePath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'];
if (!$aResult['no-npi']) {
$sCMDIndex .= '-F ';
}
unset($aReplicationLag);
exec($sCMDCheckReplicationLag, $aReplicationLag, $iErrorLevel);
- while ($iErrorLevel == 1 || $aReplicationLag[0] < 1)
+ while ($iErrorLevel > 0 || $aReplicationLag[0] < 1)
{
if ($iErrorLevel)
{
$fCMDStartTime = time();
echo $sCMDDownload."\n";
exec($sCMDDownload, $sJunk, $iErrorLevel);
- while ($iErrorLevel == 1)
+ while ($iErrorLevel > 0)
{
echo "Error: $iErrorLevel\n";
sleep(60);
$sBatchEnd = getosmosistimestamp($sOsmosisConfigDirectory);
// Index file
- $sThisIndexCmd = $sCMDIndex;
+ if (!isset($aResult['index-instances']))
+ {
+ if (getLoadAverage() < 15)
+ $iIndexInstances = 2;
+ else
+ $iIndexInstances = 1;
+ } else
+ $iIndexInstances = $aResult['index-instances'];
+
+ $sThisIndexCmd = $sCMDIndex.' -t '.$iIndexInstances;
if (!$aResult['no-npi'])
{
require_once(dirname(dirname(__FILE__)).'/lib/init-website.php');
require_once(CONST_BasePath.'/lib/log.php');
+ require_once(CONST_BasePath.'/lib/PlaceLookup.php');
+ require_once(CONST_BasePath.'/lib/ReverseGeocode.php');
- if (strpos(CONST_BulkUserIPs, ','.$_SERVER["REMOTE_ADDR"].',') !== false)
- {
- $fLoadAvg = getLoadAverage();
- if ($fLoadAvg > 2) sleep(60);
- if ($fLoadAvg > 4) sleep(120);
- if ($fLoadAvg > 6)
- {
- echo "Bulk User: Temporary block due to high server load\n";
- exit;
- }
- }
-
$oDB =& getDB();
ini_set('memory_limit', '200M');
// Preferred language
$aLangPrefOrder = getPreferredLanguages();
- $sLanguagePrefArraySQL = "ARRAY[".join(',',array_map("getDBQuoted",$aLangPrefOrder))."]";
$hLog = logStart($oDB, 'reverse', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
if (isset($_GET['osm_type']) && isset($_GET['osm_id']) && (int)$_GET['osm_id'] && ($_GET['osm_type'] == 'N' || $_GET['osm_type'] == 'W' || $_GET['osm_type'] == 'R'))
{
- $iPlaceID = $oDB->getOne($sSQL = ("select place_id from placex where osm_type = '".$_GET['osm_type']."' and osm_id = ".(int)$_GET['osm_id']." order by type = 'postcode' asc"));
- if (CONST_Debug) var_dump($sSQL);
- if (!$iPlaceID) $sError = 'OSM ID Not Found';
- }
- else
- {
- // Location to look up
- $fLat = (float)$_GET['lat'];
- $fLon = (float)$_GET['lon'];
- $sPointSQL = "ST_SetSRID(ST_Point($fLon,$fLat),4326)";
-
- // Zoom to rank, this could probably be calculated but a lookup gives fine control
- $aZoomRank = array(
- 0 => 2, // Continent / Sea
- 1 => 2,
- 2 => 2,
- 3 => 4, // Country
- 4 => 4,
- 5 => 8, // State
- 6 => 10, // Region
- 7 => 10,
- 8 => 12, // County
- 9 => 12,
- 10 => 17, // City
- 11 => 17,
- 12 => 18, // Town / Village
- 13 => 18,
- 14 => 22, // Suburb
- 15 => 22,
- 16 => 26, // Street, TODO: major street?
- 17 => 26,
- 18 => 30, // or >, Building
- 19 => 30, // or >, Building
- );
- $iMaxRank = (isset($_GET['zoom']) && isset($aZoomRank[$_GET['zoom']]))?$aZoomRank[$_GET['zoom']]:28;
-
- // Find the nearest point
- $fSearchDiam = 0.0004;
- $iPlaceID = null;
- $aArea = false;
- $fMaxAreaDistance = 1;
- while(!$iPlaceID && $fSearchDiam < $fMaxAreaDistance)
- {
- $fSearchDiam = $fSearchDiam * 2;
+ $oPlaceLookup = new PlaceLookup($oDB);
+ $oPlaceLookup->setLanguagePreference($aLangPrefOrder);
+ $oPlaceLookup->setIncludeAddressDetails($bShowAddressDetails);
+ $oPlaceLookup->setOSMID($_GET['osm_type'], $_GET['osm_id']);
- // If we have to expand the search area by a large amount then we need a larger feature
- // then there is a limit to how small the feature should be
- if ($fSearchDiam > 2 && $iMaxRank > 4) $iMaxRank = 4;
- if ($fSearchDiam > 1 && $iMaxRank > 9) $iMaxRank = 8;
- if ($fSearchDiam > 0.8 && $iMaxRank > 10) $iMaxRank = 10;
- if ($fSearchDiam > 0.6 && $iMaxRank > 12) $iMaxRank = 12;
- if ($fSearchDiam > 0.2 && $iMaxRank > 17) $iMaxRank = 17;
- if ($fSearchDiam > 0.1 && $iMaxRank > 18) $iMaxRank = 18;
- if ($fSearchDiam > 0.008 && $iMaxRank > 22) $iMaxRank = 22;
- if ($fSearchDiam > 0.001 && $iMaxRank > 26) $iMaxRank = 26;
+ $aPlace = $oPlaceLookup->lookup();
- $sSQL = 'select place_id,parent_place_id,rank_search from placex';
- $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')';
- $sSQL .= ' and rank_search != 28 and rank_search >= '.$iMaxRank;
- $sSQL .= ' and (name is not null or housenumber is not null)';
- $sSQL .= ' and class not in (\'waterway\',\'railway\',\'tunnel\',\'bridge\')';
- $sSQL .= ' and (ST_GeometryType(geometry) not in (\'ST_Polygon\',\'ST_MultiPolygon\') ';
- $sSQL .= ' and indexed_status = 0 ';
- $sSQL .= ' OR ST_DWithin('.$sPointSQL.', centroid, '.$fSearchDiam.'))';
- $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', geometry) ASC limit 1';
- if (CONST_Debug) var_dump($sSQL);
- $aPlace = $oDB->getRow($sSQL);
- if (PEAR::IsError($aPlace))
- {
- failInternalError("Could not determine closest place.", $sSQL, $aPlace);
- }
- $iPlaceID = $aPlace['place_id'];
- $iParentPlaceID = $aPlace['parent_place_id'];
- }
-
- // The point we found might be too small - use the address to find what it is a child of
- if ($iPlaceID && $iMaxRank < 28)
- {
- if ($aPlace['rank_search'] > 28 && $iParentPlaceID)
- {
- $iPlaceID = $iParentPlaceID;
- }
- $sSQL = "select address_place_id from place_addressline where place_id = $iPlaceID order by abs(cached_rank_address - $iMaxRank) asc,cached_rank_address desc,isaddress desc,distance desc limit 1";
- $iPlaceID = $oDB->getOne($sSQL);
- if (PEAR::IsError($iPlaceID))
- {
- failInternalError("Could not get parent for place.", $sSQL, $iPlaceID);
- }
- if (!$iPlaceID)
- {
- $iPlaceID = $aPlace['place_id'];
- }
- }
+ //if (!$iPlaceID) $sError = 'OSM ID Not Found';
}
-
- if ($iPlaceID)
+ else
{
- $sSQL = "select placex.*,";
- $sSQL .= " get_address_by_language(place_id, $sLanguagePrefArraySQL) as langaddress,";
- $sSQL .= " get_name_by_language(name, $sLanguagePrefArraySQL) as placename,";
- $sSQL .= " get_name_by_language(name, ARRAY['ref']) as ref,";
- $sSQL .= " st_y(centroid) as lat, st_x(centroid) as lon";
- $sSQL .= " from placex where place_id = $iPlaceID ";
-
- $aPlace = $oDB->getRow($sSQL);
- //var_dump($sSQL, $aPlace); exit;
+ $oReverseGeocode = new ReverseGeocode($oDB);
+ $oReverseGeocode->setLanguagePreference($aLangPrefOrder);
+ $oReverseGeocode->setIncludeAddressDetails($bShowAddressDetails);
- if ($bShowAddressDetails)
- {
- $aAddress = getAddressDetails($oDB, $sLanguagePrefArraySQL, $iPlaceID, $aPlace['calculated_country_code']);
- }
- $aClassType = getClassTypes();
- $sAddressType = '';
- $sClassType = $aPlace['class'].':'.$aPlace['type'].':'.$aPlace['admin_level'];
- if (isset($aClassType[$sClassType]) && isset($aClassType[$sClassType]['simplelabel']))
- {
- $sAddressType = $aClassType[$aClassType]['simplelabel'];
- }
- else
- {
- $sClassType = $aPlace['class'].':'.$aPlace['type'];
- if (isset($aClassType[$sClassType]) && isset($aClassType[$sClassType]['simplelabel']))
- $sAddressType = $aClassType[$sClassType]['simplelabel'];
- else $sAddressType = $aPlace['class'];
- }
- $aPlace['addresstype'] = $sAddressType;
+ $oReverseGeocode->setLatLon($_GET['lat'], $_GET['lon']);
+ $oReverseGeocode->setZoom(@$_GET['zoom']);
+ $aPlace = $oReverseGeocode->lookup();
}
if (CONST_Debug) exit;