Lorsque vous définissez un point dans PostGIS, quand décidez-vous d'utiliser lequel des éléments suivants?
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 c'est essentiellement une différence de performances, laquelle sera la plus rapide?
postgis
postgresql
coordinate-system
Nyxynyx
la source
la source
Réponses:
Je suppose que
ST_MakePoint
c'est le plus rapide, mais c'est assez facile à comparer avec 100 000 points aléatoires.Et voici quelques résultats avec PostGIS 2.1 (trunk) sur PostgreSQL 9.1, Debian x64. Je les ai fait plusieurs fois pour obtenir une moyenne approximative. Voici l'
<POINT CONSTRUCTOR METHOD>
ordre du plus rapide au plus lent: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
Enfin, une petite note de bas de page sur la différence entre les conversions sans perte / avec perte avec les méthodes ci-dessus. Ne
ST_MakePoint
conserve que les données de précision à virgule flottante binaire et les conversions de texte tronquent une très petite partie des données. Bien que les deux points puissent avoir des différences binaires (vu dans le WKB), ils doivent toujours être spatialement égaux. Les différences de distance sont essentiellement la machine epsilon pour la double précision .la source
SQL
syntaxe,<POINT CONSTRUCTOR METHOD>
. Est-ce juste un pseudocode pour faire référence aux quatre approches différentes, ou faites-vous une sorte de fonction?1e-14
... Modifiez la table f1FROM (SELECT random()::float8 as x, random()::float8 as y UNION SELECT 12.24343484842,34.58384538483434) AS f1
pour la voir dans votre psql.ST_MakePoint et ST_Point sont les mêmes - ils appellent tous les deux LWGEOM_makepoint (vous pouvez le voir dans le fichier postgis / postgis.sql.in du code source). J'utiliserais ST_MakePoint. Les routines de conversion de texte produisent le même résultat, mais sont plus lentes en raison de la quantité d'analyse requise.
la source
SRID 4326 et géométrie
En guise de note complémentaire à l'excellente, complète et actuelle réponse de MikeT . Beaucoup de gens semblent poser cette question car ils veulent définir le SRID sur une colonne POINT.
Mais quand ils le font, ils rencontrent des problèmes avec ce qui semble être la meilleure méthode pour créer un point, mais malheureusement, ils rencontrent des problèmes.
De là, ils pensent avoir deux options
ST_SetSRID( ST_MakePoint(1,2) )
ce qui est la manière la plus à droite mais cruelle, ouST_GeomFromText
, c'est logiquement plus lent et n'a pas besoin de repères: PostgreSQL doit analyser les arguments du constructeur à partir du texte. C'est aussi extrêmement laid lui-même.Hélas, il existe un autre moyen.
Type de géographie
Le SRID par défaut
geography
est 4326. Si vous êtes nouveau, je suggère d'utiliser à lageography
place degeometry
. En fait, généralement si vous ne connaissez pas la différence que vous voulez probablementgeography
. Vous pouvez changer les colonnes assez facilement.L'insertion est désormais plus facile car le type est déjà associé par défaut au SRID 4326. Vous pouvez désormais effectuer un cast explicite vers
geography
, ou simplement laisser le cast implicite fonctionnerQui ressemble à ceci, (ils insèrent tous la même chose)
Convertir en texte puis forcer PostgreSQL à analyser le texte avec
ST_GeomFromText
ouST_GeogFromText
est stupide et lent.la source