【问题标题】:npgsql with NetTopologySuite can't write 3D point带有 NetTopologySuite 的 npgsql 无法写入 3D 点
【发布时间】:2018-12-07 16:21:15
【问题描述】:

我正在尝试使用带有 NetTopologySuite 的 npgsql 将 3d 点(和线串)写入数据库表。我正在使用最新版本(4.0.3),显然已经解决了问题#1906。我的代码:

        NpgsqlConnection conn = new NpgsqlConnection ( "Host=localhost;Port=5433;Username=test;Password=test;Database=maindb" );
        conn.Open();
        conn.TypeMapper.UseNetTopologySuite( handleOrdinates: Ordinates.XYZ );
        NpgsqlCommand cmd = new NpgsqlCommand ( "INSERT INTO public.testtable (position) VALUES (@position)", conn );
        cmd.Parameters.Add ( "position", NpgsqlDbType.Geometry );
        NetTopologySuite.Geometries.Point pp = new NetTopologySuite.Geometries.Point ( 1, 2, 3 );
        cmd.Parameters["position"].Value = pp;
        cmd.ExecuteNonQuery();

但这不起作用,因为在表格中插入了一个普通的 2D 点。

我正在使用这个版本的包:

  • Npgsql v4.0.3
  • Npgsql.NetTopologySuite v1.0.2
  • NetTopologySuite v1.15.1
  • NetTopologySuite.IO.PostGis v1.15.0
  • GeoApi.Core v1.7.5

配置有问题还是我需要做一些其他事情才能使 3D 点正常工作?

P.S.:我找到了一种可行的解决方法,但老实说这看起来很难看:

        NpgsqlConnection conn = new NpgsqlConnection ( "Host=localhost;Port=5433;Username=test;Password=test;Database=maindb" );
        conn.Open();
        conn.TypeMapper.UseNetTopologySuite( handleOrdinates: Ordinates.XYZ );
        NpgsqlCommand cmd = new NpgsqlCommand ( "INSERT INTO public.testtable (position) VALUES (@position)", conn );
        cmd.Parameters.Add ( "position", NpgsqlDbType.Text );
        NetTopologySuite.Geometries.Point pp = new NetTopologySuite.Geometries.Point ( 1, 2, 3 );
        cmd.Parameters["position"].Value = pp.ToString();
        cmd.ExecuteNonQuery();

【问题讨论】:

  • 能否确认是否可以写二维点(即去掉第3个值)?
  • 我确认,二维点写得很好。实际上,当我尝试写一个 3D 点时,会存储一个 2D 点,去掉第三个坐标

标签: c# postgresql npgsql nettopologysuite


【解决方案1】:

您好像忘记将Ordinates.XYZ 传递给UseNetTopologySuite(),如the Npgsql docs 所示:

conn.TypeMapper.UseNetTopologySuite(handleOrdinates: Ordinates.XYZ);

【讨论】:

  • 好吧,那是个错误。我在示例中忘记了这一点,但我确实在生产代码中尝试过,但不幸的是不起作用。为了确认,我在提供的示例中也尝试过,并没有改变问题。
  • 我已更改代码以反映正确的类型映射器初始化
【解决方案2】:

好的,Npgsql (4.0.4) 和 Npgsql.NetTopologySuite (4.0.4) 的最新版本已解决问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2014-01-30
    • 2023-04-02
    相关资源
    最近更新 更多