Pergunta

I têm uma estrutura polígono em um db sql2005 como descrito abaixo.

CREATE TABLE [dbo].[Polygons](
    [PolygonID] [int] IDENTITY(1,1) NOT NULL,
    [PolygonName] [varchar](255) NOT NULL,
    [PolygonColor] [varchar](7) NOT NULL,
    [PolygonRuleID] [int] NOT NULL)

CREATE TABLE [dbo].[Polylines](
    [LineID] [int] IDENTITY(1,1) NOT NULL,
    [LineX1] [float] NOT NULL,
    [LineY1] [float] NOT NULL,
    [LineX2] [float] NOT NULL,
    [LineY2] [float] NOT NULL,
    [PolygonID] [int] NOT NULL
)

Agora eu recuperar linhas inteiras para aplicação e colocar todos para bater função de teste.

public static bool PointInPolygon(float pointX, float pointY, PolylineCollection polygon)
        {
            int nvert = polygon.Count();
            int i, j = 0;
            bool c = false;
            for (i = 0, j = nvert - 1; i < nvert; j = i++)
            {
                if (((polygon[i].LineY1 > pointY) != (polygon[j].LineY1 > pointY)) &&
                 (pointX < (polygon[j].LineX1 - polygon[i].LineX1) * (pointY - polygon[i].LineY1) / (polygon[j].LineY1 - polygon[i].LineY1) + polygon[i].LineX1))
                    c = !c;
            }
            return c;
        }

Mas eu preciso para mover esta função para sql server. Mas Sql 2005 não tem funções espaciais nativas e eu não quero usar qualquer bibliotecas de funcionalidade espaciais adicionais. Como posso porto esta função para T-SQL? :) Ou alguém tem uma solução diferente para verificação PointInPolygon?

Graças

Foi útil?

Solução

SQL Server 2005 permite que você escreva funções nativas para o CLR que pode executar lado do servidor. Você pode ler o MSDN introdução Usando integração CLR no SQL Server 2005 . Isso deve permitir que você tenha a sua função implementada como uma adição ao servidor SQL e executar a velocidades nativas.

Outras dicas

Você pode olhar para esta página, ele fornece o código SQL:

SQL código ponto no polígono

Você não descartou indo com sql 2008, que foi construído com tipos geoespaciais . Eu nunca usei isso para que eu não pode oferecer nada além disso.

Você poderia re-escrever PointInPolygon como um proc armazenado com um cursor.

Eu tenho que admitir que eu não entendo totalmente o seu algoritmo para testar a ponto de bater. De qualquer forma, a estrutura de dados é estranha para um polígono, uma vez que X1 / Y1 de uma linha tem de ser igual a X2 / Y2 da linha anterior, a fim de formar um polígono. Portanto, eu armazenar pontos únicos apenas para fazer a estrutura de dados garantida para ser consistente, e o último eo primeiro ponto estão interligados novamente.

Como para um algoritmo para encontrar se um ponto está dentro do polígono (2D) ou não, eu primeiro filtro das linhas que são candidatos e criar um "corte" (horizontal ou vertical) para que eu obter uma lista de pontos de interseção de linha e fim-los. Em seguida, usando uma função de classificação, é dentro do polígono se o posto é estranho, se ainda estamos fora do polígono (ou em um "buraco").

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