2 votos

Obtener la ciudad más cercana relacionada con un punto en PostGIS

Tengo un grupo de tablas con puntos.

        CREATE TABLE public.clusters (
        cluster_id int4 NULL,
        punto public.geometry NULL,
        cnt int8 NULL
    );

    INSERT INTO clusters (cluster_id,punto,cnt) VALUES
     (0,'SRID=4326;POINT (-96.47418050581395 -7.4773468779069745)',172),
     (1,'SRID=4326;POINT (-74.94689710416667 4.8673576875)',48),
     (2,'SRID=4326;POINT (-74.5459309122807 2.498298842105263)',57),
     (3,'SRID=4326;POINT (-60.125132615384615 -3.9571193076923077)',13),
     (4,'SRID=4326;POINT (-74.00383843137257 6.8918209019607835)',102),
     (5,'SRID=4326;POINT (-67.158604125 4.28251)',16),
     (6,'SRID=4326;POINT (-66.90388150000001 4.3350358125)',16),
     (7,'SRID=4326;POINT (-47.78863400000001 -10.39872394117647)',17),
     (8,'SRID=4326;POINT (-47.62490553846154 -7.9716453846153845)',13),
     (9,'SRID=4326;POINT (-73.56909489999998 -3.3606845)',10);
INSERT INTO clusters (cluster_id,punto,cnt) VALUES
     (10,'SRID=4326;POINT (-75.53259585714285 -9.255620642857144)',14),
     (11,'SRID=4326;POINT (-47.9164067 -8.9248)',10),
     (12,'SRID=4326;POINT (-47.99770891666666 -10.499770499999999)',12),
     (13,'SRID=4326;POINT (-73.56718527272727 -3.030551727272727)',11);

Otra tabla de ciudades

  CREATE TABLE public.cities (
    geom public.geometry(point, 4326) NULL,
    "name" varchar NULL,
    gn_country varchar NULL
);

    INSERT INTO cities (geom,"name",gn_country) VALUES
     ('SRID=4326;POINT (-73.21547 4.37575)','Paratebueno','CO'),
     ('SRID=4326;POINT (-74.88429 4.14924)','Espinal','CO'),
     ('SRID=4326;POINT (-73.17309 6.53226)','Pinchote','CO'),
     ('SRID=4326;POINT (-75.25642 2.77717)','Rivera','CO'),
     ('SRID=4326;POINT (-72.63808 7.43637)','Pamplonita','CO'),
     ('SRID=4326;POINT (-77.66536 2.7717)','TimbiquA­','CO'),
     ('SRID=4326;POINT (-75.56738 2.74193)','Teruel','CO'),
     ('SRID=4326;POINT (-74.43512 4.96611)','Sasaima','CO'),
     ('SRID=4326;POINT (-75.5275 5.94806)','Montebello','CO'),
     ('SRID=4326;POINT (-77.05273 2.06895)','PatA­a','CO');

Estoy tratando de hacer una consulta que me da la ciudad más cercana, el país y otros datos y la distancia al punto de clusters.

Hasta ahora lo he hecho con subconsultas, basándome en esta respuesta https://gis.stackexchange.com/a/33680/98778

pero no sé si este es el mejor enfoque ya que soy nuevo en consultas espaciales y postgis.

select t1.*,
(select ST_Distance(t1.punto::geography , t2.geom::geography)/1000 FROM cities t2 ORDER BY ST_Distance(t1.punto, t2.geom) LIMIT 1) distance,
(select name FROM cities t2 ORDER BY ST_Distance(t1.punto, t2.geom) LIMIT 1) city_name,
(select geom FROM cities t2 ORDER BY ST_Distance(t1.punto, t2.geom) LIMIT 1) city_geom
from clusters t1

compruebe en la imagen el resultado de lo anterior.

Si este es un buen enfoque, ¿es eficiente o hay una forma mejor?

enter image description here

1voto

Maulin Puntos 913

En realidad, basándose en la referencia de @geozelot a esta respuesta Pude realizar mi salida deseada pero con una sola subconsulta y CROSS JOIN

    SELECT t1.*,ST_Distance(punto::geography , geom::geography)/1000 distance,
name city_name,geom city_geom
        FROM   clusters t1
        CROSS JOIN LATERAL (
          SELECT *
          FROM   cities
          ORDER BY
                 geom <-> punto
          LIMIT  1
        ) as t2
        order by cluster_id ;

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X