Kann ich die Postgres-Funktionen verwenden, um Punkte innerhalb eines rotierenden Rechtecks fester Größe zu finden?
Ich verwende Postgres 9.5 und habe gerade PostGIS für einige erweiterte Funktionen installiert. Ich habe eine Tabelle mit (x, y) Punkten und möchte das Rechteck finden, das zur maximalen Punktzahl passt. Die Einschränkung besteht darin, dass die Seitenlängen des Rechtecks festgelegt sind. Bisher zähle ich, wie viele Punkte sich ohne Drehung in der Box befinden. Meine Punkte sind um den Ursprung zentriert, (0,0).
SELECT Sum(CASE
WHEN x > -5
AND x < 5
AND y > -10
AND y < 10 THEN 1
ELSE 0
END) AS inside_points,
Count(1) AS total_points
FROM track_t;
Diese Abfrage gibt mir die Anzahl der Punkte in einem Rechteck mit Ursprung (0,0) und Längex = 10 undy = 20.
Von hier aus würde ich eine Hilfstabelle mit gedrehten Rechteck-Eckpunkten (Winkel, x1, y1, x2, y2) erstellen, dann mit meinen Daten querverbinden und über die Punkte pro Winkel zählen, während GROUP BY angle. Dann kann ich auswählen, welcher Winkel mir die meisten Punkte innerhalb des Rechtecks gibt.
Aber dies scheint ein wenig altmodisch und vielleicht nicht performant. Außerdem ist das Zählen von Punkten in einem gedrehten Rechteck keintriviale Berechnung.
ibt es effizientere und elegantere Weg, vielleicht mit PostgresGeometrische Datentypen oder PostGIS Box2D, um ein Rechteck mit festen Seitenlängen zu drehen und dann die Anzahl der Punkte innerhalb zu zählen? Die geometrischen Funktionen sehen gut aus, scheinen jedoch nur minimale Begrenzungsrahmen zu bieten und nicht umgekehrt.
Neben Postgresql verwende ich ein Python-Framework, das verwendet werden kann, falls SQL dies nicht funktioniert.
Update: Eine Sache, die ich versucht habe, ist die Verwendung vonGeometrische Typen, speziell BOX
SELECT deg, Box(Point(-5, -10), Point(5, 10)) * Point(1, Radians(deg))
FROM Generate_series(0, 360, 90) AS deg
Leider ist dieDrehfunktion um einen Punkt funktioniert nicht für Polygone.