我正在使用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");
}
}
映射似乎有效。这是课堂:
public class Area
{
public virtual Guid Id { get; set; }
public virtual Polygon Boundary { get; set; }
public virtual string Name { get; set; }
}
但是,当我要保存这样的区域时:
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
TargetSite:
Microsoft.SqlServer.Types.SqlGeography公司
ConstructGeographyFromuserinput(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)}))
我也一样
指定的输入不表示
有效的地理实例。
请注意,绘制的是多边形
逆时针
(
as it should be according to various sources
)但如果我把坐标改成顺时针方向:
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)}))
好像没事。那么顺时针方向有效吗?