Как получить ближайшую точку на объекте SqlGeometry от другого объекта SqlGeometry? - PullRequest
1 голос
/ 17 февраля 2010

У меня есть набор объектов линии и многоугольника (тип SqlGeometry) и точечный объект (тип SqlGeometry). Как мы можем найти ближайшую точку на каждой линии от данного точечного объекта? Есть ли API для этой операции?

Ответы [ 3 ]

6 голосов
/ 27 февраля 2010

Здесь приведен пример возможного решения с использованием 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)
3 голосов
/ 17 февраля 2010

Я не уверен, возможно ли это напрямую в 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()

В противном случае вам придется написать скрипт для чтения геометрии из вашей базы данных и использования отдельных пространственных библиотек.

2 голосов
/ 19 февраля 2010

Если вы заинтересованы в том, чтобы на самом деле найти ближайшую точку на линии (иначе называемую узлом), вы можете превратить каждую линию в набор точек с одинаковым lineid.Затем запросите ближайший и рассчитайте расстояние.

Если вместо этого вы пытаетесь вычислить расстояние от точки до ближайшей линии - stdistance http://msdn.microsoft.com/en-us/library/bb933808.aspx Я полагаю, что проблема в том, что другие адреса ответа заключаются в том, что вставить в предложение where, хотя вы могли быиспользуйте stdistance для указания расстояния, на котором вам все равно, например,

, где pointGeom.stdistance (lineGeom) <"расстояние, которое вас волнует" </strong>

...