如何使用c#将shapefile数据添加到postgis(postgres)

问题描述 投票:0回答:1

我正在尝试使用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中运行它而不是使用代码,那么命令工作正常。

gis postgis shapefile geoserver arcgis-server
1个回答
1
投票

这是我写的一个函数,用于将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兼容的类型定义,但它仍然预先发布,并且无法解决它的问题。

© www.soinside.com 2019 - 2024. All rights reserved.