Al definir un Punto en PostGIS, ¿cuándo decide usar cuál 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 es esencialmente una diferencia en el rendimiento, ¿cuál será el más rápido?
postgis
postgresql
coordinate-system
Nyxynyx
fuente
fuente
Respuestas:
Supongo que
ST_MakePoint
es más rápido, pero esto es lo suficientemente fácil de comparar con 100k puntos aleatorios.Y aquí hay algunos resultados con PostGIS 2.1 (troncal) en PostgreSQL 9.1, x64 Debian. Los hice varias veces para obtener un promedio aproximado. Aquí están los
<POINT CONSTRUCTOR METHOD>
ordenados de más rápido a más 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 último, una pequeña nota al pie de página sobre la diferencia entre las conversiones sin pérdida / pérdida con los métodos anteriores. Solo
ST_MakePoint
conserva los datos de precisión de punto flotante binario, y las conversiones de texto truncan una parte muy pequeña de los datos. Aunque los dos puntos pueden tener diferencias binarias (vistas en el WKB), siempre deben ser espacialmente iguales. Las diferencias de distancia son esencialmente la máquina épsilon para doble precisión .fuente
SQL
sintaxis,<POINT CONSTRUCTOR METHOD>
. ¿Es solo pseudocódigo para referirse a los cuatro enfoques diferentes, o está haciendo algún tipo de función?1e-14
... Cambie la tabla f1FROM (SELECT random()::float8 as x, random()::float8 as y UNION SELECT 12.24343484842,34.58384538483434) AS f1
para verla en su psql.ST_MakePoint y ST_Point son iguales: ambos llaman a LWGEOM_makepoint (puede ver esto en el archivo postgis / postgis.sql.in en el código fuente). Yo usaría ST_MakePoint. Las rutinas de conversión de texto producen el mismo resultado, pero son más lentas debido a la cantidad de análisis que se requiere.
fuente
SRID 4326 y Geometría
Como nota al margen de la excelente, completa y actual respuesta de MikeT . Muchas personas parecen hacer esta pregunta porque quieren establecer el SRID en una columna POINT.
Pero cuando lo hacen, se topan con problemas con lo que parece ser el mejor método para crear un punto, pero lamentablemente se topan con problemas.
A partir de ahí, razonan que tienen dos opciones
ST_SetSRID( ST_MakePoint(1,2) )
que es la forma más correcta pero crujiente, oST_GeomFromText
, esto es lógicamente más lento y no necesita puntos de referencia: PostgreSQL tiene que analizar los argumentos del constructor a partir del texto. También es extremadamente feo en sí mismo.Por desgracia, hay otra manera.
Tipo de geografía
El SRID predeterminado para
geography
es 4326. Si es nuevo, sugeriría usar engeography
lugar degeometry
. De hecho, generalmente si no conoce la diferencia que probablemente quierageography
. Puede cambiar las columnas con bastante facilidad.Ahora la inserción es más fácil porque el tipo ya está asociado por defecto con SRID 4326. Ahora puede convertir explícitamente
geography
o simplemente dejar que la conversión implícita funcioneQue se ve así, (todos insertan lo mismo)
La conversión a texto y luego obliga a PostgreSQL a analizar el texto con
ST_GeomFromText
oST_GeogFromText
es tonto y lento.fuente