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')); if ($aResult['quiet']) { $oNominatimCmd->addParams('--quiet'); } if ($aResult['verbose']) { $oNominatimCmd->addParams('--verbose'); } if ($aResult['init-updates']) { $oCmd = (clone($oNominatimCmd))->addParams('replication', '--init'); if ($aResult['no-update-functions']) { $oCmd->addParams('--no-update-functions'); } $oCmd->run(); } 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']) { (clone($oNominatimCmd))->addParams('refresh', '--postcodes')->run(); } $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']) { (clone($oNominatimCmd))->addParams('refresh', '--word-counts')->run(); } if ($aResult['index']) { (clone $oNominatimCmd) ->addParams('index', '--minrank', $aResult['index-rank']) ->addParams('--threads', $aResult['index-instances']) ->run(); } if ($aResult['update-address-levels']) { (clone($oNominatimCmd))->addParams('refresh', '--address-levels')->run(); } if ($aResult['recompute-importance']) { echo "Updating importance values for database.\n"; $oDB = new Nominatim\DB(); $oDB->connect(); $sSQL = 'ALTER TABLE placex DISABLE TRIGGER ALL;'; $sSQL .= 'UPDATE placex SET (wikipedia, importance) ='; $sSQL .= ' (SELECT wikipedia, importance'; $sSQL .= ' FROM compute_importance(extratags, country_code, osm_type, osm_id));'; $sSQL .= 'UPDATE placex s SET wikipedia = d.wikipedia, importance = d.importance'; $sSQL .= ' FROM placex d'; $sSQL .= ' WHERE s.place_id = d.linked_place_id and d.wikipedia is not null'; $sSQL .= ' and (s.wikipedia is null or s.importance < d.importance);'; $sSQL .= 'ALTER TABLE placex ENABLE TRIGGER ALL;'; $oDB->exec($sSQL); } 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'); } exit($oCmd->run()); }