I'm trying to calculate area of polyline like that
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 reson of error that the dbgeometry is invalid I try the code in ms sql 2012 also give me the error but when I tried like that
SELECT @gm.MakeValid().STArea()
thats worked in sql my question is there is away to make the geometry valid in .net thank you
You definitely should not go to the DB to get what you want. A simple and fast method is to extend DbGeography by adding the following code to your 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 a few assumptions made when creating this code so don't use it "as is".
I'd agree with Bojan, unless you are using the Entity Framework?
The SqlGeometry object has a MakeValid() function, so using your example, allowing for a convert between DbGeography and SqlGeography:
DbGeography geog;
SqlGeometry geom = SqlGeometry.STGeomFromWKB(new SqlBytes(geog.AsBinary()), 32637);
However, unless you are using EF, I'd recommend simply using SqlGeometry as
Hope that helps.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With