Več

PostGIS poligon posnetek netočen z uporabo ST_Clip in ST_Union iz ploščastega rastra


V zbirki podatkov, ki podpira PostGIS, imam raster RGB s ploščicami 128 x 128. Poskušam posneti iz rastra z uporabo poligona, kot sledi:

SELECT ST_AsGDALRaster (Rast, "GTiff) FROM (SELECT ST_Union (ST_Clip (Rast, geom)) AS Rast IZ scenes.rgb CROSS JOIN ST_Transform (ST_GeomFromText (" POLYGON ((148,296964462160986 -28,914219626449281, 148,300054703309883 -28,892809637280056, 148,288369276810897 -28,891374636835419, 148,290750573935583 -28,87714520356819, 148,305307129311188 -28,878270936973706, 148,305323220779684 -28,892336715938328, 148,307563219233941 -28,892525982844003, 148,30733671875592 -28,893583124483161, 148,323105875277065 -28,895609384106994, 148,319860482823429 -28,917021311138011, 148,319860482823429 -28,917021311138011, 148,296964462160986 -28,914219626449281)) ', 4326), 32655) AS Geom WHERE st_intersects (RAST, geom)) AS rast;

Glejte grafiko, meje paddocka so črne oblike - slika naj bi se pripenjala na to območje.

Moje vprašanje je, kako lahko spremenim svojo poizvedbo, tako da se odrezani raster ujema s poligonom?


Poligon morate znova projicirati v rastrsko projekcijo, nato pa lahko raster posnamete.

To lahko izvedete tako:

R = raster

u_R = zveza rastrov

P = mnogokotnik

1-Izberite ploščice, ki sekajo z vašim poligonom

Ustvari tabelo tile_R kot SELECT * iz R, kjer ST_Intersects (u_R.raster, st_transform (P.geom, st_srid (tile_R.raster)))

2-Izvedite združitev vašega rastra, kot je:

Ustvari tabelo u_R kot SELECT st_union (rast) kot raster iz tile_R

3-Potem pripnite svoj raster

IZBERITE ST_Clip (u_R.raster, 1, st_transform (P.geom, st_srid (u_R.raster)), false) kot raster IZ u_R, P kjer ST_Intersects (u_R.raster, st_transform (P.geom, st_srid (u_R.raster)) ))

Zdi se, da je to napaka v novejših različicah postgisov. Oglejte si vstopnico @ https://trac.osgeo.org/postgis/ticket/3457


Tudi jaz se srečujem s podobnimi težavami. Zdi se kot napaka, ki je posledica izboljšave, kot jo je predlagal @Koshy Thomas v / a / 188515/75756. Pošiljam nekaj samoumevnih posnetkov zaslona, ​​kako se obnašajo različni klici ST_Clip:

  • območje za izrezovanje (gisdata.f_a_sampling_stratum_testing)

Pravilni rezultati s prvo izdelano združitvijo ploščic

ni mogoče, če je združitev ploščic prevelika (ni primernega pomnilnika)

- union_variant spustna tabela, če obstaja gisdata.f_a_sampling_stratum_testing_clip; ustvari tabelo gisdata.f_a_sampling_stratum_testing_clip kot izberite 1 kot rid, st_clip (st_union (rast), geom, false) iz gisdata.fty_2012_020m_eu_03035_d01_full, gisdata.f_a_sampling_stratum_testcts kjer st_ gerat, geom;

Napačen rezultat pri odrezovanju ploščic

če obseg ploščice ne preseka bbox geoma, se zdi, da ST_Clip ni izveden

- tiled_variant_I spusti tabelo, če obstaja gisdata.f_a_sampling_stratum_testing_clip; ustvari tabelo gisdata.f_a_sampling_stratum_testing_clip as select rid, st_clip (rast, geom, false) kot rast iz gisdata.fty_2012_020m_eu_03035_d01_full, gisdata.f_a_sampling_stratum_testing where st_intersects (rast, st_intersects (rast, st_intersects)

Napačen rezultat pri odrezovanju rastrskih ploščic s presečišči

- tiled_variant_II spusti tabelo, če obstaja gisdata.f_a_sampling_stratum_testing_clip; ustvari tabelo gisdata.f_a_sampling_stratum_testing_clip kot select rid, primer, ko st_within (st_convexhull (rast), geom) nato rast else st_clip (rast, st_intersection (st_convexhull (rast), geom), false) end kot rast, st_withhu (st_convex, st_convex geom) kot is_within, st_intersection (st_convexhull (rast), geom) :: geometry (polygon, 3035) as geom from gisdata.fty_2012_020m_eu_03035_d01_full, gisdata.f_a_sampling_stratum_testing where st_intersects (rast, st_intersects);


Koda v zgornjem vprašanju sicer deluje pri nekaterih poizvedbah, vendar je nezanesljiva. Zaenkrat sem se poravnal s to poizvedbo, ki prevzame postopek elmo, vendar brez ustvarjanja novih tabel. Na njem nisem prodan, saj zahteva več dela, kot bi si želel - dodatnih pol sekunde, da se vrnem.

SELECT ST_AsGDALRaster (Rast, "GTiff) FROM (SELECT ST_Clip (Rast, ST_Transform (ST_GeomFromText (" POLYGON ((148,296964462160986 -28,914219626449281, 148,300054703309883 -28,892809637280056, 148,288369276810897 -28,891374636835419, 148,290750573935583 -28,87714520356819, 148,305307129311188 -28,878270936973706, 148,305323220779684 -28,892336715938328, 148,307563219233941 - 28,892525982844003, 148,30733671875592 -28,893583124483161, 148,323105875277065 -28,895609384106994, 148,319860482823429 -28,917021311138011, 148,319860482823429 -28,917021311138011, 148,296964462160986 -28,914219626449281)) ', 4326), 32655)) AS Rast oD (SELECT ST_Union (Rast) kot Rast od (SELECT Rast iZ scenes.rgb KJE ST_Intersects (scenes.rgb.rast, ST_Transform (ST_GeomFromText ( "POLYGON ((148,296964462160986 -28,914219626449281, 148,300054703309883 -28,892809637280056, 148,288369276810897 -28,891374636835419, 148,290750573935583 -28,87714520356819, 148,305307129311188 -28,878270936973706, 148,305323220779684 -28,8923 36715938328, 148,307563219233941 -28,892525982844003, 148,30733671875592 -28,893583124483161, 148,323105875277065 -28,895609384106994, 148,319860482823429 -28,917021311138011, 148,319860482823429 -28,917021311138011, 148,296964462160986 -28,914219626449281)) ', 4326), 32.655))) KOT RAST) KOT RAST) KOT Rast;