Sql server SQL Server 2012,geography.STContains,结果错误?
我使用的是SQL Server 2012,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
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();