Question

J'ai une structure de polygone dans une base de données SQL2005, comme décrit ci-dessous.

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
)

Maintenant, je récupère des lignes entières dans l’application et mets tout en place pour tester la fonction de test.

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

Mais je dois déplacer cette fonction sur le serveur SQL. Mais SQL 2005 n'a pas de fonctions spatiales natives et je ne souhaite pas utiliser de bibliothèques de fonctionnalités spatiales supplémentaires. Comment puis-je porter cette fonction sur T-SQL? :) Ou quelqu'un a une solution différente à la vérification PointInPolygon?

Merci

Était-ce utile?

La solution

SQL Server 2005 vous permet d’écrire des fonctions natives pour le CLR pouvant exécuter le côté serveur. Vous pouvez lire l’intégration MSDN Utilisation de l’intégration CLR dans SQL Server 2005 . Cela devrait vous permettre d’implémenter votre fonction en tant qu’addition au serveur SQL et de l’exécuter à des vitesses natives.

Autres conseils

Vous pouvez regarder cette page, elle fournit le code SQL:

code SQL Point dans un polygone

Vous n'avez pas exclu que SQL 2008 soit intégré types géospatiaux . Je ne l'ai pas utilisé, je ne peux donc rien offrir d'autre.

Vous pouvez réécrire PointInPolygon en tant que proc stocké avec un curseur.

Je dois admettre que je ne parviens pas complètement à votre algorithme pour tester les frappes ponctuelles. Quoi qu'il en soit, la structure de données est étrange pour un polygone, étant donné que X1 / Y1 d'une ligne doivent être égaux à X2 / Y2 de la ligne précédente pour former un polygone. Par conséquent, je ne stockerais que des points uniques afin de garantir la cohérence de la structure de données. Le dernier et le premier point sont à nouveau interconnectés.

En ce qui concerne un algorithme permettant de déterminer si un point est à l’intérieur du polygone (2D) ou non, je commencerais par filtrer les lignes candidates et créer une "coupe". (horizontal ou vertical) pour obtenir une liste des points d’intersection des lignes et les classer. Ensuite, en utilisant une fonction rank, il se trouve à l'intérieur du polygone si celui-ci est impair, s'il se trouve même en dehors du polygone (ou dans un "trou").

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top