Ao definir um ponto no PostGIS, quando você decide usar qual dos seguintes?
ST_SetSRID(ST_MakePoint(lon,lat),4326)
ST_SetSRID(ST_Point(long,lat),4326)
ST_SetSRID(ST_GeomFromText('POINT(lon lat)',4326)
ST_GeomFromEWKT('SRID=4326;POINT(lon lat)')
Se é essencialmente uma diferença no desempenho, qual será o mais rápido?
postgis
postgresql
coordinate-system
Nyxynyx
fonte
fonte
Respostas:
Meu palpite é que
ST_MakePoint
é o mais rápido, mas isso é fácil o suficiente para ser comparado com 100 mil pontos aleatórios.E aqui estão alguns resultados com o PostGIS 2.1 (tronco) no PostgreSQL 9.1, x64 Debian. Eu as fiz algumas vezes para obter uma média aproximada. Aqui estão os
<POINT CONSTRUCTOR METHOD>
ordem do mais rápido para o mais lento:ST_SetSRID(ST_MakePoint(random(), random()), 4326)
ST_GeomFromText('POINT(' || random()::text || ' ' || random()::text || ')', 4326)
ST_GeomFromEWKT('SRID=4326;POINT(' || random()::text || ' ' || random()::text || ')')
ST_GeomFromText
Por fim, uma pequena nota de rodapé sobre a diferença entre conversões sem perdas / perdas com os métodos acima.
ST_MakePoint
Preserva apenas os dados binários de precisão do ponto flutuante e as conversões de texto truncam uma parte muito pequena dos dados. Embora os dois pontos possam ter diferenças binárias (vistas no WKB), eles sempre devem ser espacialmente iguais. As diferenças de distância são essencialmente o epsilon da máquina para precisão dupla .fonte
SQL
sintaxe<POINT CONSTRUCTOR METHOD>
. Isso é apenas um pseudocódigo para se referir às quatro abordagens diferentes ou você está fazendo algum tipo de função?1e-14
... Altere a tabela f1FROM (SELECT random()::float8 as x, random()::float8 as y UNION SELECT 12.24343484842,34.58384538483434) AS f1
para vê-la em seu psql.ST_MakePoint e ST_Point são iguais - ambos chamam LWGEOM_makepoint (você pode ver isso no arquivo postgis / postgis.sql.in no código-fonte). Eu usaria ST_MakePoint. As rotinas de conversão de texto produzem o mesmo resultado, mas são mais lentas devido à quantidade de análise necessária.
fonte
SRID 4326 e Geometria
Como observação à excelente, abrangente e atual resposta de MikeT . Muitas pessoas parecem fazer essa pergunta porque desejam definir o SRID em uma coluna POINT.
Mas, quando o fazem, encontram problemas com o que parece ser o melhor método para criar um argumento, mas, infelizmente, encontram problemas.
A partir daí, eles raciocinam que têm duas opções
ST_SetSRID( ST_MakePoint(1,2) )
que é o caminho mais à direita, mas com crosta, ouST_GeomFromText
, isso é logicamente mais lento e não precisa de benchmarks: o PostgreSQL precisa analisar os argumentos do construtor a partir do texto. Também é extremamente feio em si.Infelizmente, existe outro caminho.
Tipo de Geografia
O SRID padrão
geography
é 4326. Se você é novo, sugiro usar emgeography
vez degeometry
. De fato, geralmente se você não sabe a diferença que provavelmente desejageography
. Você pode mudar as colunas facilmente.Agora, a inserção é mais fácil porque o tipo já está associado ao padrão com o SRID 4326. Agora você pode converter explicitamente para
geography
, ou apenas deixar a conversão implícita funcionarQue se parece com isso (todos eles inserem a mesma coisa)
Converter em texto e forçar o PostgreSQL a analisar o texto com
ST_GeomFromText
ouST_GeogFromText
é bobo e lento.fonte