Suite

Découpage de polygone PostGIS inexact à l'aide de ST_Clip et ST_Union à partir d'un raster en mosaïque


J'ai un raster RVB en mosaïque à 128x128 dans la base de données compatible PostGIS. J'essaie de découper le raster à l'aide d'un polygone comme suit :

SELECT ST_AsGDALRaster(rast,'GTiff') FROM ( SELECT ST_Union(ST_Clip(rast,geom)) AS rast FROM scènes.rgb CROSS JOIN ST_Transform(ST_GeomFromText('POLYGON(( 148.296964462160986 -28.914219654708281,148.3000) -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 OÙ ST_Intersects (Rast geom)) AS rast;

Voir le graphique, les limites de l'enclos sont des contours noirs - l'image est destinée à être découpée dans cette zone.

Ma question est comment puis-je modifier ma requête pour que le raster découpé corresponde au polygone ?


Vous devez reprojeter votre polygone sur votre projection raster, puis vous pouvez découper le raster.

Voici comment vous pouvez l'effectuer :

R = raster

u_R = union de trame

P = Polygone

1-Sélectionnez les tuiles qui croisent votre polygone

Créez la table tile_R en tant que SELECT * à partir de R où ST_Intersects(u_R.raster,st_transform(P.geom,st_srid(tiles_R.raster)))

2-Effectuez l'union de votre raster comme :

Créez la table u_R en tant que SELECT st_union(rast) en tant que raster à partir de tiles_R

3-Ensuite, découpez votre raster

SELECT ST_Clip(u_R.raster, 1, st_transform(P.geom,st_srid(u_R.raster)),false) comme raster FROM u_R, P où ST_Intersects(u_R.raster,st_transform(P.geom,st_srid(u_R.raster) ))

On dirait que c'est un bogue dans les nouvelles versions de postgis. Consultez le billet @ https://trac.osgeo.org/postgis/ticket/3457


Je suis également confronté à des problèmes similaires. Cela ressemble à un bogue résultant d'une amélioration suggérée par @Koshy Thomas dans /a/188515/75756. J'envoie des captures d'écran explicites sur le comportement des différents appels de ST_Clip :

  • zone à découper (gisdata.f_a_sampling_stratum_testing)

Résultats corrects avec l'union des tuiles faite en premier

pas possible lorsque l'union des tuiles est trop grande (ne correspond pas à la mémoire)

-- union_variant supprime la table s'il existe gisdata.f_a_sampling_stratum_testing_clip ; créer la table gisdata.f_a_sampling_stratum_testing_clip comme select 1 as rid, st_clip(st_union(rast), geom, false) à partir de gisdata.fty_2012_020m_eu_03035_d01_full, gisdata.f_a_sampling_stratum_testing où st_intersects;(rast, georects)

Résultat incorrect lors du découpage des tuiles

lorsque l'étendue de la tuile n'intersecte pas la bbox de geom, ST_Clip ne semble pas exécuté

-- tiled_variant_I supprime la table s'il existe gisdata.f_a_sampling_stratum_testing_clip ; créer la table gisdata.f_a_sampling_stratum_testing_clip comme select rid, st_clip(rast, geom, false) comme rast de gisdata.fty_2012_020m_eu_03035_d01_full, gisdata.f_a_sampling_stratum_testing où st_intersects(rast, geom);

Résultat incorrect lors du découpage des tuiles raster avec des intersections

-- tiled_variant_II drop table s'il existe gisdata.f_a_sampling_stratum_testing_clip; créer la table gisdata.f_a_sampling_stratum_testing_clip comme select rid, cas quand st_within(st_convexhull(rast), geom) puis rast else st_clip(rast, st_intersection(st_convexhull(rast), geom), false) se terminer comme rast, st_within(st_convexhull(rast), geom) as is_within, st_intersection(st_convexhull(rast), geom)::geometry(polygon, 3035) as geom de gisdata.fty_2012_020m_eu_03035_d01_full, gisdata.f_a_sampling_stratum_testing où st_intersects(rast, geom);


Le code de ma question ci-dessus fonctionne pour certaines requêtes, mais n'est pas fiable. J'ai fini par me contenter pour l'instant de cette requête qui prend en compte le processus d'elmo mais sans créer de nouvelles tables. Je ne suis pas convaincu car cela nécessite plus de travail que je ne le souhaiterais - une demi-seconde supplémentaire pour le retour.

SELECT ST_AsGDALRaster (Rast, 'GTiff') FROM (SELECT ST_Clip (Rast, ST_Transform (ST_GeomFromText ( 'polygonal ((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) OÙ ST_Intersects (scenes.rgb.rast, ST_Transform (ST_GeomFromText ( 'POLYGONE ((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))) AS Rast) AS Rast) AS Rast;


Voir la vidéo: Postgis Tutorial 168: Postgis raster (Octobre 2021).