Suite

Point le plus proche de PostGIS avec LATERAL JOIN dans PostgreSQL 9.3+


J'ai besoin d'obtenir sur chaque élément d'une table le point le plus proche d'une autre table. Le premier tableau contient les panneaux de signalisation et le second les halls d'entrée de la ville. Le fait est que je ne peux pas utiliser la fonction ST_ClosestPoint et que je dois utiliser la fonction ST_Distance et obtenir l'enregistrement min(ST_distance), mais je suis assez bloqué pour créer la requête.

CREATE TABLE traffic_signs ( id numeric(8,0) ), géométrie "GEOMÉTRIE", CONTRAINTE traffic_signs_pkey PRIMARY KEY (id), CONTRAINTE traffic_signs_id_key UNIQUE (id) ) WITH ( OIDS=TRUE ); CREATE TABLE halls_entrées ( id numeric(8,0) ), géométrie "GÉOMÉTRIE", CONTRAINTE halls_entrés_pkey CLÉ PRIMAIRE (id), CONTRAINTE halls_entrée_id_key UNIQUE (id) ) WITH ( OIDS=TRUE );

J'ai besoin d'obtenir l'identifiant du hall d'entrée le plus proche de chaque panneau de signalisation.

Je sais déjà comment faire en joignant les deux tables entières. Voir les questions et réponses ici : Point le plus proche PostGIS avec ST_Distance

Dans ce fil de discussion mentionné, il est dit qu'une nouvelle fonctionnalité intéressante est disponible dans PostgreSQL 9.3+. J'aimerais utiliser cette fonctionnalité intéressante dans PostgreSQL 9.3+ appelée LATERAL JOIN pour réaliser la même chose, mais il n'y a pas beaucoup d'informations sur cette fonctionnalité et je ne comprends pas comment ce serait dans ce cas d'obtenir le point le plus proche de un autre tableau.

J'espère que quelqu'un pourra effacer cela.


Créer la table p ( clé primaire de série id, geom geometry (point, 2100) );

La table contient environ 250 000 points, et avec la requête suivante, vous pouvez trouver le point le plus proche dans le même ensemble de données (ce n'est pas le même point).

sélectionnez a.id ,b.id cible ,bd distance de p comme latéral de jointure croisée (sélectionnez distinct sur (a.id) b.id ,a.geom <-> b.geom d de p comme b où a.id != b.id et st_dwithin(a.geom,b.geom,400) triés par a.id, d asc ) comme b ;

Comme vous pouvez le voir, le mot-clé latéral me permet de référencer les colonnes des éléments précédents dans la liste FROM.
Avant, sans la clause latérale j'aurais l'erreur
référence invalide à l'entrée de la clause FROM pour la table "a"
et un soupçon de
Il existe une entrée pour la table "a", mais elle ne peut pas être référencée à partir de cette partie de la requête.