Interpolation spatiale dans PostGIS sans sortie de raster
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
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
;
Où
<P-value>est le facteur appliqué à la distance inverse; vous voulez probablement rester entre1.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.