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:
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
Réponses:
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=box
option pour un raster "simple" et utilisez l'filter=gauss
option pour l'autre noyau ArcGIS. Utilisez l'-n
indicateur 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.)
la source
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!
la source
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:
Importez les points dans une carte raster à l'
r.in.xyz
aide de method = sum à une résolution raster spécifiée (définie avecg.region
).Utilisez
r.neighbors
pour 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!)
la source
v.in.xyz
etv.neighbors
pourrait également fonctionner.v.neighbors
Cependant, le manuel ne précise pas comment vous définissez l'attribut utilisé .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
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
la source
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.
la source
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 lagetImage()
méthode et enregistrée sur votre disque avec aImageIO.write("mymap.png")
.Voici un exemple de sortie:
Il est possible de modifier la force de lissage et la palette de couleurs.
la source