204 lines
5.5 KiB
Perl
204 lines
5.5 KiB
Perl
#!/usr/bin/perl
|
|
|
|
require './geohelm-lib.pl';
|
|
require './pg-lib.pl';
|
|
|
|
use File::Basename;
|
|
use File::Path 'rmtree';
|
|
|
|
foreign_require('postgresql', 'postgresql-lib.pl');
|
|
foreign_require('proc', 'proc-lib.pl');
|
|
|
|
&ui_print_header(undef, $text{'add_osm_title'}, "");
|
|
|
|
print <<EOF;
|
|
<script type="text/javascript">
|
|
function update_select(){
|
|
var dbnameSel = document.getElementById('db_name');
|
|
var dbname = dbnameSel.options[dbnameSel.selectedIndex].value;
|
|
|
|
get_pjax_content('/postgis/add_osm.cgi?db_name='+dbname);
|
|
}
|
|
</script>
|
|
EOF
|
|
|
|
print "$text{'add_osm_desc1'}<p>\n";
|
|
|
|
my $output = '';
|
|
|
|
my $sel_db = '';
|
|
my @pg_dbs = pg_list_databases();
|
|
my @opt_dbs = ();
|
|
foreach my $db_name (@pg_dbs) {
|
|
push(@opt_dbs, [ $db_name, $db_name]);
|
|
}
|
|
|
|
sub inst_error{
|
|
print "<b>$main::whatfailed : $_[0]</b> <p>\n";
|
|
&ui_print_footer("", $text{'index_return'});
|
|
exit;
|
|
}
|
|
|
|
sub build_osm2pgsql_opt(){
|
|
my $opt = '';
|
|
|
|
$opt = $in{'db_mode'};
|
|
$opt .= ' '.$in{'osm_coor_fmt'};
|
|
$opt .= ' -C '.$in{'osm_mem_cache'};
|
|
$opt .= ' --number-processes '.$in{'osm_cpu_cores'};
|
|
|
|
if($in{'optE'} && ($in{'optE'} =~ /^[0-9]+$/)){
|
|
$opt .= ' -E '.$in{'optE'};
|
|
}
|
|
|
|
my @optChars = ('s', 'k');
|
|
foreach my $c (@optChars){
|
|
if($in{'opt'.$c}){
|
|
$opt .= ' -'.$c;
|
|
}
|
|
}
|
|
return $opt;
|
|
}
|
|
|
|
sub add_osm{
|
|
my $osm2pgsql_opt = $_[0];
|
|
my $pbf_path = $_[1];
|
|
my $pbf_name = file_basename($pbf_path);
|
|
|
|
|
|
my $table_schema;
|
|
if($in{'db_schema_new'} eq ""){
|
|
$table_schema = $in{'db_schema'};
|
|
}else{ #create new schema
|
|
$table_schema = $in{'db_schema_new'};
|
|
&error_setup(&text('db_err1', 'Creating new schema'));
|
|
local $t = postgresql::execute_sql_safe($sel_db, "CREATE SCHEMA $table_schema AUTHORIZATION $in{'db_user'}");
|
|
}
|
|
|
|
my $table_name = $table_schema.'.';
|
|
if($in{'db_table_new'} eq ""){
|
|
if($in{'db_table'} eq ""){
|
|
|
|
$table_name .= substr($pbf_name, 0, rindex($pbf_name, '.')); #drop file extension
|
|
}else{
|
|
$table_name .= $in{'db_table'};
|
|
}
|
|
}else{
|
|
$table_name .= $in{'db_table_new'};
|
|
}
|
|
|
|
$osm2pgsql_opt .= " -U $in{'db_user'} -d $in{'db_name'}";
|
|
|
|
#build command line
|
|
my $cmd = &has_command('osm2pgsql')." $osm2pgsql_opt $pbf_path";
|
|
|
|
#insert shape in db
|
|
my $cmd_out;
|
|
my $cmd_err;
|
|
local $out = &execute_command($cmd, undef, \$cmd_out, \$cmd_err, 0, 0);
|
|
|
|
rmtree($shp_dir); #remove temp dir
|
|
|
|
$output .= "<b>Loader Results:</b>";
|
|
$output .= "<br><tt>$cmd</tt><br>";
|
|
$output .= &html_escape($cmd_err);
|
|
$output .= &html_escape($cmd_out);
|
|
|
|
$output =~ s/(\r?\n)+/<br>/g;
|
|
}
|
|
|
|
if($ENV{'CONTENT_TYPE'} =~ /boundary=(.*)$/) {
|
|
&ReadParseMime();
|
|
$sel_db = $in{'db_name'};
|
|
|
|
my $pbfname = process_file_source();
|
|
if($pbfname ne ""){
|
|
my $osm2pgsql_opt = build_osm2pgsql_opt();
|
|
add_osm($osm2pgsql_opt, $pbfname);
|
|
}
|
|
}else {
|
|
&ReadParse();
|
|
$no_upload = 1;
|
|
$sel_db = $in{'db_name'} ? $in{'db_name'} : 'postgres';
|
|
}
|
|
|
|
local $t = postgresql::execute_sql_safe($sel_db, 'select usename from pg_user');
|
|
my @pg_users = sort { lc($a) cmp lc($b) } map { $_->[0] } @{$t->{'data'}};
|
|
my @opt_users = ();
|
|
foreach my $name (@pg_users) {
|
|
push(@opt_users, [ $name, $name]);
|
|
}
|
|
|
|
$t = postgresql::execute_sql_safe($sel_db, 'select schema_name from information_schema.schemata');
|
|
my @pg_schemas = sort { lc($a) cmp lc($b) } map { $_->[0] } @{$t->{'data'}};
|
|
my @opt_schemas = ();
|
|
push(@opt_schemas, ['public', 'public']);
|
|
foreach my $name (@pg_schemas) {
|
|
push(@opt_schemas, [ $name, $name]);
|
|
}
|
|
|
|
my @db_tables = postgresql::list_tables($sel_db);
|
|
my @opt_tbls = ();
|
|
foreach my $name (@db_tables) {
|
|
push(@opt_tbls, [ $name, $name]);
|
|
}
|
|
print &ui_form_start("add_osm.cgi", "form-data");
|
|
print &ui_table_start($text{'shape_install'}, undef, 2);
|
|
|
|
print &ui_table_row($text{'pg_ext_database'}, &ui_select("db_name", $sel_db, \@opt_dbs, 1, 0,
|
|
undef, undef, 'id="db_name" onchange="update_select()"'), 2);
|
|
print &ui_table_row($text{'db_user'}, &ui_select("db_user", undef, \@opt_users, 1, 0), 2);
|
|
print &ui_table_row($text{'db_schema'}, &ui_select("db_schema", 'public', \@opt_schemas, 1, 0).
|
|
' or '.&ui_textbox("db_schema_new", '', 10).
|
|
' <b>New schema name</b>'
|
|
, 2);
|
|
|
|
print &ui_table_row($text{'osm_source'},
|
|
&ui_radio_table("source", 0,
|
|
[
|
|
[ 0, $text{'source_local'}, &ui_textbox("file", undef, 40)." ". &file_chooser_button("file", 0) ],
|
|
[ 1, $text{'source_uploaded'},&ui_upload("upload", 40) ],
|
|
[ 2, $text{'source_ftp'}, &ui_textbox("url", undef, 40) ]
|
|
]),
|
|
2);
|
|
|
|
print &ui_table_row(undef, '<b>Load options:</b>', 2);
|
|
|
|
print &ui_table_row($text{'slim_mode'}, &ui_checkbox('opts', '-s', '( --slim )', 0), 2);
|
|
print &ui_table_row($text{'osm_hstore'}, &ui_checkbox('optk', '-k', '( --hstore )', 0), 2);
|
|
|
|
my @opt_coor_opt = (['-m', 'mercator'], ['-l', 'lat&long']);
|
|
print &ui_table_row($text{'osm_coor_fmt'}, &ui_select("osm_coor_fmt", undef, \@opt_coor_opt, 1, 0), 2);
|
|
|
|
print &ui_table_row($text{'osm_epsg'}, &ui_textbox("optE", undef, 10), 2);
|
|
|
|
my @opt_mem_opt = (['200', '200MB'], ['800', '800MB']);
|
|
@m = &proc::get_memory_info();
|
|
if(@m){
|
|
my $free_mem_gb = $m[1] / (1024*1024);
|
|
for my $n (1..$free_mem_gb){
|
|
push(@opt_mem_opt, [$n*1000, $n.'GB']);
|
|
}
|
|
}
|
|
print &ui_table_row($text{'osm_mem_cache'}, &ui_select("osm_mem_cache", undef, \@opt_mem_opt, 1, 0), 2);
|
|
|
|
my @opt_cpu_opt = ([1,1]);
|
|
@c = &proc::get_cpu_info();
|
|
if(@c){
|
|
for my $n (1..$c[7]){
|
|
push(@opt_mem_opt, [$n, $n]);
|
|
}
|
|
}
|
|
print &ui_table_row($text{'osm_cpu_cores'}, &ui_select("osm_cpu_cores", undef, \@opt_cpu_opt, 1, 0), 2);
|
|
|
|
print &ui_table_end();
|
|
print &ui_form_end([ [ "", $text{'shape_load'} ] ]);
|
|
|
|
|
|
if($output ne ""){
|
|
|
|
print ui_hr().'<br>'.$output;
|
|
}
|
|
|
|
&ui_print_footer("", $text{'index_return'});
|