Ajuda do PostGIS ST_Buffer Radius


9

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?


4326 é dd (graus decimais). 12070 é uma área bastante grande (raio) quando é projetada como latlon.
precisa

11
incorreto - 12 070 metros = 7.49995029 milhas, então 5 milhas são 8046,72 metros, então (? = 8046,72) - são seus dados geográficos ou geográficos?
Mapperz

Respostas:


14

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:

SELECT * FROM table WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT(0,0)'), geography(latlon), 12070);

Ele tem um geographytipo 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.


Agradeço a ajuda. Eu ainda sou bastante novo no PostGIS.
Nik

4

talvez você queira a função ST_DWithin. veja nota no documento st_buffer.
ST_Buffer

As pessoas geralmente cometem o erro de usar essa função para tentar fazer pesquisas de raio. Criar um buffer para uma pesquisa de raio é lento e sem sentido. Use ST_DWithin em vez disso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.