Mehr

PostGIS-Polygon-Clip ungenau mit ST_Clip und ST_Union aus gekacheltem Raster

PostGIS-Polygon-Clip ungenau mit ST_Clip und ST_Union aus gekacheltem Raster


Ich habe ein RGB-Raster, das mit 128x128 in einer PostGIS-fähigen Datenbank gekachelt ist. Ich versuche, mit einem Polygon wie folgt aus dem Raster zu schneiden:

SELECT ST_AsGDALRaster(rast,'GTiff') FROM ( SELECT ST_Union(ST_Clip(rast,geom)) AS rast FROM Scenes.rgb CROSS JOIN ST_Transform(ST_GeomFromText('POLYGON(( 148.296964462160986 -28.914219626449281, 148.30000547083, 288.300505893509883,36800547083, 288.36897982, 288.9883,48.8005 -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;

Siehe Grafik, Fahrerlagerbegrenzung ist schwarz umrandet - Bild soll auf diesen Bereich zugeschnitten werden.

Meine Frage ist, wie kann ich meine Abfrage ändern, damit das abgeschnittene Raster mit dem Polygon übereinstimmt?


Sie müssen Ihr Polygon auf Ihre Rasterprojektion neu projizieren, dann können Sie das Raster zuschneiden.

So können Sie es ausführen:

R = Raster

u_R = Vereinigung des Rasters

P = Polygon

1-Wählen Sie Kacheln aus, die sich mit Ihrem Polygon kreuzen

Erstellen Sie die Tabelle tile_R als SELECT * from R where ST_Intersects(u_R.raster,st_transform(P.geom,st_srid(tiles_R.raster)))

2-Führen Sie die Vereinigung Ihres Rasters wie folgt aus:

Tabelle u_R als SELECT st_union(rast) als Raster aus tile_R erstellen

3-Dann schneiden Sie Ihr Raster zu

SELECT ST_Clip(u_R.raster, 1, st_transform(P.geom,st_srid(u_R.raster)),false) als Raster FROM u_R, P where ST_Intersects(u_R.raster,st_transform(P.geom,st_srid(u_R.raster) ))

Scheint ein Fehler in neueren Versionen von Postgis zu sein. Schauen Sie sich das Ticket an @ https://trac.osgeo.org/postgis/ticket/3457


Ich stehe auch vor ähnlichen Problemen. Es scheint ein Fehler zu sein, der aus einer Verbesserung resultiert, wie von @Koshy Thomas in /a/188515/75756 vorgeschlagen. Ich schicke einige selbsterklärende Screenshots, wie sich verschiedene Aufrufe von ST_Clip verhalten:

  • auszuschneidender Bereich (gisdata.f_a_sampling_stratum_testing)

Korrekte Ergebnisse mit zuerst erstellter Vereinigung der Fliesen union

nicht möglich, wenn die Vereinigung der Kacheln zu groß ist (Speicher nicht passen)

-- union_variant-Drop-Tabelle, falls vorhanden gisdata.f_a_sampling_stratum_testing_clip; Tabelle erstellen gisdata.f_a_sampling_stratum_testing_clip as select 1 as rid, st_clip(st_union(rast), geom, false) from gisdata.fty_2012_020m_eu_03035_d01_full, gisdata.f_a_sampling_stratum_testings group(st_geom, false)

Falsches Ergebnis beim Zuschneiden von Fliesen

Wenn die Kachelausdehnung die Bbox von Geom nicht schneidet, scheint ST_Clip nicht ausgeführt zu werden

--tiled_variant_I Tabelle löschen, falls vorhanden gisdata.f_a_sampling_stratum_testing_clip; Tabelle erstellen gisdata.f_a_sampling_stratum_testing_clip als select rid, st_clip(rast, geom, false) as rast from gisdata.fty_2012_020m_eu_03035_d01_full, gisdata.f_a_sampling_stratum_testing where st_geom,

Falsches Ergebnis beim Zuschneiden von Rasterkacheln mit Schnittpunkten

--tiled_variant_II Tabelle ablegen, falls vorhanden gisdata.f_a_sampling_stratum_testing_clip; Tabelle erstellen gisdata.f_a_sampling_stratum_testing_clip as select rid, case when st_within(st_convexhull(rast), geom) then rast else st_clip(rast, st_intersection(st_convexhull(rast), geom), false) end as rast, st_within(st_convexhull(rast), geom) as 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, geom


Der Code in meiner obigen Frage funktioniert für einige Abfragen, ist jedoch unzuverlässig. Ich habe mich vorerst mit dieser Abfrage begnügt, die den Prozess von elmo aufnimmt, aber keine neuen Tabellen erstellt. Ich bin nicht davon überzeugt, da es mehr Arbeit erfordert, als ich möchte - eine zusätzliche halbe Sekunde für die Rückkehr.

SELECT ST_AsGDALRaster (rast, 'GTiff') aus (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.296964462160996264,28 WO 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), 32655))) als rast) AS rast) AS rast;

Schau das Video: Lesson 3: QGIS Tutorial to clip vector layer in Hindi