Punkt in polygon-Algorithmus für SQL-Server
Bin ich zu schreiben versucht, eine SQL-Abfrage, die bestimmen, ob ein gegebener Punkt in einem polygon. (Ich bin mit SQL Server 2008 R2).
War ich nach dieses tutorial (einfach kopieren /einfügen und ändern von Tabellennamen) und etwa funktioniert, ABER ist es nicht genau überhaupt. Zum Beispiel, lassen Sie uns rücksichtsvoll einen gegebenen Punkt die Koordinaten sind :
P = 45.7664, 4.87383
.
Wenn Sie zeichnen ein kleines polygon (eine Ungefähre Quadrat) um diesen Punkt mit 4 Ecken-Koordinaten :
S = 45.97215 4.693909, 45.687 4.674683, 45.73302 5.460205, 46.05227 5.366821, 45.97215 4.693909
dem Verfahren in dem link unten die Antworten der Punkt ist NICHT in polygon, in der Erwägung, dass es ist...
Das ist die Ausgabe (mit meinem eigenen text-Formatierung) :
(Polygon 20 ist das polygon oben)
Aber wenn Sie vergrößert den Platz (10 mal größer in meinem test), das Verfahren Antworten, meine Nummer liegt auf dem Platz.
So, ich bin auf der Suche nach einem anderen Algorithmus, genauer.
Hier ist mein VERTICE Tabelle, mit allen Ecken-Koordinaten der einzelnen Polygone meiner DB
Ich brauche, um zu überprüfen, für ALLE Polygone (es gibt ein paar tausend), wenn Sie einen bestimmten Punkt übergeben, parameter ist in ein polygon (und wenn ja, welche(s)). Ich kann die Schleife von mir, aber ich vermisse eine richtige Punkt-in-polygon - Algorithmus.
Könnte mir jemand helfen ?
Ich danke Ihnen sehr.
ZUSAMMENFASSUNG
Den entsprechenden SQL fiddle : http://sqlfiddle.com/#!3/0caa4/1
- Es ist die Leistung schlecht, wenn Sie große Datensätze in der Datenbank, habe ich versucht, diese Abfrage über 1600000 Datensätze und es dauerte avg 2 Minuten.
- Hi Jitendra, dies ist eine alte Frage, aber das Projekt ist noch in der Entwicklung (es ist ein persönliches Projekt). Ich habe implementiert die alogrithm in meinem link mit den Erklärungen von @Ben Thul und es perfekt funktioniert, aber ich habe nie versucht, mit so viel Aufzeichnungen. Sie könnten vorschlagen, einen besseren Algorithmus als eine Antwort, es wird willkommen sein !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist, dass Sie definiert haben, müssen Sie das polygon nach hinten. Laßt uns dieses mit der native-SQL-geography-Typen
Wie Sie sehen können,
@s
hält so ziemlich die ganze Welt. In das Ergebnis-set-viewer, wenn Sie zoom-in, wo Ihr "Platz" sein sollte, wirst du ein Loch finden. Kontrast, dass mit@t
das ist der Bereich, den Sie erwarten. Beachten Sie auch, dass ich diese lief in SQL 2012 verbessert, die auf eine Einschränkung existiert, pre-2012, die besagt, dass eine räumliche Instanz kann nicht über eine Halbkugel Grenze. Wenn Sie die oben auf einem 2008 instance, Sie werden wahrscheinlich erhalten eine Fehlermeldung, dass die Wirkung für@s
. Kommentieren Sie die Zeile definieren@s
und es ausgeführt werden.Gibt es eine "Rechte-hand-Regel" bei der Definition von geo(typographie/metry) - Polygone. Stell dir vor, du warst in einem Auto, besuchen Sie die Punkte in der Reihenfolge, die Sie angegeben haben. Der Bereich, in dem Sie definiert ist, was Sie sehen würden, wenn Sie waren auf der Suche aus der rechten Seite des Autos.
@s
wie man es definiert, Sie sind über eine Hemisphäre Grenze... Es ist einfach ein wenig polygon in Nord-hemispere !?!? SonstSTIntersects
scheint besser als der Algorithmus, den ich hatte, ich nehme an, die Funktion wurde getestet und wieder getestet...@s
ist die ganze Welt minus das Quadrat, das Sie bestimmt.@s
ist die ganze Welt minus den Platz den ich inteded. Aber@s
ist ein polygon, die sich in Frankreich, dessen Land 100% in Nord-Halbkugel, also warum bin ich die Kreuzung einer Hemisphäre Grenze ?? Dann, wenn ich das richtig verstehe, wenn ich zeichnen Sie ein polygon innerhalb eines anderen Polygons, das größte polygon selbst abzüglich der kleinen ? Wenn ja, wie kann ich das überlagern zweier Polygone ?