Vairāk

IP atrašana ap konkrētām ēkām, izmantojot PostGIS

IP atrašana ap konkrētām ēkām, izmantojot PostGIS


Problēma: man katrā tabulas dzīvojamā ēkā, kurā ir teikts, ka vismaz 2 aptiekas un 2 izglītības centri 1 km rādiusā ir jāizvēlas visi IP (aptiekas, tirdzniecības centri, medicīnas centri, izglītības centri, policijas iecirkņi, ugunsdzēsības iestādes) stacijas), kas atrodas 1 km attālumā no attiecīgās ēkas. galda struktūra->

ēka (id sērijveida, nosaukums varchar)

poi_category (id sērijveida, cname varchar) - nosaukums, protams, ir kategorijas nosaukums

poi (id sērijveida, nosaukums varchar, c_id vesels skaitlis) - c_id ir FK atsauce uz poi_category (id)

visas koordinātu kolonnas ir tipa ģeometriskas, nevis ģeogrāfiskas (sauksim tās geom)

Lūk, tā es domāju, ka tas būtu jādara, bet es neesmu pārliecināts, ka tas ir pat pareizs, nemaz nerunājot par optimālu šīs problēmas risinājumu

SELECT r.id_b, r.id_p FROM (SELECT b.id AS id_b, p.id AS id_p, pc.id AS id_pc, pc.cname FROM building AS b, poi AS p, poi_category AS pc WHERE ST_DWithin (b.geom , p.geom, 1000) UN p.c_id = pc.id) AS r, (SELECT * FROM r GROUP BY id_b) AS r1, kam ir skaits (SELECT * FROM r, r1 WHERE r1.id_b = r.id_b UN r. id_pc = 'aptieka')> 1 UN skaits (ATLASĪT * NO R, R1 KUR r1.id_b = r.id_b UN r.id_pc = 'Red. centrs')> 1

Vai tas ir veids, kā iet uz to, kas man vajadzīgs? Kāds risinājums būtu labāks no veiktspējas viedokļa? Kā ar elegantāko risinājumu?


Pamatojoties uz otro šajā lapā sniegto piemēru, es izmēģinātu kaut ko līdzīgu:

SELECT b.gid, b.name, [+ jebkurš lauks] - šeit jūs iegūstat IP datus no ēkas b LEFT JOIN ēka f ON ST_DWithin (b.the_geom, f.the_geom, 1000) - lauku saimniecība LEFT JOIN building ec ON ST_DWithin (dzimis_dzimums, ec.the_geom, 1000) - red. centrs - LEFT JOIN POI and POI_CATEGORY tabulas + pievienošanās nosacījumi WHERE f.id_pc = 'farm' UN ec.id_pc = 'red. centrs 'AND COUNT (f.gid)> 1 UN COUNT (ec.gid)> 1;

Protams, tas nav pārbaudīts un vaicājums nav pilnīgs, bet loģika būtu apvienot tabulas attiecībā uz ģeometriskiem kritērijiem. Ja tas darbojas, pievienojiet instrukcijas, lai izgūtu IP datus.


Es tos parasti daru plpgsql, jo man ir daudz vieglāk lasīt, un rezultāti parasti ir efektīvāki, jo jūs varat kontrolēt plūsmu (iziet agri utt.):

Izveidot vai nomainīt FUNCTION getpois () RETURNS tekstu kā $$ DECLARE br ierakstu; phcount vesels skaitlis; edcount vesels skaitlis; FOR br IN SELECT id, name, geom FROM building LOOP SELECT count (id) no poi, kur ST_DWITHIN (br.geom, geom, 1000) un c_id = farmaceitiskā kategorija phcount; IF phcount <2, tad IZEJIET; - es domāju, ka tas ir ekvivalents turpināt, t.i., pāriet uz nākamo ENDIF ēku; SELECT skaits (id) no poi, kur ST_DWITHIN (br.geom, geom, 1000) un c_id = farmaceitiskā kategorija edcount; JA edcount <2, tad IZEJIET; ENDIF; - tagad atlasiet visus POIS 1 km attālumā un, iespējams, atgrieziet tos kā masīvu utt. END LOOP; END $$ LANGUAGE 'plpgsql' stingrs;

Skatīties video: Pierre u0026 Gherman: Geospatial analysis made easy with PostGIS and Geoalchemy. PyData Warsaw 2019