Quelle est la meilleure façon de produire une carte de densité à partir de points pondérés dans QGIS?

18

Je voudrais vraiment répéter la fonctionnalité de l'outil ArcGIS Kernel Density - comment pourrais-je faire cela?

Je voudrais limiter les réponses aux logiciels libres et open-source faciles à installer - c'est-à-dire que QGIS s'installe facilement avec GRASS sur toutes les plates-formes, donc QGIS + GRASS serait bien, mais SAGA ne le fait pas (malheureusement, car il a ce qui peut être l'outil idéal).

J'essaie de produire des cartes de densité de la faune à travers les aires protégées dans QGIS. La carte de densité dans l'exemple suivant a été produite dans ArcGIS à partir d'observations ponctuelles de la faune, avec des dénombrements bruts de taille de groupe (un champ dans le fichier vectoriel) utilisés pour pondérer la densité de chaque cellule de la grille dans l'outil Kernel Density (SpatialAnalyst), avec un rayon de recherche et une taille de cellule de grille choisis:

Densité de la faune dans le parc national de Kafue avec des cellules de grille de 5x5 km et une densité de noyau de 7,5 km de rayon

Dans une question précédente sur la densité , il a été suggéré d'utiliser l'outil GRASS v.kernel pour imiter l'outil ArcGIS Kernel Density, mais v.kernel ne fait pas le même travail . Après avoir regardé le manuel et produit (avec succès) une carte de densité, il semble que la fonction v.kernel ne fonctionne qu'avec la densité de points , et il n'y a aucune possibilité de donner une variable pour chaque point (comme le nombre brut) pour pondérer chaque point .

MISE À JOUR

Il semble y avoir divers *.surf.*outils dans GRASS qui peuvent aider à créer une surface de densité - et ceux-ci acceptent une colonne de pondération ou une valeur z, ou sont exécutés sur des rasters. @underdark a suggéré v.surf.rst - et la 'zcolumn' serait ma variable de pondération (nombre) - mais je ne sais pas comment demander à l'outil de créer une certaine taille de grille ou d'utiliser un certain rayon.

Des suggestions sur la façon d'utiliser v.surf.rst ou toute autre méthode?


Exemples de données

x,y,count
431250,8707500,0
418750,8707500,5
413750,8707500,3
411250,8707500,1
408750,8685000,0
411250,8685000,0
416250,8685000,0
416250,8682500,6
411250,8682500,3
418750,8680000,0
433750,8677500,3
421250,8677500,0
423750,8675000,1
431250,8672500,0
428750,8672500,2
426250,8672500,2
423750,8670000,0
Simbamangu
la source
Pouvez-vous décrire davantage vos données d'entrée? Peut-être que v.surf.rst serait plus approprié que v.kernel grass.osgeo.org/gdp/html_grass64/v.surf.rst.html . Avez-vous une valeur de comptage par cellule de grille ci-dessus?
underdark
@underdark - Ajout de quelques exemples de données. Ce sont des données ponctuelles avec des dénombrements (nombre d'éléphants vus) et il peut y avoir plus d'une observation par cellule de la grille. Normalement, dans ArcGIS, 'count' deviendrait le champ 'population' de l'outil de densité du noyau.
Simbamangu
Plus j'y pense, moins je pense que v.kernel est un bon choix pour votre cas d'utilisation. Avez-vous vérifié la littérature? Peut-être posez-vous d'abord une question sur la méthode appropriée dans ce cas.
underdark
ma principale question est de savoir comment répéter la fonctionnalité de la densité du noyau d'Arcview, qui est une méthode connue. Vous avez raison, v.kernel n'est certainement pas le bon outil pour le faire!
Simbamangu
@underdark, merci - j'ai un peu élargi la question, ce qui peut aider; v.surf.rst semble approprié mais pourrait utiliser quelques conseils sur son utilisation.
Simbamangu

Réponses:

8

Selon sa page de manuel, la commande GRASS r.resamp.filter fera pour les rasters représentant des données de point exactement ce qu'ArcGIS fera pour les couches de points : utilisez l' filter=boxoption pour un raster "simple" et utilisez l' filter=gaussoption pour l'autre noyau ArcGIS. Utilisez l' -nindicateur pour éviter de propager des valeurs nulles.


Notez que les estimations de densité du noyau (alias "cartes thermiques") ne sont pas des interpolations des données. La valeur d'un KDE à un emplacement x estime le montant d'une valeur " Z " par unité de surface près de x . (Le rayon ou la "bande passante" quantifie ce que signifie "proche".) Les valeurs de Z n'ont pas besoin d'être définies à chaque emplacement possible sur la carte. Par exemple, Z pourrait représenter la présence de quelque chose comme une personne, auquel cas le KDE donne une densité de population . Les valeurs de Z ne doivent pas non plus varier en continu sur la carte. Pour l'interpolation, on suppose que Zest définie à tous les emplacements et que les données sont des observations des valeurs de Z à des points spécifiés. L'interpolateur tente de prédire les valeurs non observées de Z à tous les autres points. Cela aurait du sens lorsque Z est, disons, une température ou une pression, mais est généralement absurde lorsque Z enregistre la présence de quelque chose ou lorsque les données sont un recensement complet. (Dans ce dernier cas, réfléchissez à ce que pourrait signifier une carte de densité routière pour une région et comment on pourrait éventuellement donner un sens à "interpoler" les routes à travers les zones non routières.)

whuber
la source
Je ne semble pas avoir r.resamp.filter dans ma boîte à outils GRASS (sur OS X, GRASS 6.4). Cependant - jusqu'à ce que vous en parliez, je ne m'étais pas rendu compte que les «cartes de chaleur» étaient la même chose que KD; J'ai supposé qu'ils interpolaient toute la surface. L'outil Raster | Heatmap de QGIS fait-il un KD? Qu'est-ce que le «taux de décroissance»?
Simbamangu
Je crois que le terme "carte thermique" a été coopté dans le SIG de sa signification originale en une référence qui se réfère généralement et vaguement à presque n'importe quelle carte de type raster. Je doute que tout SIG offre des fonctionnalités qui correspondent à la signification d'origine.
whuber
Après enquête, l'outil de carte thermique dans QGIS fait quelque chose de similaire à KD dans Arc, si vous définissez le taux de décroissance à 0 (en diminuant la densité à 0 sur les bords du rayon). Il semble y avoir quelques différences: valeurs de cellule calculées 25 x plus élevées (rayon de 5 km / cellule de 2,5 km), tout comme la façon dont la fonction est appliquée aux cellules - Arc semble utiliser un rayon autour du point réel, tandis que QGIS sélectionne la cellule qui se chevauche et s'effile à partir de ce point.
Simbamangu
2
"Heatmap" dans l'utilisation courante semble signifier beaucoup de choses - en regardant autour, je le vois appliqué aux surfaces interpolées, à la densité du noyau et à la simple coloration des pixels non lissés. Document intéressant sur l'utilisation / l'historique d'origine - et il semble que nous devrions peut-être utiliser des termes plus précis dans l'étiquetage des outils QGIS.
Simbamangu
3
@Simbamangu r.resamp.filter est nouveau dans GRASS 7 , mais il y a un aperçu mensuel pour OS X . De plus, l'outil heatmap ne semble pas présenter de choix pour l'algorithme de distribution de la densité, il n'est donc pas exactement équivalent à Kernel Density ou r.resamp.filter, je pense.
Torsti
3

Le module de SAGA 'Kernel Density Estimation' est ce que vous recherchez.

Installez l'interface du module SAGA dans QGIS (dans le menu: Plugins -> Fetch Python plugins ..) et utilisez le module. Bonne chance!

Vladimir
la source
J'AIMERAIS utiliser SAGA, mais je travaille dans OSX 10.7 et je n'ai pas encore réussi à le construire (il n'y a pas de binaires pour OSX); J'ai utilisé des heures récemment pour essayer plus d'une méthode de compilation, mais les builds échouent toujours.
Simbamangu
Ensuite, vous devez plutôt poser des questions sur la compilation SAGA sur OSX 10.7. Comme je le vois, SAGA est la seule alternative raisonnable à l'outil ArcGIS KD.
Vladimir
3

Une méthode vraiment simpliste avec GRASS GIS qui est plus proche de la densité de points dans ArcMap que de la densité de noyau:

  1. Importez les points dans une carte raster à l' r.in.xyzaide de method = sum à une résolution raster spécifiée (définie avec g.region).

  2. Utilisez r.neighborspour lisser la carte avec method = average (qui est par défaut) et utilisez la taille de l'option pour définir le rayon de recherche.

(Je n'ai pas accès à GRASS pour le moment donc je n'ai pas vraiment essayé ça!)

Torsti
la source
v.in.xyzet v.neighborspourrait également fonctionner. v.neighborsCependant, le manuel ne précise pas comment vous définissez l'attribut utilisé .
Torsti
2

Comme vous avez demandé plus de conseils sur v.surf.rst, voici mes entrées

Tout d'abord, à propos de la taille de la grille - vous pouvez utiliser Plugin -> GRASS -> Edit Current GRASS region et définir la résolution de sortie. Votre sortie de v.surf.rst aura cette résolution.

Pour le rayon, la «tension» semble être le paramètre. Je ne suis pas un expert de cet algorithme mais en lisant le manuel, cela semble être le bit pertinent

"... La haute tension" augmente les distances entre les points "et réduit la portée de l'impact de chaque point, la faible tension" diminue la distance "et les points s'influencent mutuellement sur une plus longue portée) .."

Vous pouvez donc utiliser le paramètre de tension à peu près comme vous utiliseriez le paramètre de rayon.

D'après vos exemples de données, le résultat de v.surf.rst ressemble à ci-dessous et semble raisonnable étant donné qu'il utilise les nombres comme poids pour l'interpolation

entrez la description de l'image ici

pensées spatiales
la source
1
Merci pour cela - beaucoup plus facile à comprendre que la page d'aide. Comme indiqué ci-dessus par @whuber, l'interpolation n'est cependant pas la bonne méthode pour ce type de données d'échantillonnage ponctuel.
Simbamangu
2

Bien que je ne l'ai pas testé, dans le référentiel QGIS Contributors, il existe un plugin appelé 'Home range estimation with R'. Cela inclut les calculs du noyau (densité?). Je pense, si cela fonctionne, que ce serait la meilleure méthode. R fera la vraie méthode statistique de calcul de la densité du noyau.

Si vous avez installé R, vous devriez pouvoir simplement installer le plugin et l'essayer.

Alex Leith
la source
1

Si vous acceptez de faire un peu de programmation java en dehors de qgis, vous pouvez simplement utiliser cette bibliothèque de construction de carte de densité .

En utilisant le constructeur HeatMapBuilder(int w, int h, int[][] pts, int[] weights), il est possible de donner un poids pour chaque point selon vos besoins. L'image de sortie peut être récupérée avec la getImage()méthode et enregistrée sur votre disque avec a ImageIO.write("mymap.png").

Voici un exemple de sortie:

carte thermique avec la bibliothèque java opencarto

Il est possible de modifier la force de lissage et la palette de couleurs.

julien
la source