Nhibernate 将有效的几何图形持久化到Sql Server 2008地理列中

Nhibernate 将有效的几何图形持久化到Sql Server 2008地理列中,nhibernate,sql-server-2008,geometry,validation,geography,Nhibernate,Sql Server 2008,Geometry,Validation,Geography,我正在使用Spatial.NHibernate将一些几何图形保存到Sql Server 2008中的地理列中。以下是我的映射: public class AreaMapping : ClassMap<Area> { public AreaMapping() { Id(c => c.Id).GeneratedBy.HiLo(100.ToString()); Map(c => c.Name).Not.Nullable();

我正在使用Spatial.NHibernate将一些几何图形保存到Sql Server 2008中的地理列中。以下是我的映射:

public class AreaMapping : ClassMap<Area>
{
    public AreaMapping()
    {
        Id(c => c.Id).GeneratedBy.HiLo(100.ToString());
        Map(c => c.Name).Not.Nullable();
        Map(x => x.Boundary)
            .CustomTypeIs<MsSql2008GeographyType>()
            .Not.Nullable()
            .CustomSqlTypeIs("GEOGRAPHY");
    }
}
但是,当我要保存这样一个区域时:

Area area = new Area{ Boundary = new Polygon(new LinearRing(new ICoordinate[]{
                    new Coordinate(-1.911524, 55.136334),
                    new Coordinate(-1.912679, 55.136293),
                    new Coordinate(-1.912689, 55.136178),
                    new Coordinate(-1.911507, 55.136194),
                    new Coordinate(-1.911524, 55.136334)}))
Session.Save(area);
我得到以下错误:

指定的输入不代表 一个有效的地理实例

类型:System.ArgumentException 来源:Microsoft.SqlServer.Types 目标地点: Microsoft.SqlServer.Types.SqlGeography ConstructionGeographyFromUserInput(Microsoft.SqlServer.Types.GeoData, Int32)…等等

我知道一个地理类型的有效多边形必须逆时针绘制,并且必须是闭合的,并且不能重叠。我很确定我满足了所有这些限制(尽管如果我错了,请纠正我),所以我在这里有点困惑。要么我的多边形有问题,要么NHibernate没有正确地坚持它-欢迎任何帮助

编辑 好吧,我现在很困惑

为了简化,我将多边形更改为:

Area area = new Area{ Boundary = new Polygon(new LinearRing(new ICoordinate[]{
                    new Coordinate(10,15),
                    new Coordinate(10,5),
                    new Coordinate(20,5),
                    new Coordinate(20,15),
                    new Coordinate(10,15)}))
我也一样

指定的输入不代表 一个有效的地理实例

请注意,多边形是逆时针绘制的。但如果我把坐标改成顺时针方向:

Area area = new Area{ Boundary = new Polygon(new LinearRing(new ICoordinate[]{
                    new Coordinate(10,15),
                    new Coordinate(20,15),
                    new Coordinate(20,5),
                    new Coordinate(10,5),
                    new Coordinate(10,15)}))

看起来没问题。顺时针方向有效吗?好的,我知道发生了什么。微软,以其内在的智慧,似乎违背了整个世界其他地区的利益,并决定在他们的WKT地理坐标表示法中,他们将纬度置于经度(Y,X)之前

十、 是吗?你可能会问?!显然,他们有自己的理由,但普遍的共识是这很糟糕,所以他们是

它很糟糕,因为它完全破坏了互操作性。当NHibernate spatial持久化我用来持久化地理(IGeography类型)的NetTopologySuite对象时,它会将坐标写出为X,Y(我认为它应该工作的自然、预期的方式)。当SQL server遇到这种情况时,它试图将X解释为Y,将Y解释为X,因此我的所有问题都是无效类型

所以现在我要么修复NHibernate,要么交换代码中的坐标。微软,为你给我带来如此痛苦而感到羞耻

Area area = new Area{ Boundary = new Polygon(new LinearRing(new ICoordinate[]{
                    new Coordinate(10,15),
                    new Coordinate(20,15),
                    new Coordinate(20,5),
                    new Coordinate(10,5),
                    new Coordinate(10,15)}))