Sql server SQL Server 2012,geography.STContains,结果错误?

Sql server SQL Server 2012,geography.STContains,结果错误?,sql-server,geospatial,sql-server-2012,Sql Server,Geospatial,Sql Server 2012,我使用的是SQL Server 2012,geography.STContains(),我不明白下面的代码失败的原因 如果我切换到几何体,它会工作 有人能解释一下吗 //丹尼尔 declare @geo geography set @geo = geography::STPolyFromText('POLYGON ((17.519133203852 59.8297423369731, 17.5190071588812 59.8296936773323, 17.5189979955459 59.8

我使用的是SQL Server 2012,
geography.STContains
(),我不明白下面的代码失败的原因

如果我切换到
几何体
,它会工作

有人能解释一下吗

//丹尼尔

declare @geo geography
set @geo = geography::STPolyFromText('POLYGON ((17.519133203852 59.8297423369731, 17.5190071588812 59.8296936773323, 17.5189979955459 59.8298203729009, 17.5191345140461 59.8298223425544, 17.519133203852 59.8297423369731))', 4326)

-- Is not within
declare @p1 geography
set @p1 = geography::STPointFromText('POINT(17.5184709839477 59.829925754067)', 4326)

-- Is within
declare @p2 geography
set @p2 = geography::STPointFromText('POINT(17.519060 59.829774)', 4326) 

select
    @geo.STContains(@p1), -- should be 0 is 1
    @geo.STContains(@p2) -- should be 1 is 0
更新: 如果我反转它们,效果很好,但我不明白:

declare @geo geography
set @geo = geography::STPolyFromText('POLYGON ((17.519133203852 59.8297423369731, 17.5190071588812 59.8296936773323, 17.5189979955459 59.8298203729009, 17.5191345140461 59.8298223425544, 17.519133203852 59.8297423369731))', 4326)

select
    @geo.STAsText() Polygon,
    @geo.STPointN(1).STAsText() Point1,
    @geo.STPointN(1).Lat Point1Latitud,
    @geo.STPointN(1).Long Point1Longitude
其结果是:

Polygon 
POLYGON ((17.519133203852 59.8297423369731, 17.5190071588812 59.8296936773323, 17.5189979955459 59.8298203729009, 17.5191345140461 59.8298223425544, 17.519133203852 59.8297423369731))

Point1  
POINT (17.519133203852 59.8297423369731)

Point1Latitud   
59,8297423369731

Point1Longitude
17,519133203852

现在我发现了问题所在。用户从右下角开始画多边形,然后顺时针画。如果我从最大纬度对点重新排序,然后通过按long排序进行逆时针排序,lat就行了。为它找到了一个助手,但这只有在“知道它错了”的情况下才有效:

只需制定一个小的解决方案就可以修复我的价值观:

还有一篇关于它的博客:

以及对真正“问题”的跟进,左手法则:


我认为起始位置无关紧要,但我同意顺时针/逆时针方向应该如此。文档中列出的唯一规则是左手规则:“如果我们使用地理数据类型存储空间实例,我们必须指定环的方向并准确描述实例的位置。椭球体系统中多边形的内部由左手规则定义。”。这是对2008年规则的一个更改(该规则规定必须占用少于一个半球,这是一个不同的规则,用于唯一标识连续曲面(如球体)上多边形的内部和外部)顺便说一句,即使你从最“右手边”开始,只要你逆时针走,这似乎真的有效。这不是左手边规则的真正含义——试试下面的引语:“如果你沿着多边形点之间的圆环走,按照它们列出的顺序,多边形的内部将在你的左手边。外部在右侧。因此,如果您从上方俯视多边形,则外环的点应按逆时针顺序定义,而内环应按顺时针顺序列出。”
if(sqlGeography.EnvelopeAngle() > 90)
    sqlGeography ? sqlGeography.ReorientObject();