计算沿预定义线串从线串开始到围绕该线串的缓冲区域内的点的路线长度

Posted

技术标签:

【中文标题】计算沿预定义线串从线串开始到围绕该线串的缓冲区域内的点的路线长度【英文标题】:Calculate length of route along the predefined line-string from beginning of line-string to points within a buffered region around that line-string 【发布时间】:2017-06-01 14:59:43 【问题描述】:

到目前为止,我已经过滤了我的结果以查看它们是否属于缓冲的线串。现在我想计算线段的长度,沿着线串,从路线的开始到第 3 列和第 4 列中列出的每个纬度和经度。

我想要的距离如下图所示:

declare @TripRecordsReportWaypoints table(Column1 int, column3 decimal(25,10), Column4 decimal(25,10), InRouteBuffer bit);
insert into @TripRecordsReportWaypoints values (210,40.1445,-82.9911,1),(211,40.1444,-82.991 ,1),(212,40.1442,-82.9909,1),(213,40.1441,-82.9907,1),(214,40.144 ,-82.9906,1);

declare @Columbus106from71to23 geography;
set @Columbus106from71to23 = Geography ::STLineFromText('LINESTRING(-82.969404 40.142222,-82.972580 40.141951,-82.976319 40.141602, -82.979534 40.141376,-82.981217 40.141339,-82.983593 40.141409)',4326);

declare @Routebuffer geography;
set @Routebuffer = @Columbus106from71to23.STBuffer('20');

select Column1
      ,Column3
      ,Column4
      ,@Routebuffer.STContains(geography::Point(Column3,Column4,4326)) as InRouteBuffer
from @TripRecordsReportWaypoints
where @Routebuffer.STContains(geography::Point(Column3,Column4,4326)) = 1;

我需要做什么来计算从我定义的线串开始到每个纬度、经度的线段的距离。我想有一列是DistanceAlongRoute。

【问题讨论】:

【参考方案1】:

我不完全确定您的数据和您的需求发生了什么,因为您问题中的数据并没有真正意义,但是....

要查找两个geography 点之间的距离,您可以使用GeogPoint.STDistance(OtherGeogPoint) 函数,该函数将返回以米为单位的距离。

要找到geography linestring 的开头,您可以使用带有数字1GeogLineString.STStartPoint()GeogLineString.STPointN(PointNumberYouWantToReturn),它们在功能上是等效的,尽管STPointN 确实给了您更多的灵活性应该您想稍后更改您的积分。

综合起来,如下所示:

select Column1
      ,Column3
      ,Column4
      ,geography::Point(Column3,Column4,4326).STDistance(@Routebuffer.STPointN(1)) as StartPointToPointMetres
from @TripRecordsReportWaypoints;

根据下面的 cmets,这里有另一个函数可以帮助你到达你需要去的地方:

.ShortestLineTo() 将找到一种 geography 类型和另一种类型之间的最短线,在您的情况下如下所示:

@Columbus106from71to23.ShortestLineTo(geography::Point(Column3,Column4,4326)).STStartPoint() as LineFromRouteToPoint

【讨论】:

戴夫,我想知道某个点沿路线有多远。有没有一种简单的方法来计算这个?我不想要直线距离,我想要从线串的起点,沿着线到我的数据集中的点的距离。这是否更有意义。 在这种情况下,您可能需要调整问题中的数据/查询,因为您的数据中的任何点实际上都不在您问题的缓冲区中。其次,您所说的沿路线有多远是什么意思?如果该点在缓冲区内,您是要沿着linestring 直行到该点的正北或正南,然后直线到达该点,还是从最近的部分走最短路线? 如果该点在缓冲区内,我想沿着线串行进,直到它到达距离线最近部分最短的点。所以从线串的起点一直沿着线串直到它在线串上的最近点到第 3 列和第 4 列中给出的点的距离。 我在原始帖子中添加了一张照片,解释了我要计算的距离。您的编辑是否计算了我所描绘的内容? 有任何可以计算的程序或服务的想法吗?

以上是关于计算沿预定义线串从线串开始到围绕该线串的缓冲区域内的点的路线长度的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 地理

mapbox GL js中线串周围的可点击区域

如何计算 PostGIS 中离线串最近的点?

从相交的线串计算有界多边形

用 Colomap 绘制线串 - Geopandas 和 Folium

如何在Boost几何中使用多个线串创建盒子?