Criando círculo no PostGIS?

22

Estou usando o PostGIS 1.5.2, com geometrias no SRID: 900913. Preciso criar círculos usando uma lista de pontos como centro, com um raio de 600 quilômetros. Estou usando esta consulta:

INSERT INTO circles (geom) (
   SELECT ST_Buffer(point, 600000, 'quad_segs=8') 
   FROM points
);

Mas os círculos criados não têm 600 quilômetros de raio (o raio é próximo desse comprimento, mas não exatamente).

Existem outros métodos para criar círculos no PostGIS?

NOTA: As informações representadas são da Espanha. A projeção correta é 4326, mas o cliente usa o Google Rasters, por isso estou armazenando dados no 900913 para evitar reprojeções e aumentar o desempenho.

angelcervera
fonte
1
Como você mediu os raios para descobrir que não são 600 km?
underdark
1
@underdark Eu sei que a distância entre duas cidades e o círculo gerado usando como centro uma desta cidade não se estendem a outra cidade. I verificar a distância entre duas cidades usando gmap-pedometer.com
angelcervera
3
Isso parece relacionado a gis.stackexchange.com/questions/10148/…
underdark
@underdark Usando o SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));retorno de mais de 100 km de diferença, respeite o gmap-pedometer.com, mas se eu suponho que esse comprimento esteja correto, o raio do círculo é perfeito. Mas as pessoas usam a primeira distância como raio, não a distância retornada por st_distance. É possível transformar a primeira distância na segunda?
28911 angelcervera #

Respostas:

15

Tente o seguinte:

 SELECT ST_Transform(geometry( 
            ST_Buffer(geography( 
                ST_Transform( point, 4326 )), 
                600000)), 
            900913) FROM points`

Isso muda para a geografia e, em seguida, usa a seleção SRID incorporada para (ironicamente) voltar para a geometria onde um bom buffer planar é executado e depois retrocede. O problema com sua abordagem no Mercator é que o Mercator não preserva a distância. Usar uma projeção local mais apropriada fornece melhores resultados, e é isso que acontece no método acima.

Paul Ramsey
fonte
4

Você pode aumentar o valor quad_seg para obter um círculo mais preciso. Para obter um círculo real, você precisa trabalhar com um tipo de geometria curva, mas não sei qual software pode mostrar isso.

A precisão do srid 90013 também é muito ruim, pois é uma projeção que cobre o mundo inteiro.

Você obterá um resultado mais preciso com uma projeção local.

Nicklas Avén
fonte
@ nicklas-aven É possível 100 km de diferença em uma distância de 600 km porque estou usando a projeção 900913 e não 4326?
11136 Angelcervera
1
Sim, é possível. verifique Pauls comentá-la quando eu não conseguia acreditar nessa imprecisão gis.stackexchange.com/questions/3264/… . o fato é que 4326 não é projetado.
Nicklas Avén
3

Depende de onde seus círculos estão sendo criados. Eles estão perto do equador ou mais próximos dos pólos?

Dê uma olhada neste mapa . Você acha que a Antártica ou a Groenlândia são realmente tão grandes? Essa é a projeção que você está usando, certo?

Eu recomendo que você faça uma leitura rápida deste documento do USGS sobre projeções , particularmente a tabela abaixo que fornece uma idéia rápida de quais projeções são boas para quê.

E depois de tudo isso, acho que devo finalmente responder sua pergunta :)

O que Nicklas disse foi um bom conselho. Existe uma projeção específica para sua área local que funcionaria melhor?

Caso contrário, você pode querer olhar para o novo tipo de Geografia PostGIS . No entanto, a resposta mais apropriada depende de onde seus dados estão localizados.

ATUALIZAÇÃO: Como agora sabemos que seus dados estão na Espanha, você pensou em armazená-los em uma projeção local como a UTM Zone 31N , executando suas operações com isso e projetando-os novamente no Google Web Mercator?

Ragi Yaser Burhum
fonte
1
+1 para usar o tipo de geografia para mapas que cobrem grandes áreas. o problema aqui é que não há função de buffer nativo para o tipo de geografia no postgis. mas há uma conversão incorporada para "best srid", criando o buffer e voltando para 4326. Portanto, conhecer seus dados e escolher um srid manualmente oferece um controle melhor.
Nicklas Avén
Nicklas, você está certo sobre o elenco e eu concordo com você 100% sobre a projeção local (ou seja, conhecer seus dados). No entanto, se a resposta é que ele só quer ter dados "mundiais", IMHO, a lógica de conversão dentro do tipo Geografia fará um trabalho muito melhor para descobrir qual SR é apropriado para essa operação a distância em vez de qualquer outro lógica personalizada complicada. Outra coisa boa sobre o tipo de geografia é que, embora muitas das operações sejam atualmente convertidas para a matemática cartesiana, as operações continuam sendo atualizadas para usar a matemática da esfera.
Ragi Yaser Burhum
2

Você pode usar o tipo de geometria SQL / MM Parte 3 CIRCULARSTRING e / ou CURVEPOLYGON.

No entanto, esteja avisado de que o suporte para esse tipo é limitado, tanto com funções internas como com programas externos. Você pode usar ST_CurveToLine para ajudar a visualizá-lo.

Além disso, é um pouco desanimador (como no PostGIS 2.0 svn) que SELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry)é apenas uma aproximação aproximada de π . (Compare 3.14033115695475 a 3.14159265358979 de pi()).

Mike T
fonte