Daugiau

Kaip padaryti „PostGIS“ erdvinį sujungimą, kuris grąžina minimalią taško kertančio daugiakampio vertę?

Kaip padaryti „PostGIS“ erdvinį sujungimą, kuris grąžina minimalią taško kertančio daugiakampio vertę?


Turiu daugiakampę lentelę (buferį) ir taškų lentelę (dem_points), ir noriu sujungti jas erdviniu būdu. Turiu sujungti tašką su mažiausiu aukščiu (dn) prie jo erdvinio poligono PostGIS.

Pirmiau pateiktame pavyzdyje noriu, kad mano išvestis būtų daugiakampis, kurio osm_id yra „1234“, sujungtas su tašku, kuriame dn = 4200. Turiu šią užklausą, bet kažkas negerai:

PASIRINKITE osm_id, gid, MIN (dn) FROM (SELECT a.id AS osm_id, b.id AS gid, b.dn AS dn FROM buferis AS a, dem_points AS b WHERE ST_Within (buffer.geom, dem_points.geom)) GROUP BY (osm_id, gid); “

Su šia užklausa gaunu šią klaidą:

KLAIDA: antrinė užklausa FROM turi turėti slapyvardį LINE 2: FROM ( ^ PATARIMAS: Pavyzdžiui, FROM (SELECT…) [AS] foo. KLAIDA: antrinė užklausa FROM turi turėti slapyvardį SQL būsena: 42601 Patarimas: Pavyzdžiui, FROM ( SELECT…) [AS] foo. Charakteris: 40

Kaip man reikia susisteminti užklausą, kad erdviniu būdu sujungtų tašką su mažiausiu aukščiu iki daugiakampio, į kurį jis patenka?


Pirmiausia naudokite lango funkciją, kad gautumėte užsakytą dem_points reitingą. Antrame žingsnyje filtruokite dem_point su mažiausiu dn pagal rangą.

PASIRINKITE osm_id, gid, dn FROM (SELECT b.osm_id, p.gid, p.dn, row_number () OVER (PARTITION BY osm_id order by dn) kaip rangą FR buferis b, dem_points p WHERE ST_Within (p.geom, b. geom)) prisijungė prie WHERE rango = 1

Turite sugrupuoti taškus kiekvienam buferiniam geomui, tada suraskite kiekvieno buferinio geomo min (dn) ir galiausiai vėl sujunkite jį su originalu, kad gautumėte tašką. Pabandykite ką nors panašaus (naudokite su Sintaksė, kad būtų lengviau sekti):

SU foo AS (SELECT b.osm_id, p.gid, p.dn FR buferio b, dem_points p WHERE ST_Within (p.geom, b.geom)), bar AS (SELECT osm_id, min (dn) as dn FRO foo GROUP BY osm_id) PASIRINKITE bar.osm_id, foo.gid, bar.dn IŠ juostos JOIN foo ON foo.osm_id = bar.osm_id IR foo.dn = bar.dn

Atminkite, kad dar vienas būdas tai padaryti yra naudoti „PostgreSQL“ sąlygą HAVING, bet manau, kad to laikytis yra sunkiau.


Radau alternatyvų būdą išspręsti šį klausimą. Sekite šią temą: https://geonet.esri.com/thread/16118. Atlikdami sujungimą nuo vieno iki vieno, kur taškai yra tikslinės funkcijos, o daugiakampiai - sujungimo ypatybės. Tada paleiskite apibrėžimo užklausą naujame sluoksnyje taip:

dn in (pasirinkite min (dn) iš dn grupės pagal osm_id)

Dabar bus rodomi tik tie taškai, kurių vertė yra minimali „dn“. Visa tai reikia atlikti asmeninėje geografinėje duomenų bazėje.