我有一个我已导入MSSQL的形状文件,作为带有几何列的表。几何柱基本上是英国海岸线的轮廓。我被要求做的是能够提供纬度/经度并计算到海岸的最近距离
我已经确定我遇到的问题是我想要找到距离形状最近边缘的距离是在形状内,因此总是返回零距离。如果我在形状外(海上)尝试一个点,我会得到一个距离
我的问题是,有没有办法让SQL返回与内部的距离?如果没有,那么有没有办法颠倒形状?
答案 0 :(得分:1)
你的两个问题的答案都是热情的“是的!”。这里。我们。去。
确实有。您需要一种方法来计算多边形的边界(在这种情况下,它代表英国的陆地)。虽然没有类似于(我)有办法让SQL返回与内部的距离吗?
STBoundary()
数据类型的geometry
方法,但我们可以使用STRingN()
方法获取我们正在寻找的内容。具体来说,我们将使用STRingN(1)
来获取多边形中的第一个环(它应该代表多边形的外边界)。需要注意的是,如果你有一个MULTIPOLYGON而不是一个普通的POLYGON(比如,代表真实的世界事实,即大陆英格兰和爱尔兰是独立的陆地),你将做一些工作来分别获得每个多边形的边界。 STGeometryN()
然后从每个那些 中获取第一个响铃
如果没有,那么有没有办法颠倒形状?
幸运的是,在这种情况下我们不需要恢复到这个解决方案(但我确实鼓励你的想法在开箱即用!)。我说“幸运”,因为它不适合一个好的/通用的解决方案。那就是,如果这一点在英国之外呢?倒置英国多边形会让你回到原来的状态。你可以跳舞,做一些事情,比如“获取多边形及其倒置的距离并取任何数字不为零”。但反转多边形通常是一种有用的技术(因为你指定一个形状中的点的顺序很重要,有时你以“反向”的顺序提供它们,并最终得到整个世界的多边形一个英国形状的洞)。所有这些都是一种冗长的说法:ReorientObject()
方法正是您所寻找的。 p>
现在,对于完全不同的东西,有些代码:
declare @g geography = geography::STGeomFromText(
'POLYGON ((10 11, 10 10, 11 10, 11 11, 10 11))',
4326
),
@p geography = geography::Point(10.5, 10.5, 4326);
-- get the distance from @p to the boundary of @g
select @g.RingN(1).STDistance(@p);
-- because I think it's neat, here's the
-- shortest line between @g and @p
select @p.ShortestLineTo(@g.RingN(1)).STLength();
-- for academics' sake, find the "inverse" of @g
select @g, @g.ReorientObject();
答案 1 :(得分:0)
如果您想要 'polygon' 内线串的距离或最短线,那么最好使用 MULTILINESTRING!
declare @poly geography = geography::STGeomFromText('MULTILINESTRING((
2.644958 50.835404, 5.660705 50.779863, 5.776061 51.156926, 5.018005 51.411171,
4.254455 51.363178, 3.354564 51.383649, 2.545869 51.094872, 2.644958 50.835404 ))',4326)
declare @g geography = 0xE6100000011400000060487D49400000002079120C40000000005F804940000000A04B530C40
select @g
union all
select @g.ShortestLineTo(@poly)
union all
select @poly