32 votos

Que la función para la creación de un PUNTO en PostGIS?

Cuando la definición de un Punto en PostGIS, cuando se decide el uso que de los siguientes?

  • 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)')

Si sus esencialmente una diferencia en el rendimiento, que será el más rápido?

27voto

hernan43 Puntos 566

Mi conjetura es que ST_MakePoint es más rápido, pero esto es bastante fácil de referencia con 100k puntos al azar.

\timing

WITH test AS (
  SELECT <POINT CONSTRUCTOR METHOD>
  FROM generate_series(1,100000)
)
SELECT count(*) FROM test;

Y aquí están algunos de los resultados con PostGIS 2.1 (tronco) en PostgreSQL 9.1, x64 Debian. Hice un par de veces para obtener un promedio aproximado. Aquí están las <POINT CONSTRUCTOR METHOD> en orden de la más rápida a la más lenta:

  1. ST_SetSRID(ST_MakePoint(random(), random()), 4326)
    • avg 160 ms
    • por lejos, más rápido, y conserva la doble precisión de punto (lossless)
    • forma más fácil de hacer una consulta con parámetros numéricos los datos de las coordenadas
  2. ST_GeomFromText('POINT(' || random()::text || ' ' || random()::text || ')', 4326)
    • avg 760 ms
    • lento, como el número se convierte a texto, a continuación, la cadena se reunía, a continuación, PostGIS necesita analizar para encontrar los números
    • con pérdidas, debido al número -> texto -> número de conversiones
  3. ST_GeomFromEWKT('SRID=4326;POINT(' || random()::text || ' ' || random()::text || ')')
    • avg 810 ms
    • más lento, no sé por qué es más lento de lo ST_GeomFromText

Por último, una wee nota de pie de página en la diferencia entre lossless/con pérdida de las conversiones con los métodos anteriores. Sólo ST_MakePoint conserva el binaria de punto flotante de precisión de los datos, y el texto de las conversiones truncar una parte muy pequeña de los datos. Aunque los dos puntos pueden tener diferencias binarias (visto en la WKB), que siempre debe ser espacialmente igual. La distancia diferencias son esencialmente el epsilon de la máquina de doble precisión.

SELECT
  (geom_text = geom_binary) AS spatially_equal,
  (geom_text::text = geom_binary::text) AS binary_equal,
  (ST_AsText(geom_text) = ST_AsText(geom_binary)) AS wkt_equal,
  ST_Distance(geom_text, geom_binary)
FROM (
  SELECT x, y,
    ST_GeomFromText('POINT(' || x::text || ' ' || y::text || ')') AS geom_text,
    ST_MakePoint(x, y) AS geom_binary
  FROM (SELECT random()::float8 as x, random()::float8 as y) AS f1
) AS f2;

 spatially_equal | binary_equal | wkt_equal |     st_distance
-----------------+--------------+-----------+----------------------
 t               | f            | t         | 1.38777878078145e-16

6voto

Nathan Feger Puntos 7675

ST_MakePoint y ST_Point son los mismos, ambos de la llamada LWGEOM_makepoint (se puede ver esto en el postgis/postgis.sql.en el archivo en el código fuente). Yo uso la ST_MakePoint. El texto rutinas de conversión de producir el mismo resultado, pero son más lentos debido a la cantidad de análisis que se requiere.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X