Interpolation spatiale dans PostGIS sans sortie de raster

Sep 03 2020

J'ai des données similaires aux précipitations, c'est-à-dire. une latitude, une longitude et un nombre Z. C'est dans une couche de points qui est une belle grille de points propres. De nombreux nombres Z manquent dans cette grille.

Je veux interpoler pour trouver des nombres Z raisonnables. TIN, IDW ou autres méthodes. Je ne veux pas entrer dans un raster d'abord, puis reculer les intersections du raster vers la grille de points.

Je peux effectuer une interpolation dans QGIS, mais cela génère un raster que je souhaite éviter. Le but est d'effectuer tous les calculs dans PostgreSQL à des fins de production.

Est-ce possible?

Réponses

1 geozelot Sep 04 2020 at 15:20

Une implémentation naïve d'IDW, du haut de ma tête:

UPDATE <points> AS itp
  SET  "Z" = (
    SELECT SUM(z/d)/SUM(1/d)
    FROM   (
      SELECT smpl."Z" as z,
             ST_Distance(itp.geom, smpl.geom)^<P-value> AS d
      FROM   <point> AS smpl
      ORDER BY
             itp.geom <-> smpl.geom
      WHERE  smpl."Z" IS NOT NULL
      LIMIT  <sample_size>
    ) sq
    WHERE  ipt."Z" IS NULL
  ) q
;

  • <P-value>est le facteur appliqué à la distance inverse; vous voulez probablement rester entre 1.0et2.0

  • <sample_size>la quantité de points d'échantillonnage (connus) à prendre en compte dans le (k) voisinage le plus proche

Cela fait un moment que je n'ai pas regardé l'algorithme IDW, donc cela peut avoir besoin d'être peaufiné; la sous-requête sqrenvoie la liste des distances inverses (lorsqu'elle est utilisée comme 1/<distance>^p), de sorte que vous pouvez partir de là si vous devez modifier les sommes IDW réelles.