X-Git-Url: https://git.openstreetmap.org./nominatim.git/blobdiff_plain/1461dc603e7d99a56b65057663bcd039b8309d20..1b51a5abebd03284924b69058ecba9dbdff11acb:/utils/update.php diff --git a/utils/update.php b/utils/update.php index e26a9538..76d6f858 100755 --- a/utils/update.php +++ b/utils/update.php @@ -30,6 +30,7 @@ array('import-node', '', 0, 1, 1, 1, 'int', 'Re-import node'), array('import-way', '', 0, 1, 1, 1, 'int', 'Re-import way'), array('import-relation', '', 0, 1, 1, 1, 'int', 'Re-import relation'), + array('import-from-main-api', '', 0, 1, 0, 0, 'bool', 'Use OSM API instead of Overpass to download objects'), array('index', '', 0, 1, 0, 0, 'bool', 'Index'), array('index-rank', '', 0, 1, 1, 1, 'int', 'Rank to start indexing from'), @@ -46,6 +47,7 @@ } if (!isset($aResult['index-instances'])) $aResult['index-instances'] = 1; + if (!isset($aResult['index-rank'])) $aResult['index-rank'] = 0; /* // Lock to prevent multiple copies running if (exec('/bin/ps uww | grep '.basename(__FILE__).' | grep -v /dev/null | grep -v grep -c', $aOutput2, $iResult) > 1) @@ -65,6 +67,8 @@ // Assume osm2pgsql is in the folder above $sBasePath = dirname(dirname(__FILE__)); + date_default_timezone_set('Etc/UTC'); + $oDB =& getDB(); $aDSNInfo = DB::parseDSN(CONST_Database_DSN); @@ -131,6 +135,7 @@ $bModifyXML = false; $sModifyXMLstr = ''; + $bUseOSMApi = isset($aResult['import-from-main-api']) && $aResult['import-from-main-api']; if (isset($aResult['import-file']) && $aResult['import-file']) { $bModifyXML = true; @@ -138,23 +143,45 @@ if (isset($aResult['import-node']) && $aResult['import-node']) { $bModifyXML = true; - $sModifyXMLstr = file_get_contents('http://www.openstreetmap.org/api/0.6/node/'.$aResult['import-node']); + if ($bUseOSMApi) + { + $sModifyXMLstr = file_get_contents('http://www.openstreetmap.org/api/0.6/node/'.$aResult['import-node']); + } + else + { + $sModifyXMLstr = file_get_contents('http://overpass-api.de/api/interpreter?data=node('.$aResult['import-node'].');out%20meta;'); + } } if (isset($aResult['import-way']) && $aResult['import-way']) { $bModifyXML = true; - $sModifyXMLstr = file_get_contents('http://www.openstreetmap.org/api/0.6/way/'.$aResult['import-way'].'/full'); + if ($bUseOSMApi) + { + $sCmd = 'http://www.openstreetmap.org/api/0.6/way/'.$aResult['import-way'].'/full'; + } + else + { + $sCmd = 'http://overpass-api.de/api/interpreter?data=(way('.$aResult['import-way'].');node(w););out%20meta;'; + } + $sModifyXMLstr = file_get_contents($sCmd); } if (isset($aResult['import-relation']) && $aResult['import-relation']) { $bModifyXML = true; - $sModifyXMLstr = file_get_contents('http://www.openstreetmap.org/api/0.6/relation/'.$aResult['import-relation'].'/full'); + if ($bUseOSMApi) + { + $sModifyXMLstr = file_get_contents('http://www.openstreetmap.org/api/0.6/relation/'.$aResult['import-relation'].'/full'); + } + else + { + $sModifyXMLstr = file_get_contents('http://overpass-api.de/api/interpreter?data=((rel('.$aResult['import-relation'].');way(r);node(w));node(r));out%20meta;'); + } } if ($bModifyXML) { // derive change from normal osm file with osmosis $sTemporaryFile = CONST_BasePath.'/data/osmosischange.osc'; - if ($aResult['import-file']) + if (isset($aResult['import-file']) && $aResult['import-file']) { $sCMD = CONST_Osmosis_Binary.' --read-xml \''.$aResult['import-file'].'\' --read-empty --derive-change --write-xml-change '.$sTemporaryFile; echo $sCMD."\n"; @@ -198,7 +225,6 @@ } // import generated change file - $aPipes = array(); $sCMD = CONST_Osm2pgsql_Binary.' -klas -C 2000 -O gazetteer -d '.$aDSNInfo['database'].' '.$sTemporaryFile; echo $sCMD."\n"; exec($sCMD, $sJunk, $iErrorLevel); @@ -318,7 +344,7 @@ if ($aResult['index']) { - index($aResult, $sDatabaseDSN); + passthru(CONST_BasePath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -t '.$aResult['index-instances'].' -r '.$aResult['index-rank']); } if ($aResult['import-osmosis'] || $aResult['import-osmosis-all']) @@ -326,10 +352,10 @@ $sImportFile = CONST_BasePath.'/data/osmosischange.osc'; $sOsmosisCMD = CONST_Osmosis_Binary; $sOsmosisConfigDirectory = CONST_BasePath.'/settings'; - $sDatabaseName = 'nominatim'; $sCMDDownload = $sOsmosisCMD.' --read-replication-interval workingDirectory='.$sOsmosisConfigDirectory.' --simplify-change --write-xml-change '.$sImportFile; - $sCMDImport = CONST_Osm2pgsql_Binary.' -klas -C 2000 -O gazetteer -d '.$sDatabaseName.' '.$sImportFile; - $sCMDIndex = $sBasePath.'/nominatim/nominatim -i -t '.$aResult['index-instances']; + $sCMDCheckReplicationLag = $sOsmosisCMD.' -q --read-replication-lag workingDirectory='.$sOsmosisConfigDirectory; + $sCMDImport = CONST_Osm2pgsql_Binary.' -klas -C 2000 -O gazetteer -d '.$aDSNInfo['database'].' '.$sImportFile; + $sCMDIndex = $sBasePath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -t '.$aResult['index-instances']; if (!$aResult['no-npi']) { $sCMDIndex .= '-F '; } @@ -347,7 +373,30 @@ // { if (!file_exists($sImportFile)) { - // Use osmosis to download the file + // First check if there are new updates published (except for minutelies - there's always new diffs to process) + if ( CONST_Replication_Update_Interval > 60 ) + { + + unset($aReplicationLag); + exec($sCMDCheckReplicationLag, $aReplicationLag, $iErrorLevel); + while ($iErrorLevel == 1 || $aReplicationLag[0] < 1) + { + if ($iErrorLevel) + { + echo "Error: $iErrorLevel. "; + echo "Re-trying: ".$sCMDCheckReplicationLag." in ".CONST_Replication_Recheck_Interval." secs\n"; + } + else + { + echo "."; + } + sleep(CONST_Replication_Recheck_Interval); + unset($aReplicationLag); + exec($sCMDCheckReplicationLag, $aReplicationLag, $iErrorLevel); + } + // There are new replication files - use osmosis to download the file + echo "\nReplication Delay is ".$aReplicationLag[0]."\n"; + } $fCMDStartTime = time(); echo $sCMDDownload."\n"; exec($sCMDDownload, $sJunk, $iErrorLevel); @@ -458,8 +507,16 @@ echo "Completed for $sBatchEnd in ".round($fDuration/60,2)."\n"; if (!$aResult['import-osmosis-all']) exit; - echo "Sleeping ".max(0,60-$fDuration)." seconds\n"; - sleep(max(0,60-$fDuration)); + if ( CONST_Replication_Update_Interval > 60 ) + { + $iSleep = round(CONST_Replication_Update_Interval*0.8); + } + else + { + $iSleep = max(0,CONST_Replication_Update_Interval-$fDuration); + } + echo "Sleeping $iSleep seconds\n"; + sleep($iSleep); } }