There is something like dbgeometry makevalid in .net 4.5

I am trying to calculate an area of ​​a polyline similar to the one

string poly = "POLYGON ((637604.918432772 2230520.64934531, 637622.257266129 2230419.44632915, 637279.107128549 2230192.04910755, 636765.470527745 2230179.6468564, 636778.005055813 2229861.77192838, 636529.81646905 2229464.29327025, 635813.486592791 2229523.30345774, 636017.385069448 2229974.32341381, 636267.323659164 2230070.32127916, 637035.026966561 2230404.70764784, 637275.265066307 2230401.13408429, 637604.918432772 2230520.64934531, 637604.918432772 2230520.64934531))"; DbGeometry gm = DbGeometry.FromText(poly, 32637); double area= gm.Area.Value; // here I got the error Exception has been thrown by the target of an invocation. 

I noticed later that the error of the error is that dbgeometry is not valid. I try the code in ms sql 2012, also give me an error, but when I tried it that way

 SELECT @gm.MakeValid().STArea() 

thats worked in sql my question is to make geometry valid in .net thanks

+3
source share
4 answers

I agree with Bojan if you are not using Entity Framework?

The SqlGeometry object has a MakeValid () function, therefore, using your example, allowing the conversion between DbGeography and SqlGeography:

 DbGeography geog; SqlGeometry geom = SqlGeometry.STGeomFromWKB(new SqlBytes(geog.AsBinary()), 32637); 

However, if you are not using EF, I would recommend just using SqlGeometry as

  • No broadcast / conversion
  • SqlGeometry has much more features available than DbGeometry.

Hope this helps.

+5
source

You definitely should not go to the database to get what you want. A simple and quick way is to extend DbGeography by adding the following code to the project:

 using System.Data.SqlTypes; using Microsoft.SqlServer.Types; namespace System.Data.Spatial { public static class DbGeometryExtension { public static DbGeometry MakeValid(this DbGeometry geom) { if (geom.IsValid) return geom; return DbGeometry.FromText(SqlGeometry.STGeomFromText(new SqlChars(geom.AsText()), 4326).MakeValid().STAsText().ToSqlString().ToString(), 4326); } } } 

There are several assumptions when creating this code, so do not use it β€œas is”.

+7
source

SqlSpatialFunctions.MakeValid is a SQL Server specific method.

If you're wondering why your geometry is invalid, you can ask SQL Server:

 SELECT @gm.IsValidDetailed() 

Alternatively, you might want to use the SQL Server geometry type directly: SqlGeometry.MakeValid .

+3
source

here the environment solves this problem that i am making a scallar function like this

 CREATE FUNCTION [dbo].[GeomMakeValid](@geom as geometry) RETURNS geometry AS BEGIN DECLARE @gm as geometry; set @gm = @geom.MakeValid(); return (@gm); END GO 

then I call it from such a model

 public static DbGeometry geoMakeValid(DbGeometry geom) { EntityConnection Connec = getConnection(); DbCommand com = Connec.StoreConnection.CreateCommand(); com.CommandText = "select dbo.GeomMakeValid(@geom)"; com.CommandType = System.Data.CommandType.Text; com.Parameters.Add(new SqlParameter("@geom", geom.AsText())); if (com.Connection.State == ConnectionState.Closed) com.Connection.Open(); try { var result = com.ExecuteScalar(); // should properly get your value Connec.Close(); return DbGeometry.FromText( result.ToString(),geom.CoordinateSystemId); } catch (System.Exception e) { } Connec.Close(); return geom; } 

any part of the code I can call this function to make the geometry valid

0
source

All Articles