Pregunta

Tengo una estructura de polígono en un dl sql2005 como se describe a continuación.

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
)

Ahora recupero líneas enteras a la aplicación y pongo todo para golpear la función de prueba.

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

Pero necesito mover esta función al servidor SQL. Pero Sql 2005 no tiene funciones espaciales nativas y no quiero usar ninguna biblioteca de funcionalidad espacial adicional. ¿Cómo puedo portar esta función a T-SQL? :) ¿O alguien tiene una solución diferente para la comprobación de PointInPolygon?

Gracias

¿Fue útil?

Solución

SQL Server 2005 le permite escribir funciones nativas para el CLR que puede ejecutar en el servidor. Puede leer la introducción de MSDN Uso de la integración de CLR en SQL Server 2005 . Esto debería permitirle tener su función implementada como una adición al servidor SQL y ejecutarse a velocidades nativas.

Otros consejos

Puedes ver esta página, proporciona el código SQL:

Código SQL Punto en polígono

No descartó ir con sql 2008 que tiene incorporado tipos geoespaciales . No lo he usado, así que no puedo ofrecer nada más allá de eso.

Puedes reescribir PointInPolygon como un proceso almacenado con un cursor.

Tengo que admitir que no logro que su algoritmo se pruebe por completo para golpear puntos. De todos modos, la estructura de datos es impar para un polígono, ya que X1 / Y1 de una línea tiene que ser igual a X2 / Y2 de la línea anterior para formar un polígono. Por lo tanto, almacenaría puntos únicos solo para garantizar que la estructura de datos sea consistente, y el último y el primer punto están interconectados nuevamente.

En cuanto a un algoritmo para encontrar si un punto está dentro del polígono (2D) o no, primero filtraría las líneas que son candidatas y crearía un " corte " (horizontal o vertical) para obtener una lista de puntos de intersección de línea y ordenarlos. Luego, utilizando una función de rango, está dentro del polígono si el rango es impar, si es que estamos fuera del polígono (o en un "agujero").

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top