SQL Server 2005 Punkt in Polygon
-
03-07-2019 - |
Frage
Ich habe eine Polygonstruktur in einer sql2005 db wie unten beschrieben.
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
)
Nun rufe ich ganze Zeilen zu Anwendung und setze alle Testfunktion zu treffen.
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;
}
Aber ich brauche diese Funktion, um SQL Server zu verschieben. Aber SQL Server 2005 hat keine native räumliche Funktionen und ich möchte nicht alle zusätzliche räumliche Funktionalität Bibliotheken verwenden. Wie kann ich Port diese Funktion auf T-SQL? :) Oder jemand andere Lösung PointInPolygon haben überprüfen?
Danke
Lösung
SQL Server 2005 ermöglicht es Ihnen, native Funktionen für die CLR zu schreiben, die Server-Seite ausführen können. Sie können die MSDN Intro Mit der CLR-Integration in SQL Server 2005 . Auf diese Weise können Sie Ihre Funktion als Ergänzung zu SQL Server und läuft in nativer Geschwindigkeit umgesetzt haben.
Andere Tipps
Sie auf dieser Seite sehen können, es bietet SQL-Code:
Sie schließt nicht aus, mit SQL 2008 geht welche eingebauten in
Sie könnten neu schreiben PointInPolygon als gespeicherte Prozedur mit einem Cursor.
Ich muss zugeben, dass ich nicht ganz Ihren Algorithmus für Punkt hitting zu testen, erhalten Sie. Wie auch immer, ist die ungerade Datenstruktur für ein Polygon, da X1 / Y1 einer Zeile X2 / Y2 der vorhergehenden Zeile, um ein Polygon zu bilden, gleich sein müssen. Daher würde ich einzelne Punkte speichern nur, um die Datenstruktur zu machen garantiert, konsequent zu sein, und der letzte und der erste Punkt sind wieder miteinander verbunden sind.
Wie für einen Algorithmus für die Suche, ob ein Punkt innerhalb des (2D) Polygon oder nicht, würde ich zuerst die Zeilen filtert, die Kandidaten sind und ein „Schnitt“ (horizontal oder vertikal) erstellen, so dass ich eine Liste von Linie Schnittpunkte und um sie. Dann eine Rangfunktion verwendet, ist es innerhalb des Polygons ist, wenn der Rang ungerade ist, wenn es auch wir außerhalb des Polygons (oder in einem „Loch“) sind.