Como obter o ponto mais próximo em um objeto SQLGEOMETRY de outro objeto SQLGEOMETRY?

StackOverflow https://stackoverflow.com/questions/2279795

  •  21-09-2019
  •  | 
  •  

Pergunta

Eu tenho um conjunto de objeto de linha e polígono (tipo sqlgeometria) e um objeto de ponto (tipo SQLGEOMETRY). Como podemos encontrar o ponto mais próximo em cada linha do objeto de ponto especificado? Existe alguma API para fazer esta operação?

Foi útil?

Solução

Não tenho certeza se isso é possível diretamente no SQL Server 2008:

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

A solução alternativa sugerida nesse tópico é:

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

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

Caso contrário, você teria que escrever um script para ler a geometria do seu banco de dados e usar bibliotecas espaciais separadas.

Outras dicas

Aqui é necessária uma amostra que apresenta uma solução possível usando SQLGEOMETRIA e C#, nenhum servidor SQL é necessário:

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))");
        }
    }
}

A saída do programa:

POINT (20 20)
POINT (160 150)
POINT (10 10)
POINT (70 160)

Se você estiver interessado em encontrar o ponto mais próximo da linha (caso contrário, chamado de nó), poderá transformar cada linha em um conjunto de pontos com o mesmo lineid. Em seguida, consulte o mais próximo e calcule a distância.

Se você estiver tentando calcular a distância de um ponto até a linha mais próxima - stistancehttp://msdn.microsoft.com/en-us/library/bb933808.aspxEu acho que o problema que a outra resposta aborda é o que colocar na sua cláusula onde você pode usar a stdistance para especificar uma distância acima da qual você não se importa como

Onde Pointgeom.stdistance (LineGeom) <"Distância que você se preocupa"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top