1

我有一组线和多边形对象(SqlGeometry 类型)和一个点对象(SqlGeometry 类型)。我们如何从给定的点对象中找到每条线上最近的点?是否有任何 API 可以执行此操作?

4

3 回答 3

6

这里有一个示例,展示了使用 SqlGeometry 和 C# 的可能解决方案,不需要 SQL Server:

using System;
using Microsoft.SqlServer.Types;
namespace MySqlGeometryTest
{
    class ReportNearestPointTest
    {
        static void ReportNearestPoint(string wktPoint, string wktGeom)
        {
            SqlGeometry point = SqlGeometry.Parse(wktPoint);
            SqlGeometry geom = SqlGeometry.Parse(wktGeom);
            double distance = point.STDistance(geom).Value;
            SqlGeometry pointBuffer = point.STBuffer(distance);
            SqlGeometry pointResult = pointBuffer.STIntersection(geom);
            string wktResult = new string(pointResult.STAsText().Value);
            Console.WriteLine(wktResult);
        }

        static void Main(string[] args)
        {
            ReportNearestPoint("POINT(10 10)", "MULTIPOINT (80 70, 20 20, 200 170, 140 120)");
            ReportNearestPoint("POINT(110 200)", "LINESTRING (90 80, 160 150, 300 150, 340 150, 340 240)");
            ReportNearestPoint("POINT(0 0)", "POLYGON((10 20, 10 10, 20 10, 20 20, 10 20))");
            ReportNearestPoint("POINT(70 170)", "POLYGON ((110 230, 80 160, 20 160, 20 20, 200 20, 200 160, 140 160, 110 230))");
        }
    }
}

程序输出:

POINT (20 20)
POINT (160 150)
POINT (10 10)
POINT (70 160)
于 2010-02-27T01:18:26.200 回答
3

我不确定这是否可以直接在 SQL Server 2008 中实现:

http://social.msdn.microsoft.com/Forums/en/sqlspatial/thread/cb094fb8-07ba-4219-8d3d-572874c271b5

该线程中建议的解决方法是:

declare @g geometry = 'LINESTRING(0 0, 10 10)' 
declare @h geometry = 'POINT(0 10)' 

select @h.STBuffer(@h.STDistance(@g)).STIntersection(@g).ToString()

否则,您将不得不编写脚本来从数据库中读取几何图形并使用单独的空间库。

于 2010-02-17T12:35:32.843 回答
2

如果您有兴趣实际找到在线上最近的点(也称为节点),您可以将每条线变成一组具有相同 lineid 的点。然后查询最近的并计算距离。

相反,如果您尝试计算从一个点到最近线的距离 - stdistance http://msdn.microsoft.com/en-us/library/bb933808.aspx 我猜其他答案地址的问题是放什么在您的 where 子句中,尽管您可以使用 stdistance 来指定您不关心的距离,例如

其中 pointGeom.stdistance(lineGeom) < "你关心的距离"

于 2010-02-19T06:03:32.507 回答