使用NetTopologySuite的npgsql无法编写3D点

时间:2018-10-08 08:21:33

标签: c# postgresql npgsql nettopologysuite

我正在尝试使用带有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();

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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