connect(); $fPostgresVersion = $oDB->getPostgresVersion(); $aDSNInfo = Nominatim\DB::parseDSN(getSetting('DATABASE_DSN')); if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432; // cache memory to be used by osm2pgsql, should not be more than the available memory $iCacheMemory = (isset($aResult['osm2pgsql-cache'])?$aResult['osm2pgsql-cache']:2000); if ($iCacheMemory + 500 > getTotalMemoryMB()) { $iCacheMemory = getCacheMemoryMB(); echo "WARNING: resetting cache memory to $iCacheMemory\n"; } $oOsm2pgsqlCmd = (new \Nominatim\Shell(getOsm2pgsqlBinary())) ->addParams('--hstore') ->addParams('--latlong') ->addParams('--append') ->addParams('--slim') ->addParams('--with-forward-dependencies', 'false') ->addParams('--log-progress', 'true') ->addParams('--number-processes', 1) ->addParams('--cache', $iCacheMemory) ->addParams('--output', 'gazetteer') ->addParams('--style', getImportStyle()) ->addParams('--database', $aDSNInfo['database']) ->addParams('--port', $aDSNInfo['port']); if (isset($aDSNInfo['hostspec']) && $aDSNInfo['hostspec']) { $oOsm2pgsqlCmd->addParams('--host', $aDSNInfo['hostspec']); } if (isset($aDSNInfo['username']) && $aDSNInfo['username']) { $oOsm2pgsqlCmd->addParams('--user', $aDSNInfo['username']); } if (isset($aDSNInfo['password']) && $aDSNInfo['password']) { $oOsm2pgsqlCmd->addEnvPair('PGPASSWORD', $aDSNInfo['password']); } if (getSetting('FLATNODE_FILE')) { $oOsm2pgsqlCmd->addParams('--flat-nodes', getSetting('FLATNODE_FILE')); } if ($fPostgresVersion >= 11.0) { $oOsm2pgsqlCmd->addEnvPair( 'PGOPTIONS', '-c jit=off -c max_parallel_workers_per_gather=0' ); } $oNominatimCmd = new \Nominatim\Shell(getSetting('NOMINATIM_TOOL')); function run($oCmd) { global $aCMDResult; if ($aCMDResult['quiet'] ?? false) { $oCmd->addParams('--quiet'); } if ($aCMDResult['verbose'] ?? false) { $oCmd->addParams('--verbose'); } $oCmd->run(true); } if ($aResult['init-updates']) { $oCmd = (clone($oNominatimCmd))->addParams('replication', '--init'); if ($aResult['no-update-functions']) { $oCmd->addParams('--no-update-functions'); } run($oCmd); } if ($aResult['check-for-updates']) { exit((clone($oNominatimCmd))->addParams('replication', '--check-for-updates')->run()); } if (isset($aResult['import-diff']) || isset($aResult['import-file'])) { // import diffs and files directly (e.g. from osmosis --rri) $sNextFile = isset($aResult['import-diff']) ? $aResult['import-diff'] : $aResult['import-file']; if (!file_exists($sNextFile)) { fail("Cannot open $sNextFile\n"); } // Import the file $oCMD = (clone $oOsm2pgsqlCmd)->addParams($sNextFile); echo $oCMD->escapedCmd()."\n"; $iRet = $oCMD->run(); if ($iRet) { fail("Error from osm2pgsql, $iRet\n"); } // Don't update the import status - we don't know what this file contains } if ($aResult['calculate-postcodes']) { run((clone($oNominatimCmd))->addParams('refresh', '--postcodes')); } $sTemporaryFile = CONST_InstallDir.'/osmosischange.osc'; $bHaveDiff = false; $bUseOSMApi = isset($aResult['import-from-main-api']) && $aResult['import-from-main-api']; $sContentURL = ''; if (isset($aResult['import-node']) && $aResult['import-node']) { if ($bUseOSMApi) { $sContentURL = 'https://www.openstreetmap.org/api/0.6/node/'.$aResult['import-node']; } else { $sContentURL = 'https://overpass-api.de/api/interpreter?data=node('.$aResult['import-node'].');out%20meta;'; } } if (isset($aResult['import-way']) && $aResult['import-way']) { if ($bUseOSMApi) { $sContentURL = 'https://www.openstreetmap.org/api/0.6/way/'.$aResult['import-way'].'/full'; } else { $sContentURL = 'https://overpass-api.de/api/interpreter?data=(way('.$aResult['import-way'].');%3E;);out%20meta;'; } } if (isset($aResult['import-relation']) && $aResult['import-relation']) { if ($bUseOSMApi) { $sContentURL = 'https://www.openstreetmap.org/api/0.6/relation/'.$aResult['import-relation'].'/full'; } else { $sContentURL = 'https://overpass-api.de/api/interpreter?data=(rel(id:'.$aResult['import-relation'].');%3E;);out%20meta;'; } } if ($sContentURL) { file_put_contents($sTemporaryFile, file_get_contents($sContentURL)); $bHaveDiff = true; } if ($bHaveDiff) { // import generated change file $oCMD = (clone $oOsm2pgsqlCmd)->addParams($sTemporaryFile); echo $oCMD->escapedCmd()."\n"; $iRet = $oCMD->run(); if ($iRet) { fail("osm2pgsql exited with error level $iRet\n"); } } if ($aResult['recompute-word-counts']) { run((clone($oNominatimCmd))->addParams('refresh', '--word-counts')); } if ($aResult['index']) { run((clone $oNominatimCmd) ->addParams('index', '--minrank', $aResult['index-rank']) ->addParams('--threads', $aResult['index-instances'])); } if ($aResult['update-address-levels']) { run((clone($oNominatimCmd))->addParams('refresh', '--address-levels')); } if ($aResult['recompute-importance']) { run((clone($oNominatimCmd))->addParams('refresh', '--importance')); } if ($aResult['import-osmosis'] || $aResult['import-osmosis-all']) { $oCmd = (clone($oNominatimCmd)) ->addParams('replication') ->addParams('--threads', $aResult['index-instances']); if (!$aResult['import-osmosis-all']) { $oCmd->addParams('--once'); } if ($aResult['no-index']) { $oCmd->addParams('--no-index'); } run($oCmd); }