MSSQL Geometry,从形状内部的点到最近的边缘的距离
MSSQL Geometry, distance from point inside shape to closest edge
我有一个形状文件,我已将其导入到 MSSQL 作为 table 和几何列。几何柱本质上是英国海岸线的轮廓。我被要求做的是能够提供 latitude/longitude 并计算离海岸最近的距离
我已经确定我遇到的问题是我想要找到的点到形状最近边缘的距离在形状内,因此总是 returns 距离为零。如果我尝试形状外的一个点(在海上),我会得到一个距离
我的问题是,有没有办法让里面的距离SQL到return?如果不是那么有没有办法反转形状?
你的两个问题的答案都很热情 "yes!"。这里。我们。去吧
(I)s there a way to get SQL to return the distance from with inside?
当然有。您需要一种方法来计算多边形的边界(在本例中,多边形代表英国陆地)。虽然没有像 geometry
数据类型那样的 STBoundary()
方法,但我们可以使用 STRingN()
方法获得我们正在寻找的内容。具体来说,我们将使用 STRingN(1)
来获取多边形中的第一个环(它应该代表多边形的外边界)。一个警告是,如果你有一个 MULTIPOLYGON 而不是一个普通的 POLYGON(比如,代表英格兰大陆和爱尔兰是独立的大陆的现实世界事实),你将不得不做一些工作来分别获得每个多边形的边界STGeometryN()
然后从那些
中的每一个获得第一个戒指
If not then is there a way to invert the shape?
幸运的是,在这种情况下我们不需要恢复到此解决方案(但我确实为您跳出框框的想法鼓掌!)。我说 "fortunately" 是因为它不适合 good/generic 解决方案。也就是说,如果该点不在英国怎么办?反转英国多边形会让您回到原来的状态。您可以在其中跳舞并做类似 "get the distance to both the polygon and its inversion and take whichever number isn't zero" 的事情。但是反转多边形 通常是 一种有用的技术(因为您在形状中指定点的顺序很重要,有时您以 "reverse" 顺序提供它们,并最终得到一个多边形整个世界都有一个英国形的洞)。所有这些都是冗长的说法:ReorientObject()
方法就是您要找的。
现在为了完全不同的东西,一些代码:
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();
如果您想要 '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
我有一个形状文件,我已将其导入到 MSSQL 作为 table 和几何列。几何柱本质上是英国海岸线的轮廓。我被要求做的是能够提供 latitude/longitude 并计算离海岸最近的距离
我已经确定我遇到的问题是我想要找到的点到形状最近边缘的距离在形状内,因此总是 returns 距离为零。如果我尝试形状外的一个点(在海上),我会得到一个距离
我的问题是,有没有办法让里面的距离SQL到return?如果不是那么有没有办法反转形状?
你的两个问题的答案都很热情 "yes!"。这里。我们。去吧
(I)s there a way to get SQL to return the distance from with inside?
当然有。您需要一种方法来计算多边形的边界(在本例中,多边形代表英国陆地)。虽然没有像 geometry
数据类型那样的 STBoundary()
方法,但我们可以使用 STRingN()
方法获得我们正在寻找的内容。具体来说,我们将使用 STRingN(1)
来获取多边形中的第一个环(它应该代表多边形的外边界)。一个警告是,如果你有一个 MULTIPOLYGON 而不是一个普通的 POLYGON(比如,代表英格兰大陆和爱尔兰是独立的大陆的现实世界事实),你将不得不做一些工作来分别获得每个多边形的边界STGeometryN()
然后从那些
If not then is there a way to invert the shape?
幸运的是,在这种情况下我们不需要恢复到此解决方案(但我确实为您跳出框框的想法鼓掌!)。我说 "fortunately" 是因为它不适合 good/generic 解决方案。也就是说,如果该点不在英国怎么办?反转英国多边形会让您回到原来的状态。您可以在其中跳舞并做类似 "get the distance to both the polygon and its inversion and take whichever number isn't zero" 的事情。但是反转多边形 通常是 一种有用的技术(因为您在形状中指定点的顺序很重要,有时您以 "reverse" 顺序提供它们,并最终得到一个多边形整个世界都有一个英国形的洞)。所有这些都是冗长的说法:ReorientObject()
方法就是您要找的。
现在为了完全不同的东西,一些代码:
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();
如果您想要 '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