我试图获取多边形内的所有点,经过几次测试后我终于抓住了。
STIntersects
总是为我的所有实体返回1,即使在某个点"视觉上"不是多边形。
我找到了关于多边形创建方向的帖子并尝试了但是它没有帮助我:)
所以我决定创建一个简单的案例:
这里是a link谷歌地图带积分
这次测试的结果让我脱离了车辙
declare @cw geography, @ccw geography, @pointIn geography, @pointOut geography
-- counterclockwise direction from bottom left corner
set @ccw = geography::STPolyFromText (
'POLYGON((
55.0 37.0
,55.0 38.0
,56.0 38.0
,56.0 37.0
,55.0 37.0
))', 4326
)
-- clockwise direction from bottom left corner
set @cw = geography::STPolyFromText (
'POLYGON((
55.0 37.0
,56.0 37.0
,56.0 38.0
,55.0 38.0
,55.0 37.0
))', 4326
)
set @pointIn = geography::Point(55.5, 37.5, 4326)
set @pointOut = geography::Point(54, 36, 4326)
select @pointIn.STIntersects(@ccw) ccw, @pointIn.STIntersects(@cw) cw
-- result: 1 0
--here i should get inversed values, but it didnt happens
select @pointOut.STIntersects(@ccw) ccw, @pointOut.STIntersects(@cw) cw
-- result: 1 0
为什么会这样?我无法理解我所缺少的东西
我希望当我的多边形很小时pointIn
应返回1,当我的多边形是整个世界减去所选区域时返回0,并且pointOut
应该在第一种情况下返回0并返回1第二个
但两个点在逆时针多边形中返回1。
更新
finaly
我的错误是geography::STPolyFromText
的输入参数的顺序
首先应该是lng和第二个lat。
在扩展中,顺序是不同的
msdn says:Point ( Lat, Long, SRID )
答案 0 :(得分:1)
在SqlGeography实例中,@ ccw定义了一个洞(由于它是逆时针顺序)。由于此孔不在多边形内,因此它成为Globe中的一个洞。换句话说,你得到一个覆盖整个地球的多边形,减去你的@cw多边形。
Geography::Point也使用反向坐标到WKT,因此我相信您的纬度和经度坐标是错误的方式(不可能完全确定),因为只有您知道您的数据。无论如何,附图应足以解释这一点。 “橙色”颜色是@ccw,蓝色是@cw,其余部分是标记的。
如果您有SSMS,可以使用以下查询对其进行可视化,请注意这些点是缓冲的,以便您可以看到它们。
select
'Clockwise' AS Label,
@cw AS Item
union all
select
'Counter-Clockwise' AS Label,
@ccw AS Item
union all
select
'Point In' AS Label,
@pointIn.STBuffer(100000) AS Item
union all
select
'Point Out' AS Label,
@pointOut.STBuffer(100000) AS Item
希望它有所帮助。