2011-03-18 15:36:17 +03:00
< ? php
2021-01-13 19:00:38 +03:00
@ define ( 'CONST_LibDir' , dirname ( dirname ( __FILE__ )));
2011-04-27 16:14:33 +04:00
2020-12-15 12:09:55 +03:00
require_once ( CONST_LibDir . '/init-cmd.php' );
require_once ( CONST_LibDir . '/setup_functions.php' );
require_once ( CONST_LibDir . '/setup/SetupClass.php' );
2018-09-05 23:01:03 +03:00
2016-09-04 04:19:48 +03:00
ini_set ( 'memory_limit' , '800M' );
2018-08-31 22:31:38 +03:00
use Nominatim\Setup\SetupFunctions as SetupFunctions ;
2018-08-24 17:15:39 +03:00
2018-09-17 11:28:00 +03:00
// (long-opt, short-opt, min-occurs, max-occurs, num-arguments, num-arguments, type, help)
$aCMDOptions
= array (
2018-10-02 23:59:10 +03:00
'Import / update / index osm data' ,
array ( 'help' , 'h' , 0 , 1 , 0 , 0 , false , 'Show Help' ),
array ( 'quiet' , 'q' , 0 , 1 , 0 , 0 , 'bool' , 'Quiet output' ),
array ( 'verbose' , 'v' , 0 , 1 , 0 , 0 , 'bool' , 'Verbose output' ),
array ( 'init-updates' , '' , 0 , 1 , 0 , 0 , 'bool' , 'Set up database for updating' ),
array ( 'check-for-updates' , '' , 0 , 1 , 0 , 0 , 'bool' , 'Check if new updates are available' ),
array ( 'no-update-functions' , '' , 0 , 1 , 0 , 0 , 'bool' , 'Do not update trigger functions to support differential updates (assuming the diff update logic is already present)' ),
array ( 'import-osmosis' , '' , 0 , 1 , 0 , 0 , 'bool' , 'Import updates once' ),
array ( 'import-osmosis-all' , '' , 0 , 1 , 0 , 0 , 'bool' , 'Import updates forever' ),
array ( 'no-index' , '' , 0 , 1 , 0 , 0 , 'bool' , 'Do not index the new data' ),
array ( 'calculate-postcodes' , '' , 0 , 1 , 0 , 0 , 'bool' , 'Update postcode centroid table' ),
array ( 'import-file' , '' , 0 , 1 , 1 , 1 , 'realpath' , 'Re-import data from an OSM file' ),
array ( 'import-diff' , '' , 0 , 1 , 1 , 1 , 'realpath' , 'Import a diff (osc) file from local file system' ),
array ( 'osm2pgsql-cache' , '' , 0 , 1 , 1 , 1 , 'int' , 'Cache size used by osm2pgsql' ),
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' ),
array ( 'index-instances' , '' , 0 , 1 , 1 , 1 , 'int' , 'Number of indexing instances (threads)' ),
array ( 'recompute-word-counts' , '' , 0 , 1 , 0 , 0 , 'bool' , 'Compute frequency of full-word search terms' ),
2018-11-24 12:20:24 +03:00
array ( 'update-address-levels' , '' , 0 , 1 , 0 , 0 , 'bool' , 'Reimport address level configuration (EXPERT)' ),
2020-12-16 19:20:58 +03:00
array ( 'recompute-importance' , '' , 0 , 1 , 0 , 0 , 'bool' , 'Recompute place importances' ),
array ( 'project-dir' , '' , 0 , 1 , 1 , 1 , 'realpath' , 'Base directory of the Nominatim installation (default: .)' ),
2018-10-02 23:59:10 +03:00
);
2018-09-17 11:28:00 +03:00
2016-09-04 04:19:48 +03:00
getCmdOpt ( $_SERVER [ 'argv' ], $aCMDOptions , $aResult , true , true );
2020-12-16 19:20:58 +03:00
loadSettings ( $aCMDResult [ 'project-dir' ] ? ? getcwd ());
2020-12-15 13:04:19 +03:00
setupHTTPProxy ();
2018-09-05 23:01:03 +03:00
if ( ! isset ( $aResult [ 'index-instances' ])) $aResult [ 'index-instances' ] = 1 ;
if ( ! isset ( $aResult [ 'index-rank' ])) $aResult [ 'index-rank' ] = 0 ;
2016-09-04 04:19:48 +03:00
date_default_timezone_set ( 'Etc/UTC' );
2019-02-24 18:14:36 +03:00
$oDB = new Nominatim\DB ();
$oDB -> connect ();
2020-06-28 19:06:06 +03:00
$fPostgresVersion = $oDB -> getPostgresVersion ();
2016-09-04 04:19:48 +03:00
2020-12-15 17:12:28 +03:00
$aDSNInfo = Nominatim\DB :: parseDSN ( getSetting ( 'DATABASE_DSN' ));
2018-09-05 23:01:03 +03:00
if ( ! isset ( $aDSNInfo [ 'port' ]) || ! $aDSNInfo [ 'port' ]) $aDSNInfo [ 'port' ] = 5432 ;
2016-09-04 04:19:48 +03:00
// cache memory to be used by osm2pgsql, should not be more than the available memory
2018-09-05 23:01:03 +03:00
$iCacheMemory = ( isset ( $aResult [ 'osm2pgsql-cache' ]) ? $aResult [ 'osm2pgsql-cache' ] : 2000 );
2016-09-08 04:16:22 +03:00
if ( $iCacheMemory + 500 > getTotalMemoryMB ()) {
2016-09-04 04:19:48 +03:00
$iCacheMemory = getCacheMemoryMB ();
echo " WARNING: resetting cache memory to $iCacheMemory\n " ;
}
2020-02-18 21:42:15 +03:00
2020-12-15 17:37:31 +03:00
$oOsm2pgsqlCmd = ( new \Nominatim\Shell ( getOsm2pgsqlBinary ()))
2020-02-18 21:42:15 +03:00
-> addParams ( '--hstore' )
-> addParams ( '--latlong' )
-> addParams ( '--append' )
-> addParams ( '--slim' )
2020-12-02 20:27:18 +03:00
-> addParams ( '--with-forward-dependencies' , 'false' )
-> addParams ( '--log-progress' , 'true' )
2020-02-18 21:42:15 +03:00
-> addParams ( '--number-processes' , 1 )
-> addParams ( '--cache' , $iCacheMemory )
-> addParams ( '--output' , 'gazetteer' )
2020-12-15 17:37:31 +03:00
-> addParams ( '--style' , getImportStyle ())
2020-02-18 21:42:15 +03:00
-> addParams ( '--database' , $aDSNInfo [ 'database' ])
-> addParams ( '--port' , $aDSNInfo [ 'port' ]);
2018-07-18 02:18:33 +03:00
if ( isset ( $aDSNInfo [ 'hostspec' ]) && $aDSNInfo [ 'hostspec' ]) {
2020-02-18 21:42:15 +03:00
$oOsm2pgsqlCmd -> addParams ( '--host' , $aDSNInfo [ 'hostspec' ]);
}
if ( isset ( $aDSNInfo [ 'username' ]) && $aDSNInfo [ 'username' ]) {
$oOsm2pgsqlCmd -> addParams ( '--user' , $aDSNInfo [ 'username' ]);
2018-07-18 02:18:33 +03:00
}
if ( isset ( $aDSNInfo [ 'password' ]) && $aDSNInfo [ 'password' ]) {
2020-02-18 21:42:15 +03:00
$oOsm2pgsqlCmd -> addEnvPair ( 'PGPASSWORD' , $aDSNInfo [ 'password' ]);
2018-07-18 02:18:33 +03:00
}
2020-12-15 17:37:31 +03:00
if ( getSetting ( 'FLATNODE_FILE' )) {
$oOsm2pgsqlCmd -> addParams ( '--flat-nodes' , getSetting ( 'FLATNODE_FILE' ));
2016-09-04 04:19:48 +03:00
}
2020-06-28 19:06:06 +03:00
if ( $fPostgresVersion >= 11.0 ) {
2020-06-28 19:24:29 +03:00
$oOsm2pgsqlCmd -> addEnvPair (
'PGOPTIONS' ,
'-c jit=off -c max_parallel_workers_per_gather=0'
);
2020-06-28 19:06:06 +03:00
}
2016-09-04 04:19:48 +03:00
2021-01-23 01:25:37 +03:00
$oNominatimCmd = new \Nominatim\Shell ( getSetting ( 'NOMINATIM_TOOL' ));
2021-01-17 23:02:50 +03:00
if ( $aResult [ 'quiet' ]) {
2021-01-23 01:25:37 +03:00
$oNominatimCmd -> addParams ( '--quiet' );
2020-07-28 23:35:51 +03:00
}
2020-01-31 20:17:42 +03:00
if ( $aResult [ 'verbose' ]) {
2021-01-23 01:25:37 +03:00
$oNominatimCmd -> addParams ( '--verbose' );
2020-02-18 21:42:15 +03:00
}
2020-01-29 13:36:12 +03:00
2020-02-18 21:42:15 +03:00
2017-05-25 17:26:09 +03:00
if ( $aResult [ 'init-updates' ]) {
2021-01-27 00:45:24 +03:00
$oCmd = ( clone ( $oNominatimCmd )) -> addParams ( 'replication' , '--init' );
2019-02-24 18:14:36 +03:00
2021-01-27 00:45:24 +03:00
if ( $aResult [ 'no-update-functions' ]) {
$oCmd -> addParams ( '--no-update-functions' );
2017-05-25 17:26:09 +03:00
}
2021-01-27 00:45:24 +03:00
$oCmd -> run ();
2017-05-25 17:26:09 +03:00
}
2018-01-02 00:22:06 +03:00
if ( $aResult [ 'check-for-updates' ]) {
2021-01-28 16:34:17 +03:00
exit (( clone ( $oNominatimCmd )) -> addParams ( 'replication' , '--check-for-updates' ) -> run ());
2018-01-02 00:22:06 +03:00
}
2017-05-25 17:26:09 +03:00
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' ];
2017-10-03 13:07:26 +03:00
2016-09-08 04:16:22 +03:00
if ( ! file_exists ( $sNextFile )) {
2016-09-04 04:19:48 +03:00
fail ( " Cannot open $sNextFile\n " );
}
// Import the file
2020-02-18 21:42:15 +03:00
$oCMD = ( clone $oOsm2pgsqlCmd ) -> addParams ( $sNextFile );
echo $oCMD -> escapedCmd () . " \n " ;
$iRet = $oCMD -> run ();
2016-09-04 04:19:48 +03:00
2020-02-18 21:42:15 +03:00
if ( $iRet ) {
fail ( " Error from osm2pgsql, $iRet\n " );
2016-09-04 04:19:48 +03:00
}
// Don't update the import status - we don't know what this file contains
}
2017-10-03 13:07:26 +03:00
if ( $aResult [ 'calculate-postcodes' ]) {
2021-01-23 01:25:37 +03:00
( clone ( $oNominatimCmd )) -> addParams ( 'refresh' , '--postcodes' ) -> run ();
2017-10-03 13:07:26 +03:00
}
2020-12-15 12:09:55 +03:00
$sTemporaryFile = CONST_InstallDir . '/osmosischange.osc' ;
2016-09-04 04:19:48 +03:00
$bHaveDiff = false ;
$bUseOSMApi = isset ( $aResult [ 'import-from-main-api' ]) && $aResult [ 'import-from-main-api' ];
$sContentURL = '' ;
2016-09-08 04:16:22 +03:00
if ( isset ( $aResult [ 'import-node' ]) && $aResult [ 'import-node' ]) {
if ( $bUseOSMApi ) {
2018-09-05 23:01:03 +03:00
$sContentURL = 'https://www.openstreetmap.org/api/0.6/node/' . $aResult [ 'import-node' ];
2016-09-08 04:16:22 +03:00
} else {
2018-09-05 23:01:03 +03:00
$sContentURL = 'https://overpass-api.de/api/interpreter?data=node(' . $aResult [ 'import-node' ] . ');out%20meta;' ;
2016-09-04 04:19:48 +03:00
}
}
2016-09-08 04:16:22 +03:00
if ( isset ( $aResult [ 'import-way' ]) && $aResult [ 'import-way' ]) {
if ( $bUseOSMApi ) {
2018-09-05 23:01:03 +03:00
$sContentURL = 'https://www.openstreetmap.org/api/0.6/way/' . $aResult [ 'import-way' ] . '/full' ;
2016-09-08 04:16:22 +03:00
} else {
2020-10-31 23:33:48 +03:00
$sContentURL = 'https://overpass-api.de/api/interpreter?data=(way(' . $aResult [ 'import-way' ] . ');%3E;);out%20meta;' ;
2016-09-04 04:19:48 +03:00
}
}
2016-09-08 04:16:22 +03:00
if ( isset ( $aResult [ 'import-relation' ]) && $aResult [ 'import-relation' ]) {
if ( $bUseOSMApi ) {
2020-10-31 23:33:48 +03:00
$sContentURL = 'https://www.openstreetmap.org/api/0.6/relation/' . $aResult [ 'import-relation' ] . '/full' ;
2016-09-08 04:16:22 +03:00
} else {
2020-10-31 23:33:48 +03:00
$sContentURL = 'https://overpass-api.de/api/interpreter?data=(rel(id:' . $aResult [ 'import-relation' ] . ');%3E;);out%20meta;' ;
2016-09-04 04:19:48 +03:00
}
}
2016-09-08 04:16:22 +03:00
if ( $sContentURL ) {
2017-05-25 17:26:09 +03:00
file_put_contents ( $sTemporaryFile , file_get_contents ( $sContentURL ));
2016-09-04 04:19:48 +03:00
$bHaveDiff = true ;
}
2016-09-08 04:16:22 +03:00
if ( $bHaveDiff ) {
2016-09-04 04:19:48 +03:00
// import generated change file
2020-02-18 21:42:15 +03:00
$oCMD = ( clone $oOsm2pgsqlCmd ) -> addParams ( $sTemporaryFile );
echo $oCMD -> escapedCmd () . " \n " ;
$iRet = $oCMD -> run ();
if ( $iRet ) {
fail ( " osm2pgsql exited with error level $iRet\n " );
2016-09-04 04:19:48 +03:00
}
}
2017-10-28 19:34:22 +03:00
if ( $aResult [ 'recompute-word-counts' ]) {
2021-01-23 01:25:37 +03:00
( clone ( $oNominatimCmd )) -> addParams ( 'refresh' , '--word-counts' ) -> run ();
2017-10-28 19:34:22 +03:00
}
2016-09-08 04:16:22 +03:00
if ( $aResult [ 'index' ]) {
2021-01-30 17:50:34 +03:00
( clone $oNominatimCmd )
-> addParams ( 'index' , '--minrank' , $aResult [ 'index-rank' ])
-> addParams ( '--threads' , $aResult [ 'index-instances' ])
-> run ();
2016-09-04 04:19:48 +03:00
}
2018-11-24 12:20:24 +03:00
if ( $aResult [ 'update-address-levels' ]) {
2021-01-23 19:25:14 +03:00
( clone ( $oNominatimCmd )) -> addParams ( 'refresh' , '--address-levels' ) -> run ();
2018-11-24 12:20:24 +03:00
}
2019-10-28 23:17:42 +03:00
if ( $aResult [ 'recompute-importance' ]) {
2019-11-01 12:07:04 +03:00
echo " Updating importance values for database. \n " ;
2019-10-28 23:17:42 +03:00
$oDB = new Nominatim\DB ();
$oDB -> connect ();
$sSQL = 'ALTER TABLE placex DISABLE TRIGGER ALL;' ;
2019-11-20 12:57:36 +03:00
$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);' ;
2019-10-28 23:17:42 +03:00
$sSQL .= 'ALTER TABLE placex ENABLE TRIGGER ALL;' ;
$oDB -> exec ( $sSQL );
}
2016-09-08 04:16:22 +03:00
if ( $aResult [ 'import-osmosis' ] || $aResult [ 'import-osmosis-all' ]) {
2021-01-30 17:50:34 +03:00
$oCmd = ( clone ( $oNominatimCmd ))
-> addParams ( 'replication' )
-> addParams ( '--threads' , $aResult [ 'index-instances' ]);
if ( ! $aResult [ 'import-osmosis-all' ]) {
$oCmd -> addParams ( '--once' );
2016-09-04 04:19:48 +03:00
}
2021-01-30 17:50:34 +03:00
if ( $aResult [ 'no-index' ]) {
$oCmd -> addParams ( '--no-index' );
2016-09-04 04:19:48 +03:00
}
2021-01-30 17:50:34 +03:00
exit ( $oCmd -> run ());
2016-09-04 04:19:48 +03:00
}