SQL Server 2005 Point In Polygon
-
03-07-2019 - |
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
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:
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").