我正在尝试使用c#将shapefile数据添加到postgis
string path = browse_path.Text;
ProcessStartInfo startInfo = new ProcessStartInfo("CMD.exe");
Process p = new Process();
startInfo.RedirectStandardInput = true;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
p = Process.Start(startInfo);
string chgdir = @"chdir " + @"C:\Program Files\PostgreSQL\9.4\bin\";
p.StandardInput.WriteLine(chgdir);
string pass = @"set PGPASSWORD=postgres";
p.StandardInput.WriteLine(pass);
string cmd = @"shp2pgsql -I -s 4326 " + path + " public.states | psql -U postgres -d postgres";
p.StandardInput.WriteLine(cmd);
p.WaitForExit();
p.Close();`
等待将近7-8分钟,它无法正常工作。我的shp文件只有160 kb ..但是如果我在cmd中运行它而不是使用代码,那么命令工作正常。
这是我写的一个函数,用于将shapefile导入PG。它使用Nuget包CliWrap和Npgsql,我只是将shp2pgsql及其依赖项复制到项目文件夹“Tools”,因此它可以在没有安装PostgreSQL的机器上运行。它有点乱,你可能需要添加错误处理,但它符合我的需要。
public async static Task<bool> OutputSHPtoPSGLAsync(string shpfile, string host, string user, string pwd, string db, string schema = "public", bool dropIfExists = true, string table = "[SHPNAME]")
{
FileInfo shp = new FileInfo(shpfile);
if (!shp.Exists) return false;
if (table == "[SHPNAME]") table = Path.GetFileNameWithoutExtension(shpfile).ToLower();
string args = string.Format("{0} {1}.{2}", shpfile, schema, table);
CliWrap.Cli cli = new CliWrap.Cli(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"tools\shp2pgsql.exe"));
ExecutionOutput eo = await cli.ExecuteAsync(args);
string sql = eo.StandardOutput;
if (dropIfExists) sql = sql.Replace("CREATE TABLE", string.Format("DROP TABLE IF EXISTS \"{0}\".\"{1}\";\r\nCREATE TABLE", schema, table));
string constring = string.Format("Host={0};Username={1};Password={2};Database={3}", host, user, pwd, db);
using (NpgsqlConnection connection = new NpgsqlConnection(constring))
{
connection.Open();
new NpgsqlCommand(sql, connection).ExecuteNonQuery();
}
return true;
}
我正在看NetTopologySuite,它具有与Npgsql和PostGIS兼容的类型定义,但它仍然预先发布,并且无法解决它的问题。