Suite

Utilisation de st_distance pour calculer la distance la plus courte entre une table avec une géométrie de points et une table avec une géométrie multipolygone


J'essaie et je n'arrive pas à calculer la distance la plus courte pour chaque point d'une table de géométrie de points (15 000 enregistrements) jusqu'au bord de polygone le plus proche dans une autre table (170000 enregistrements). Le résultat final que je veux est une distance pour chaque enregistrement de point à l'enregistrement de polygone le plus proche. Mes tableaux ressemblent à ceci :

CREATE TABLE "brondby_adresserV2"( caractère kvhx variable, entier coordx, entier coordy, pk serial NOT NULL, the_geom geometry(Point,25832), dist_coast double precision, dist_lake double precision, CONTRAINTE "brondby_adresserV2_pkey" PRIMARY KEY (pk) )

et ça:

CREATE TABLE soe ( gid serial NOT NULL, fot_id double precision, geom geometry (MultiPolygon, 25832), CONSTRAINT soe_pkey PRIMARY KEY (gid) )

J'ai essayé d'utiliser la réponse de John Barca à partir de ce post: Point le plus proche de PostGIS avec ST_Distance où il utilise le st_dwithin afin que la requête utilise l'index de géométrie.

Le résultat que j'obtiens de ma requête me dérange et quelque chose ne va vraiment pas. Lors de la visualisation du résultat dans qgis, il semble que le calcul ne soit pas effectué pour tous les polygones. Voici le code que j'ai utilisé :

update "brondby_adresserV2" set dist_lake = t.foo from ( select distinct on ("brondby_adresserV2".kvhx) "brondby_adresserV2".kvhx, "soe".fot_id, st_distance("brondby_adresserV2".the_geom, "soe".geom) as foo de "brondby_adresserV2", "soe" où ST_DWithin("brondby_adresserV2".the_geom, "soe".geom, 5000) commande par "brondby_adresserV2".kvhx, "soe".fot_id, st_distance("brondby_adresserV2".the_geom, "soe" .geom) ) t où "brondby_adresserV2".kvhx = t.kvhx

Quelqu'un peut-il me guider sur ce que je fais mal?


Avec votre requête ci-dessus, vous calculerez toujours la distance la plus courte jusqu'au "premier" lac dans un rayon de 5 kilomètres de vos adresses.

"First" est ici déterminé par les valeurs de la colonne fot_id.

J'utiliserais une instruction comme celle-ci où l'instruction Order By n'utilise pas soe.fot_id :

update "brondby_adresserV2" set dist_lake = t.foo from ( select distinct on ("brondby_adresserV2".kvhx) "brondby_adresserV2".kvhx, "soe".fot_id, st_distance("brondby_adresserV2".the_geom, "soe".geom) as foo de "brondby_adresserV2", "soe" où ST_DWithin("brondby_adresserV2".the_geom, "soe".geom, 5000) ordre par "brondby_adresserV2".kvhx, st_distance("brondby_adresserV2".the_geom, "soe".geom) ) t où "brondby_adresserV2".kvhx = t.kvhx

Si cela ne fonctionne pas, pourquoi ne pas utiliser une agrégation à la place ? Je suppose que le moment est venu pour moi d'admettre que je n'ai pas installé PostGIS :-)

update "brondby_adresserV2" set dist_lake = t.foo from ( select "brondby_adresserV2".kvhx, Min(st_distance("brondby_adresserV2".the_geom, "soe".geom)) as foo from "brondby_adresserV2", "soe" where ST_DWithin(" brondby_adresserV2".the_geom, "soe".geom, 5000) Regrouper par "brondby_adresserV2".kvhx ) t où "brondby_adresserV2".kvhx = t.kvhx


Voir la vidéo: Calcul dune distance (Octobre 2021).