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)','PatAa','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?