Posso usar as funções do Postgres para encontrar pontos dentro de um retângulo rotativo de tamanho fixo?
Estou usando o Postgres 9.5 e acabei de instalar o PostGIS para algumas funções estendidas. Eu tenho uma tabela com (x, y) pontos e quero encontrar o retângulo que se encaixa no número máximo de pontos. A restrição é que os comprimentos laterais do retângulo sejam fixos. Até agora, estou contando quantos pontos há na caixa sem rotação. Meus pontos estão centrados em torno da origem,(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;
Essa consulta me fornece a contagem de pontos dentro de um retângulo com origem(0,0) e comprimentosx = 10 ey = 20.
A partir daqui, eu criaria uma tabela auxiliar de pontos de canto retangulares girados (ângulo, x1, y1, x2, y2), depois cruzaria a junção aos meus dados e contaria os pontos por ângulo, enquanto o GROUP BY angle. Então eu posso selecionar qual ângulo me dá mais pontos dentro do retângulo.
Mas isso parece um pouco antiquado, e talvez não-desempenho. Além disso, a contagem de pontos dentro de um retângulo girado não é umacálculo trivial.
Existem maneiras mais eficientes e elegantes, talvez usando o PostgresTipos de dados geométricos ou PostGISBox2D, girar um retângulo com comprimento lateral fixo e depois contar o número de pontos dentro? As funções geométricas parecem boas, mas parecem fornecer caixas delimitadoras mínimas e não o contrário.
Além do Postgresql, estou usando uma estrutura Python que pode ser usada no caso do SQL não conseguir fazer isso funcionar.
Atualização: Uma coisa que tentei é usarTipos geométricos, especificamente CAIXA
SELECT deg, Box(Point(-5, -10), Point(5, 10)) * Point(1, Radians(deg))
FROM Generate_series(0, 360, 90) AS deg
Infelizmente, oFunção de rotação por um pontonão funciona para polígonos.