J'utilise PostGIS2.0 pour faire des intersections raster / polygone. J'ai de la difficulté à comprendre quelle opération je dois utiliser et quelle est la façon la plus rapide de procéder. Mon problème est le suivant:
- J'ai un polygone et un raster
- Je veux trouver tous les pixels qui appartiennent au polygone et obtenir la somme de la valeur des pixels
- Et (problème mis à jour): j'obtiens des valeurs massives pour certains pixels qui n'existent pas dans le raster d'origine lorsque j'effectue la requête
J'ai du mal à comprendre si je dois utiliser ST_Intersects()
ou ST_Intersection()
. Je ne sais pas non plus quelle est la meilleure approche pour additionner mes pixels. Voici la première approche que j'ai essayée (# 1):
SELECT
r.rast
FROM
raster as r,
polygon as p
WHERE
ST_Intersects(r.rast, p.geom)
Cela renvoie une liste de rast
valeurs, dont je ne sais pas quoi faire. J'ai essayé de calculer les statistiques récapitulatives à l'aide ST_SummaryStats()
mais je ne suis pas certain s'il s'agit de la somme pondérée de tous les pixels qui se trouvent dans le polygone.
SELECT
(result).count,
(result).sum
FROM (
SELECT
ST_SummaryStats(r.rast) As result
FROM
raster As r,
polygon As p
WHERE
ST_Intersects(r.rast, p.geom)
) As tmp
L'autre approche que j'ai essayée (# 2) utilise ST_Intersection()
:
SELECT
(gv).geom,
(gv).val
FROM
(
SELECT
ST_Intersection(r.rast, p.geom) AS gv
FROM
raster as r,
polygon as p
WHERE
ST_Intersects(r.rast, p.geom)
) as foo;
Cela renvoie une liste de géométries que j'analyse plus en détail, mais je suppose que cela est moins efficace.
Je ne sais pas non plus quel est l'ordre de fonctionnement le plus rapide. Dois-je toujours choisir raster, polygon
ou polygon, raster
, ou convertir le polygone en raster pour qu'il soit raster, raster
?
EDIT: J'ai mis à jour l'approche # 2 avec quelques détails du R.K.
lien de.
En utilisant l'approche # 2, j'ai remarqué l'erreur suivante dans les résultats qui fait partie de la raison pour laquelle je n'ai pas compris la sortie. Voici l'image de mon raster original, et un contour du polygone qui est utilisé pour l'intersecter, superposé en haut:
Et voici le résultat de l'intersection avec PostGIS:
Le problème avec le résultat est qu'il y a des valeurs de 21474836 renvoyées, qui ne sont pas dans le raster d'origine. Je ne sais pas pourquoi cela se produit. Je soupçonne que cela est lié à de petits nombres quelque part (divisant par près de 0), mais cela renvoie le mauvais résultat.
ST_SummaryStats()
pour le n ° 1, mais je ne sais pas comment le faire pour le n ° 2.