Determinando o ponto central ‘mais próximo’ para uma forma no Sql Server 2012

O Sql Server 2008 e o Sql Server 2012 têm a capacidade de encontrar o ponto ‘central’ de uma forma. Isso tudo é ótimo e incrível se sua forma for … bem … normal. Isto é … não tem nenhuma “área” ausente no meio da forma.

Veja isso.

Este é um formato para Melbourne, Austrália .

O ponto ‘central’ está na verdade fora da forma -real.

Cenário

Então .. esta rápida função Sql agora encontra o ponto central mais próximo para uma forma. Se o ponto estiver realmente dentro (também conhecido como interseção) da forma, use-o. Caso contrário , encontre a linha mais curta para a forma … e use esse ponto.

Código ou GTFO.

CREATE FUNCTION dbo.ToClosestCentrePoint
(
@Shape GEOGRAPHY
)
RETURNS GEOGRAPHY

AS

BEGIN

-- First get the centrepoint.
DECLARE
@CentrePoint GEOGRAPHY
SET
@CentrePoint = @Shape.EnvelopeCenter()

-- Now check to see if this centre point actually
-- exists in the this shape?
IF
@CentrePoint.STIntersects(@Shape) = 0 BEGIN
-- It doesn't so find the closest point.

-- Grab the last end point of this linestring

-- (which contains a start and and end, only)

-- and use that as the new centrepoint

SET @CentrePoint = @CentrePoint

.ShortestLineTo(@Shape)

.STEndPoint()

END


RETURN @CentrePoint

END

GO

Cenário

Agora – não é perfeito. Ou seja, o ponto central de Melbourne deve realmente estar em algum lugar no meio visual dessa forma engraçada. Mas .. para um processo automatizado, isso funciona bem.

Para uma solução mínima viável, este código agora garante que o ponto central mais próximo realmente cruze a forma original.