Domanda

Ho una struttura poligonale in un sql2005 db come descritto di seguito.

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
)

Ora recupero intere righe sull'applicazione e metto tutto alla funzione di test di successo.

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

Ma devo spostare questa funzione sul server sql. Ma Sql 2005 non ha funzioni spaziali native e non voglio usare librerie di funzionalità spaziali extra. Come posso portare questa funzione su T-SQL? :) O qualcuno ha una soluzione diversa per controllare PointInPolygon?

Grazie

È stato utile?

Soluzione

SQL Server 2005 consente di scrivere funzioni native per CLR in grado di eseguire lato server. È possibile leggere l'introduzione di MSDN Utilizzo dell'integrazione CLR in SQL Server 2005 . Ciò dovrebbe consentire di implementare la funzione come aggiunta al server sql ed eseguire a velocità nativa.

Altri suggerimenti

Puoi guardare questa pagina, fornisce il codice SQL:

Codice SQL Point In Polygon

Non hai escluso di andare con sql 2008 che ha incorporato tipi geospaziali . Non l'ho usato, quindi non posso offrire nulla oltre.

È possibile riscrivere PointInPolygon come un proc memorizzato con un cursore.

Devo ammettere che non riesco completamente a testare il tuo algoritmo per colpire i punti. Comunque, la struttura dei dati è dispari per un poligono, poiché X1 / Y1 di una linea deve essere uguale a X2 / Y2 della linea precedente per formare un poligono. Pertanto, memorizzerei singoli punti solo al fine di garantire la coerenza della struttura dei dati e l'ultimo e il primo punto vengono nuovamente interconnessi.

Per quanto riguarda un algoritmo per scoprire se un punto si trova all'interno del poligono (2D) o no, prima filtrerei le linee che sono candidate e creerei un "taglio" (orizzontale o verticale) in modo da ottenere un elenco di punti di intersezione di linea e ordinarli. Quindi, usando una funzione di rango, è all'interno del poligono se il rango è dispari, se anche noi siamo al di fuori del poligono (o in un "buco").

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top