npgsql with NetTopologySuite can't write 3D point

798 Views Asked by At

I'm trying to write a 3d point (and linestring) to a database table using npgsql with NetTopologySuite. I'm using last release (4.0.3), as apparently has resolved issue #1906. My code:

        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();

But this does not work, as inserts a plain 2D point into the table.

I'm using this versions of packages:

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

Is there something wrong with configuration or have I to do some other things to make the 3D point to work?

P.S.: I've found a workaround that works, but sincerely that seems ugly:

        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

There are 2 best solutions below

0
On BEST ANSWER

Ok, issue has been resolved with last release of Npgsql (4.0.4) and Npgsql.NetTopologySuite (4.0.4)

2
On

It seems like you forgot to pass Ordinates.XYZ to UseNetTopologySuite(), as shown in the Npgsql docs:

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