Je veux utiliser ST_DWithin sur des données qui sont stockées dans la géométrie SRID de 4326 et utiliser des mètres comme paramètre de distance. Est-il plus efficace de faire un cast (par exemple data.geom :: geography) ou une transformation en un SRID avec des unités de mètres (par exemple ST_Transform (geom, 3857)? Ou ni l'un ni l'autre?
postgis
coordinate-system
st-dwithin
kingzing1
la source
la source
Réponses:
Comme décrit, la réponse est "ni", pour les raisons suivantes:
ST_DWithin(geom::geography, %anothergeom, %radius)
. Parce que la géographie est impliquée, le système recherchera un index de géographie (qui est construit sur une sphère, pas sur un plan) et n'en trouvera aucun. Puisqu'il n'a pas d'index, il effectuera la jointure en utilisant des analyses complètes des tables. Ce sera lent.ST_DWithin(ST_Transform(geom, 2163), %anothergeom, %radius)
. Vos tests ne sont pas contre la colonne indexée (geom), mais contre une fonction appliquée à la colonne (ST_Transform(geom,2163)
) et donc encore une fois, votre index spatial ne sera pas utilisé. Ce sera lent.Vous avez besoin que votre requête et votre index s'harmonisent. Si vous ne souhaitez pas modifier la projection de vos données, vous devrez utiliser un index fonctionnel, par exemple, si vous créez un index géographique de fonction, vous pouvez utiliser une requête basée sur la géographie:
Ou, dans le cas de la transformation:
La performance la plus rapide absolue sera si vous convertissez les données de votre table en projection planaire (comme EPSG: 2163 ), créez un index spatial, puis utilisez
ST_DWithin()
le résultat.la source