Estou tentando encontrar todos os pontos dentro de um raio de oito quilômetros de um determinado ponto. Eu tenho uma consulta como esta:
SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)
Não consigo descobrir o que coloquei no lugar de ?
(raio) para obter oito quilômetros. Tudo está no EPSG 4326 e, de acordo com a documentação do PostGIS (o melhor que posso saber), meu raio deve estar em metros. Se eu colocar 12.070,0m (aproximadamente 5 milhas), recebo fósforos no meio do país. Alguém sabe o que estou perdendo?
postgis
postgis-1.5
Nik
fonte
fonte
Respostas:
Como seus dados não são projetados - são pontos de um esferóide - distâncias lineares meio que não fazem sentido. Cinco milhas no equador são um ângulo muito menor que 5 milhas no círculo ártico. Mas, felizmente, o PostGIS (> = 1.5) tem a resposta que você está procurando:
Ele tem um
geography
tipo projetado para esse tipo de coisa. É semelhante à geometria, mas só usa o EPSG: 4326 e há muito menos funções que funcionam com ele.No exemplo acima, chamei ST_GeogFromText () (também existe um ST_GeographyFromText () e não tenho certeza se há uma diferença) no ponto de interesse (ele pode funcionar com o WKT regular, porque o parâmetro SRID é redundante) e converta a coluna latlon para o tipo de região geográfica. Se você estiver fazendo muitas delas, pode ser mais eficiente criar uma coluna geográfica na sua tabela e pular completamente o elenco. Finalmente, ST_DWithin () pode receber parâmetros geográficos e faz a coisa certa com distâncias lineares.
fonte
talvez você queira a função ST_DWithin. veja nota no documento st_buffer.
ST_Buffer
fonte