我正在尝试编写一个代码,告诉我点是否在多边形内部
DECLARE @Latitude varchar(20) = '41.694110'
DECLARE @Longitude varchar(20) = '44.833680'
DECLARE @g geography;
DECLARE @p geography;
DECLARE @PolygonString varchar(500) = 'POLYGON((41.711921 44.658505, 41.851703 44.773175, 41.763158 44.972302, 41.654421 44.843083, 41.711921 44.658505))'
SET @g = geography::STGeomFromText(@PolygonString, 4326);
SET @p = geography::Point(@Latitude, @Longitude, 4326)
SELECT @g.STIntersects(@p)
它总是返回0.这是场景的直观表示。
任何想法我的代码有什么问题?
感谢。
答案 0 :(得分:2)
DECLARE @Latitude varchar(20) = '41.694110'
DECLARE @Longitude varchar(20) = '44.833680'
DECLARE @g geography;
DECLARE @p geography;
DECLARE @PolygonString varchar(500) = 'POLYGON((44.658505 41.711921, 44.843083 41.654421, 44.972302 41.763158, 44.773175 41.851703, 44.658505 41.711921))'
SET @g = geography::STGeomFromText(@PolygonString, 4326);
SET @p = geography::Point(@Latitude, @Longitude, 4326)
SELECT @g.STIntersects(@p)
--1
因此对于Points,排序是Lat / Long,但看起来对于多边形,排序被解释为Long / Lat。记住这一点,这应该是轻而易举的。
答案 1 :(得分:1)
我不是地理空间类型的专家,但可以给你一些想法。 对于WKT字符串(用于制作多边形的字符串),对需要是长/纬度而不是纬度/长度。
那就是说,我仍然无法将你的多边形识别为地理位置有效,因为我没有应用Jaaz后来指出的逆时针规则。所以我使用的几何类型不是限制性的,而且它可以正常工作。
使用几何体作为多边形,POINT
也必须是几何体。在这种情况下,geometry::POINT()
需要X,Y坐标(lng / lat)而不是与地理类型一起使用的lat / lng对。
因此,这将在交叉点上产生true:
DECLARE @Latitude float = 41.694110
DECLARE @Longitude float = 44.833680
DECLARE @g geometry = geometry::Point(@Longitude, @Latitude, 4326)
DECLARE @p geometry = geometry::STPolyFromText('POLYGON((44.658505 41.711921, 44.773175 41.851703, 44.972302 41.763158, 44.843083 41.654421, 44.658505 41.711921))', 4326);
SELECT @g.STIntersects(@p)