Suite

Additionner les valeurs d'un seul raster et afficher la valeur sous forme de nombre ?

Additionner les valeurs d'un seul raster et afficher la valeur sous forme de nombre ?


J'ai un raster à virgule flottante et je lui ai appliqué une condition afin d'extraire uniquement les valeurs positives, il n'y a donc pas de "trous" de données dans le raster. Je dois simplement additionner les valeurs de ce raster et les sortir sous forme de nombre.

Je suis tombé sur ce fil, que je suis sûr que certains d'entre vous reconnaîtront. Quelqu'un a-t-il développé une solution de travail? Je travaille dans Arc10 et j'utilise ArcObjects si nécessaire.

ÉDITER: J'ai inclus une version VB.NET du code C# de @Kirk. Il est fourni tel quel, mais il devrait être un bon point de départ s'il ne remplit pas déjà complètement son objectif.

Public Shared Sub TestSumRaster() Dim path As String = "D:	opo_modeling	opo_modelinggisusgs
ed_10m.img" Dim rds = OpenRaster(path) Dim sum As Double = SumRaster(rds) Debug.Print("sum : {0}", sum) End Sub Public Shared Function SumRaster(rasDs As IRasterDataset) As Double ' résume chaque bande dans un jeu de données raster Dim rasBandCol As IRasterBandCollection = DirectCast(rasDs, IRasterBandCollection) Dim sum As Double = 0.0 ' Itérer sur chaque bande de l'ensemble de données. For i As Integer = 0 To rasBandCol.Count - 1 sum += SumBand(rasBandCol.Item(i)) Next Return sum End Function Private Shared Function SumBand(rBand As IRasterBand) As Double ' additionne chaque bloc dans une bande Dim sum As Double = 0.0 ' QI to IRawBlocks from IRasterBandCollection Dim rawBlocks = DirectCast(rBand, IRawBlocks) ' Détermine la structure de tuile pour le jeu de données raster. Dim tile = New Tile(rawBlocks.RasterInfo) ' NoData est un tableau, mais ne contient généralement qu'une seule valeur. Debug.Print(rawBlocks.RasterInfo.NoData.[GetType]().ToString()) ' Crée le bloc de pixels. Dim pb = rawBlocks.CreatePixelBlock() ' Itère à travers les blocs de pixels. For pbYcursor As Integer = tile.startY To tile.endY - 1 For pbXcursor As Integer = tile.startX To tile.endX - 1 ' Obtient le bloc de pixels. rawBlocks.ReadBlock(pbXcursor, pbYcursor, 0, pb) sum += SumBlock(pb, pbXcursor, pbYcursor, rawBlocks.RasterInfo.NoData) Next Next Return sum End Function Private Shared Function SumBlock(pb As IPixelBlock, pbXcursor AsbY As Integer Entier, noDataValues ​​As Object) As Double ' résume chaque pixel du bloc de pixels Dim sum As Double = 0.0 ' Place le bloc de pixels dans un SafeArray pour la manipulation. Dim safeArray = TryCast(DirectCast(pb.get_SafeArray(0), System.Array), System.Array) Dim noDataList = New List(Of [Single])(DirectCast(noDataValues, [Single]())) ' Itérer dans le pixels dans le bloc de pixels. For row As Integer = 0 To pb.Height - 1 For col As Integer = 0 To pb.Width - 1 Dim val As Object = safeArray.GetValue(row, col) Dim singVal = DirectCast(val, [Single]) 'Debug .Print(val.GetType().Name); If Not noDataList.Contains(singVal) Then sum += singVal End If Next Next Return sum End Function

Voici le code adapté de cet exemple. Vous devrez le modifier si votre raster est double (au lieu de Single). Testé avec un DEM téléchargé ici. J'ai entendu quelque part que C# est maintenant meilleur pour gérer la contravariance. Si tel est le cas, je serais curieux de savoir comment ce code pourrait être généralisé pour prendre en charge les rasters en simple ou en double précision.

public static void TestSumRaster() { string path = @"D:	opo_modeling	opo_modelinggisusgs
ed_10m.img" ; var rds = OpenRaster(chemin); double somme = SumRaster(rds); Debug.Print("somme : {0}", somme); } public static double SumRaster(IRasterDataset rasDs) { // résume chaque bande dans un jeu de données raster IRasterBandCollection rasBandCol = (IRasterBandCollection)rasDs; double somme = 0,0 ; // (je ne pense pas à un cas où vous auriez besoin de faire la somme sur plusieurs bandes) // Itérer sur chaque bande de l'ensemble de données. for (int i = 0; i < rasBandCol.Count; i++) { sum += SumBand(rasBandCol.Item(i)); } renvoie la somme ; } private static double SumBand(IRasterBand rBand) { // additionne chaque bloc dans une bande double sum = 0.0; // QI aux IRawBlocks de IRasterBandCollection. var rawBlocks = (IRawBlocks)rBand; // Déterminez la structure de tuile pour le jeu de données raster. var tile = new Tile(rawBlocks.RasterInfo); // NoData est un tableau, mais ne contient généralement qu'une seule valeur. Debug.Print(rawBlocks.RasterInfo.NoData.GetType().ToString()); // Crée le bloc de pixels. var pb = rawBlocks.CreatePixelBlock(); // Itérer à travers les blocs de pixels. for (int pbYcursor = tile.startY; pbYcursor < tile.endY; pbYcursor++) { for (int pbXcursor = tile.startX; pbXcursor < tile.endX; pbXcursor++) { // Récupère le bloc de pixels. rawBlocks.ReadBlock(pbXcursor, pbYcursor, 0, pb); sum += SumBlock(pb, pbXcursor, pbYcursor, rawBlocks.RasterInfo.NoData); } } renvoie la somme ; } private static double SumBlock(IPixelBlock pb, int pbXcursor, int pbYcursor, object noDataValues) { // additionne chaque pixel dans le pixelblock double sum = 0.0; // Place le bloc de pixels dans un SafeArray pour la manipulation. var safeArray = (System.Array)pb.get_SafeArray(0) as System.Array; var noDataList = nouvelle liste((Single[])noDataValues); // Itérer sur les pixels du bloc de pixels. for (int row = 0; row < pb.Height;row++) { for (int col = 0; col < pb.Width;col++) { object val =safeArray.GetValue(row, col); var singVal = (simple) val; //Debug.Print(val.GetType().Name); if(!noDataList.Contains(singVal)) sum += singVal; } } renvoie la somme ; } public statique IRasterDataset OpenRaster (chemin de chaîne) { IGPUtilities3 gpUtil = new GPUtilitiesClass(); var rds = gpUtil.OpenFromString(path) as IRasterDataset; retour rds; } public class Tile { public int startX; public int endX; public int startY; public int endY; public Tile(IRasterInfo rasInfo) { this.startX = (int)Math.Floor((rasInfo.Extent.Envelope.XMin - rasInfo.Origin.X) / (rasInfo.BlockWidth * rasInfo.CellSize.X)); this.endX = (int)Math.Ceiling((rasInfo.Extent.Envelope.XMax - rasInfo.Origin.X) / (rasInfo.BlockWidth * rasInfo.CellSize.X)); this.startY = (int)Math.Floor((rasInfo.Origin.Y - rasInfo.Extent.Envelope.YMax) / (rasInfo.BlockHeight * rasInfo.CellSize.Y)); this.endY = (int)Math.Ceiling((rasInfo.Origin.Y - rasInfo.Extent.Envelope.YMin) / (rasInfo.BlockHeight * rasInfo.CellSize.Y)); } }

Pourriez-vous expérimenter avec une grille connue… voici une suggestion d'implémentation en utilisant Python, numpy et arcpy.

>>> importer arcpy >>> npArray = arcpy.RasterToNumPyArray("c:/temp/x") >>> importer numpy >>> imprimer numpy.sum(npArray) 45763093 >>>

EDIT Commentaires supplémentaires sur ce qui précède.

Vous devez être prudent lorsque vous traitez des grilles qui ne contiennent aucune donnée. Considérons une petite grille avec les valeurs suivantes :

1 2 3

-- 5 --

7 8 --

où -- représente nodata. Par exemple, si la grille ci-dessus est convertie en un tableau numpy, puis additionnée :

>>> z = arcpy.RasterToNumPyArray("c:/temp/small_grid") >>> np.sum(z) nan

le résultat est évidemment inattendu.
Si le tableau est converti en un tableau masqué, la sommation est correcte.

>>> z1 = np.ma.masked_array(z, np.isnan(z)) >>> np.sum(z1) 26.0

Créez un raster à valeur unique (CreateConstantRaster).

Calculez la somme zonale (ZonalStatisticsAsTable).

Lisez la colonne "SUM" du tableau à une seule ligne résultant.


J'ai élaboré une solution utilisant le géotraitement standard qui peut être implémentée à l'aide d'ArcObjects.

Contribution: raster à virgule flottante (peut inclure des trous sans données)

1) Convertir le raster en entrée en entier

2) Convertir le raster entier en polygone

3) Effectuer des statistiques zonales sur le raster en entrée (en utilisant SUM ou ALL)

4) À l'aide d'ArcObjects, lisez la colonne SUM et ajoutez toute la valeur pour obtenir la somme raster

Vous pouvez stocker cette valeur en tant que double. Dans mon cas, je calculais la valeur raster, j'ai donc simplement multiplié la somme des valeurs raster par la résolution de la cellule raster.

Merci pour toutes vos contributions - cela m'a vraiment aidé à comprendre cette tâche.


Outils d'analyse à raster unique III

FILTRE apparaît dans les menus Analyse/Contexte et Analyse/Traitement d'images. Il peut être appliqué à une variété de tâches différentes. Vous pouvez trouver les noms convolution, fenêtre itinérante ou alors filtration aussi pour ses fonctions. Dans le concept de Modélisation cartographique, établi par D. TOMLIN * , le module fait référence à la famille des Opérateurs Focaux. Dans le contexte des opérateurs focaux, prêtez attention aux NDC-option (= nombre de classes différentes) dans SCHÉMA en ce qui concerne FocalVariété. Plus de fonctions focales - toutes celles de PATTERN également - peuvent être trouvées dans la fonction TEXTURE.

FILTER accepte une image d'entrée et calcule les cellules image de sortie en fonction de leur voisinage. Dans l'IDRISI, le voisinage est défini par un noyau de 3x3 cellules (fenêtre) se concentrant sur la cellule centrale. Pour avoir une idée de la façon dont cela fonctionne, imaginez que ce noyau "se promène" sur le raster en entrée cellule par cellule. Maintenant, le pixel cible et ses 8 voisins sont multipliés par les valeurs stockées dans le noyau, puis additionnés et le résultat est écrit dans le pixel correspondant dans l'image de sortie :

  • Moyenne (= passe-bas) : 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 1/9 (=Moyenne Focale), autorise les noyaux 3x3, 5x5 et 7x7
  • Gaussien, permet des noyaux 5x5 et 7x7
  • Médiane, autorise les noyaux 3x3 et 5x5
  • Adaptive Box, permet les noyaux 3x3, 5x5 et 7x7
  • Mode (= Majorité Focale), autorise les noyaux 3x3, 5x5 et 7x7
  • Amélioration du bord laplacien : -1/9 -1/9 -1/9 -1/9 +17/9 -1/9 -1/9 -1/9 -1/9, permet les noyaux 3x3, 5x5 et 7x7
  • Passe haut : -1/9 -1/9 -1/9 -1/9 +8/9 -1/9 -1/9 -1/9 -1/9, 3x3
  • Détecteur de bords Sobel, 3x3

Vous devrez peut-être traiter des images « bruyantes » pour l'une ou l'autre des raisons - le plus souvent, cela vous préoccupera lors du traitement de l'image, par ex. généraliser les classifications brutes. Mais il y aura des cas dans les SIG, où il est approprié d'appliquer un filtre passe-bas, obtenant des résultats quelque peu « lissés ». Les DEM interpolés sont un exemple courant. Le choix du type de filtre dépend fortement de la nature de vos données

Traitons un DEM avec FILTER. Il montre des artefacts indésirables générés par la jonction de deux DEM de sources différentes. Il y a des pixels aléatoires avec une valeur de 0 (zéro) dispersés sur tout le DEM. Comment pourrait-on les supprimer ? Il y a plus qu'un moyen.

- une filtre moyen ne donnerait certainement pas des résultats satisfaisants, car la plage au sein du noyau 3x3 autour des pixels erronés est beaucoup trop élevée. Utilisez des filtres moyens, par ex. à lisse DEM.
- les filtre médian est censé supprimer correctement le bruit des images - examinez également la représentation graphique des images différentes.
- une filtre de mode semble être le meilleur choix pour notre problème.

Le graphique ci-dessous montre un DEM bruyant moyen, médian et filtré en mode (j'espère que vous reconnaîtrez les petits points). diffmean, diffmedi et diffmode sont des images de différence (DEM bruité moins sorties filtrées - fait avec OVERLAY) pour vérifier ce qui a été filtré. diffmode contient les pixels de bruit eux-mêmes :

Comme indiqué ci-dessus, le lissage est appliqué aux images d'apparence « bruyante », mais que faire si le bruit n'est pas réparti de manière homogène sur l'image ? Un DEM peut afficher quelques pixels erronés comme des trous de tir dans une partie de l'image. Votre intention n'est donc pas de lisser l'ensemble de l'image et donc de perdre des informations inutilement.

Dans un tel cas le Filtre de boîte adaptative serait un bon choix : vous donnez deux valeurs de seuil - une pour l'écart type local (calculé à partir des valeurs dans la fenêtre du noyau mobile 3x3, 5x5 ou 7x7) et une comme différence acceptable entre la cellule focalisée et la moyenne des voisins . De plus, vous décidez de l'action à entreprendre en cas de dépassement des seuils d'écart type et de différence (en remplaçant ces pixels par zéro ou par une moyenne locale). Tous les autres pixels sont laissés d'origine. Par cela, seules les valeurs très variables seront mises en correspondance.

Distinguer les noyaux FILTER, qui améliorer et ceux qui détecter et « extraire » zones de changement soudain. Les premiers ont des valeurs de fenêtre itinérante qui totalisent 1, donc dans le cas de 9 valeurs similaires dans un raster, il n'y aura aucun changement dans la sortie. Si au moins une valeur diffère des autres, ce « contraste » obtient renforcée.
Les filtres de détection de contour (passe-haut) totalisent jusqu'à 0 (zéro), de sorte que les cellules entourées de voisins avec les mêmes valeurs sont définies sur 0 (zéro) :

En particulier, le filtre passe-haut détecte certaines irrégularités dans le DEM, qui n'apparaissaient pas dans l'original. Le DEM a été reconstitué à partir de différentes sources et nous venons de trouver une couture !

Le module TEXTURE (depuis IfW 2) a la capacité de faire une analyse Edge en appliquant des noyaux de filtre directionnel 3x3 à l'image d'entrée. Il produira jusqu'à 8 images (N, NE, E, SE, S, SW, W et NW).

Le noyau 3x3 défini par l'utilisateur en option peut être utilisé pour créer filtres directionnels. En fonction de la somme globale du noyau, ils peuvent améliorer ou détecter des structures directionnelles dans les images filtrées. Quelques exemples éclaireront ce principe :

Le filtre de détection NE-SW éclaire (= valeurs élevées) les crêtes NE-SW (lignes profilées, . ), les apparences noires (= valeurs basses et négatives) indiquent les diagonales diamétrales.

Dernière modification : | Commentaires à Eric J. LORUP centre de ressources idrisi idrisi gis idrisi gis idrisi centre de ressources idrisi gis idrisi gis idrisi centre de ressources idrisi gis idrisi gis idrisi centre de ressources idrisi gis idrisi gis idrisi ressource centre idrisi gisis gis idrisi centre idrisi gis idrisi gis idrisi centre de ressources idrisi gis idrisi gis idrisi centre de ressources idrisi gis idrisi gis idrisi centre de ressources idrisi gis idrisi gis idrisi centre de ressources idrisi gis idrisi gis idrisi id centre de ressources idrisgisi idrisi id centre de ressources idrisi gis idrisi gis centre de ressources idrisi idrisi gis idrisi gis idrisi centre de ressources idrisi gis idrisi gis


Optimiser une fonction raster::calc - fonction 1 vs 2 - R

Je travaille sur le calcul d'un nouveau raster (ras de sortie) basé sur 2 rasters (ras d'entrée) et un raster 'stratum'. Les valeurs raster de strate (1 à 4) font référence aux lignes dans les blocs de données de biais et de pondération. La valeur de strate '4' a été utilisée pour remplir tout 'NA' dans le raster Strata, sinon la fonction se bloquerait. L'entrée suivante est requise.

La fonction suivante (fusion) me permet d'ajouter une valeur de "biais" aux rasters en entrée. Une fois le biais ajouté, les deux valeurs de cellule raster en entrée corrigées seront multipliées par une valeur de pondération, selon la strate à laquelle elles appartiennent.

Le résultat des 2 valeurs raster d'entrée sera additionné et renvoyé à l'aide de 'calc'.

Le problème avec la fonction ci-dessus est que :

Si un raster a NA, alors le résultat sera NA pour cette cellule

Ce que j'aimerais avoir c'est :

  • Une fonction qui prend quelconque nombre de rasters en entrée
  • Il peut fonctionner avec des valeurs NA (ignore les valeurs NA dans les rasters)
  • Réajuste le "poids" si un raster a une valeur NA, de sorte que les valeurs de poids restantes totalisent 1

La fonction suivante fait ce dont j'ai besoin, mais est nettement plus lente que la fonction ci-dessus sur les grands rasters. Fusion le fait en 10 secondes, la fonction fusion2 ci-dessous nécessite 8 heures sur les grands rasters.


En savoir plus sur la fonction LAS vers raster

Le lidar est un capteur actif qui envoie une impulsion laser à une fréquence et une longueur d'onde particulières. Cette impulsion est absorbée ou réfléchie par différentes surfaces et reçue par le capteur. Une seule impulsion d'un laser peut être renvoyée sous forme de signaux multiples car elle se reflète sur des objets à différentes hauteurs sur ou au-dessus du sol, ce qui entraîne le retour d'impulsions au capteur à des moments différents. Par conséquent, le type de retour peut être utilisé pour différencier les retours au sol des autres retours, tels que la canopée des arbres. La fonction LAS vers raster vous permet de sélectionner une ou plusieurs valeurs de retour. Comparer le timing et l'intensité des signaux de retour.

Les classifications sont définies pour les points par le fournisseur des fichiers LAS. Vous pouvez sélectionner Tout pour ajouter tous les points quelle que soit leur classification, vous pouvez également en sélectionner plusieurs. Les types de classification de la spécification LAS 1.3 .pdf sont quelconques, (0) Jamais classés, (1) Non classés, (2) Sol, (3) Végétation faible, (4) Végétation moyenne, (5) Végétation élevée, (6) Bâtiment, (7) Point bas bruyant, ( 8) Point clé du modèle, (9) Eau, (10) Rail, (11) Surface de la route, (12) Réservé12, (13) Grille de protection, (14) Conducteur de fil, (15) Tour de transmission, (16) Structure de fil connecteur, (17) pont de pont, et (18) bruit élevé.

L'intensité des données LAS est une mesure, collectée pour chaque point, de la force de retour de l'impulsion laser qui a généré le point. Il fait partie du cône de lumière qui est réfléchi vers l'avion. Sa valeur dépend de la partie du cône qui a été réfléchie (par exemple, un toit est à 100 %, tandis qu'une feuille l'est beaucoup moins) et de la réflectivité de la surface touchée. Si le cône heurte un miroir à un angle, rien ne revient. L'intensité est utilisée comme aide à la détection et à l'extraction d'entités, dans la classification des points lidar et comme substitut à l'imagerie aérienne lorsqu'aucune n'est disponible. Si vos données lidar incluent des valeurs d'intensité, vous pouvez en faire des images qui ressemblent à des photos aériennes en noir et blanc.


Paramètres

L'ensemble de données qui définit les zones.

Les zones peuvent être définies par un raster d'entiers ou une couche d'entités.

Le champ qui contient les valeurs qui définissent chaque zone.

Il peut s'agir d'un nombre entier ou d'un champ de chaîne de l'ensemble de données de zone.

Raster qui contient les valeurs sur lesquelles calculer une statistique.

Spécifie le type de statistique à calculer.

  • Moyenne —La moyenne de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • Majorité : la valeur qui apparaît le plus souvent parmi toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • Maximum —La plus grande valeur de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • Médiane : la valeur médiane de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • Minimum : la plus petite valeur de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • Minorité : la valeur qui apparaît le moins souvent de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • Centile : le centile de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculé. Le 90e centile est calculé par défaut. Vous pouvez spécifier d'autres valeurs (de 0 à 100) à l'aide du paramètre Percentile value.
  • Plage : la différence entre la valeur la plus grande et la plus petite de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • Écart type : l'écart type de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculé.
  • Somme —La valeur totale de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • Variété —Le nombre de valeurs uniques pour toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculé.

Spécifie si les valeurs NoData dans l'entrée de valeur seront ignorées dans les résultats de la zone dans laquelle elles se trouvent.

  • Coché : dans une zone particulière, seules les cellules ayant une valeur dans le raster de valeurs en entrée seront utilisées pour déterminer la valeur en sortie de cette zone. Les cellules NoData dans le raster de valeurs seront ignorées dans le calcul des statistiques. C'est la valeur par défaut.
  • Non coché : dans une zone particulière, si des cellules NoData existent dans le raster de valeurs, elles ne seront pas ignorées et leur existence indique qu'il n'y a pas suffisamment d'informations pour effectuer des calculs statistiques pour toutes les cellules de cette zone. Par conséquent, la zone entière recevra la valeur NoData sur le raster en sortie.

Spécifie comment les rasters en entrée seront traités s'ils sont multidimensionnels.

  • Non coché : les statistiques seront calculées à partir de la tranche actuelle du jeu de données multidimensionnel en entrée. C'est la valeur par défaut.
  • Coché : les statistiques seront calculées pour toutes les dimensions du jeu de données multidimensionnel en entrée.

Le centile à calculer. La valeur par défaut est 90, indiquant le 90e centile.

Les valeurs peuvent aller de 0 à 100. Le 0e centile est essentiellement équivalent à la statistique minimale et le 100e centile est équivalent au maximum. Une valeur de 50 produira essentiellement le même résultat que la statistique médiane.

Cette option n'est disponible que si le paramètre Type de statistiques est défini sur Centile .

Spécifie la méthode d'interpolation de centile à utiliser lorsque le nombre de valeurs du raster en entrée à calculer est pair.

  • Détection automatique — Si le raster de valeur en entrée est de type pixel entier, la méthode La plus proche est utilisée. Si le raster de valeur en entrée est de type pixel à virgule flottante, la méthode Linéaire est utilisée. C'est la valeur par défaut.
  • La plus proche — La valeur disponible la plus proche du centile souhaité est utilisée. Dans ce cas, le type de pixel en sortie est le même que celui du raster de valeur en entrée.
  • Linéaire : la moyenne pondérée des deux valeurs environnantes du centile souhaité est utilisée. Dans ce cas, le type de pixel de sortie est à virgule flottante.

Valeur de retour

Raster de statistiques zonales en sortie.

L'ensemble de données qui définit les zones.

Les zones peuvent être définies par un raster d'entiers ou une couche d'entités.

Le champ qui contient les valeurs qui définissent chaque zone.

Il peut s'agir d'un nombre entier ou d'un champ de chaîne de l'ensemble de données de zone.

Raster qui contient les valeurs sur lesquelles calculer une statistique.

Spécifie le type de statistique à calculer.

  • MEAN — La moyenne de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • MAJORITE — La valeur qui apparaît le plus souvent de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • MAXIMUM — La plus grande valeur de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • MÉDIANE — La valeur médiane de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • MINIMUM — La plus petite valeur de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • MINORITÉ — La valeur qui apparaît le moins souvent de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • PERCENTILE — Le centile de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculé. Le 90e centile est calculé par défaut. Vous pouvez spécifier d'autres valeurs (de 0 à 100) à l'aide du paramètre Percentile value.
  • RANGE — La différence entre la valeur la plus grande et la plus petite de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • STD — L'écart type de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculé.
  • SUM — La valeur totale de toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculée.
  • VARIETY — Le nombre de valeurs uniques pour toutes les cellules du raster de valeurs qui appartiennent à la même zone que la cellule en sortie sera calculé.

Spécifie si les valeurs NoData dans l'entrée de valeur seront ignorées dans les résultats de la zone dans laquelle elles se trouvent.

  • DONNÉES — Dans une zone particulière, seules les cellules ayant une valeur dans le raster de valeurs en entrée seront utilisées pour déterminer la valeur en sortie de cette zone. Les cellules NoData dans le raster de valeurs seront ignorées dans le calcul des statistiques. C'est la valeur par défaut.
  • NODATA — Dans une zone particulière, si des cellules NoData existent dans le raster de valeurs, elles ne seront pas ignorées et leur existence indique qu'il n'y a pas suffisamment d'informations pour effectuer des calculs statistiques pour toutes les cellules de cette zone. Par conséquent, la zone entière recevra la valeur NoData sur le raster en sortie.

Spécifie comment les rasters en entrée seront traités s'ils sont multidimensionnels.

  • CURRENT_SLICE — Les statistiques seront calculées à partir de la tranche actuelle de l'ensemble de données multidimensionnel en entrée. C'est la valeur par défaut.
  • ALL_SLICES — Les statistiques seront calculées pour toutes les dimensions de l'ensemble de données multidimensionnel en entrée.

Le centile à calculer. La valeur par défaut est 90, indiquant le 90e centile.

Les valeurs peuvent aller de 0 à 100. Le 0e centile est essentiellement équivalent à la statistique minimale et le 100e centile est équivalent au maximum. Une valeur de 50 produira essentiellement le même résultat que la statistique médiane.

Cette option n'est prise en charge que si le paramètre statistics_type est défini sur PERCENTILE .

Spécifie la méthode d'interpolation de centile à utiliser lorsque le nombre de valeurs du raster en entrée à calculer est pair.

  • AUTO_DETECT — Si le raster de valeur en entrée est de type pixel entier, la méthode NEAREST est utilisée. Si le raster de valeur en entrée est de type pixel à virgule flottante, la méthode LINEAR est utilisée. C'est la valeur par défaut.
  • NEAREST — La valeur disponible la plus proche du centile souhaité est utilisée. Dans ce cas, le type de pixel en sortie est le même que celui du raster de valeur en entrée.
  • LINEAR — La moyenne pondérée des deux valeurs environnantes du centile souhaité est utilisée. Dans ce cas, le type de pixel de sortie est à virgule flottante.

Valeur de retour

Raster de statistiques zonales en sortie.

Exemple de code

Cet exemple détermine pour chaque zone la plage de valeurs de cellule dans le raster en entrée Valeur.

Cet exemple crée une sortie zonale multidimensionnelle en calculant la valeur maximale à partir du raster Value multidimensionnel en entrée pour chaque zone.


42 réponses 42

Remarque : certaines versions d'awk ont ​​des comportements étranges si vous allez ajouter quelque chose dépassant 2^31 (2147483647). Voir les commentaires pour plus d'informations. Une suggestion est d'utiliser printf plutôt que print :

Coller fusionne généralement les lignes de plusieurs fichiers, mais il peut également être utilisé pour convertir des lignes individuelles d'un fichier en une seule ligne. Le drapeau délimiteur permet de passer une équation de type x+x à bc.

Alternativement, lors de la tuyauterie à partir de stdin,

La version simple en Python :

Je mettrais un gros AVERTISSEMENT sur la solution communément approuvée :

c'est parce que sous cette forme awk utilise une représentation d'entier signé 32 bits : il débordera pour les sommes qui dépassent 2147483647 (c'est-à-dire 2^31).

Une réponse plus générale (pour additionner des nombres entiers) serait :

Notez que les nombres négatifs préfixés par un signe moins doivent être traduits pour dc , car il utilise le préfixe _ plutôt que le préfixe - pour cela. Par exemple, via tr '-' '_' | dc -f- -e '. '.

Edit : Étant donné que cette réponse a obtenu autant de votes "pour l'obscurité", voici une explication détaillée :

  1. Définissez "add_top_of_stack" comme :
    1. Supprimez les deux premières valeurs de la pile et rajoutez le résultat
    2. Si la pile a deux valeurs ou plus, exécutez "add_top_of_stack" de manière récursive

    Pour vraiment comprendre la simplicité et la puissance de dc , voici un script Python fonctionnel qui implémente certaines des commandes de dc et exécute une version Python de la commande ci-dessus :

    J'ai fait un rapide benchmark sur les réponses existantes qui

    • n'utilisez que des outils standard (désolé pour des trucs comme lua ou rocket ),
    • sont de vrais one-liners,
    • sont capables d'ajouter d'énormes quantités de nombres (100 millions), et
    • sont rapides (j'ai ignoré ceux qui ont pris plus d'une minute).

    J'ajoutais toujours les nombres de 1 à 100 millions ce qui était faisable sur ma machine en moins d'une minute pour plusieurs solutions.

    Python

    Coller & Bc

    Cela a manqué de mémoire sur ma machine. Cela a fonctionné pour la moitié de la taille de l'entrée (50 millions de numéros):

    Donc je suppose qu'il aurait fallu

    35s pour les 100 millions de numéros.

    Juste à titre de comparaison, j'ai compilé la version C et l'ai également testée, juste pour avoir une idée à quel point les solutions basées sur des outils sont plus lentes.

    Conclusion

    C est bien sûr le plus rapide avec 8s, mais la solution Pypy n'ajoute qu'un très petit surcoût d'environ 30% à 11s. Mais, pour être juste, Pypy n'est pas exactement standard. La plupart des gens n'ont installé que CPython, ce qui est nettement plus lent (22 secondes), exactement aussi rapide que la solution populaire Awk.

    La solution la plus rapide basée sur des outils standards est Perl (15s).

    Solution BASH, si vous souhaitez en faire une commande (par exemple, si vous devez le faire fréquemment) :

    Vous pouvez utiliser num-utils, bien que cela puisse être excessif pour ce dont vous avez besoin. C'est un ensemble de programmes pour manipuler les nombres dans le shell, et peut faire plusieurs choses astucieuses, y compris bien sûr, les additionner. C'est un peu dépassé, mais ils fonctionnent toujours et peuvent être utiles si vous avez besoin de faire quelque chose de plus.

    Mais manque de mémoire pour les grandes entrées.

    Les travaux suivants en bash :

    Si les données d'entrée sont irrégulières, avec des espaces et des tabulations à des endroits étranges, cela peut confondre datamash , alors utilisez le commutateur -W :

    . ou utilisez tr pour nettoyer les espaces :

    Si l'entrée est suffisamment grande, la sortie sera en notation scientifique.

    Pour convertir cela en décimal, utilisez l'option --format :

    Je me rends compte que c'est une vieille question, mais j'aime assez cette solution pour la partager.

    S'il y a de l'intérêt, je vous expliquerai comment cela fonctionne.

    Impossible d'éviter de soumettre ceci, c'est l'approche la plus générique de cette Question, veuillez vérifier :

    C'est à retrouver par ici, j'étais l'OP et la réponse est venue du public :

    Et voici ses avantages particuliers par rapport ok, avant JC et amis:

    • il ne dépend pas de la mise en mémoire tampon et donc il ne s'étouffe pas avec des entrées vraiment longues.
    • cela n'implique aucune précision particulière -ou la taille entière d'ailleurs- les limites - bonjour les utilisateurs d'AWK !
    • pas besoin de code différent, si des nombres à virgule flottante doivent être ajoutés, à la place.

    Pure bash et dans un one-liner :-)

    Alternative pure Perl, assez lisible, aucun paquet ou option requis :

    Vous pouvez le faire en python, si vous vous sentez à l'aise :

    Sebastian a souligné un script d'une ligne:

    Ou, vous pouvez taper les nombres sur la ligne de commande :

    Cependant, celui-ci avale le fichier, il n'est donc pas recommandé de l'utiliser sur des fichiers volumineux. Voir la réponse de j_random_hacker qui évite de slurping.

    Ce qui suit devrait fonctionner (en supposant que votre numéro soit le deuxième champ de chaque ligne).

    SCC est un évaluateur d'extraits de code C++ à l'invite du shell

    Désolé d'avance pour la lisibilité des backticks ("`"), mais ceux-ci fonctionnent dans des shells autres que bash et sont donc plus faciles à coller. Si vous utilisez un shell qui l'accepte, le format $(command . ) est beaucoup plus lisible (et donc débogable) que ` command . ` alors n'hésitez pas à modifier pour votre santé mentale.

    J'ai une fonction simple dans mon bashrc qui utilisera awk pour calculer un certain nombre d'éléments mathématiques simples

    Cela fera +,-,*,/,^,%,sqrt,sin,cos, parenthèse . (et plus selon votre version d'awk) . vous pourriez même avoir de la fantaisie avec printf et formater la sortie en virgule flottante, mais c'est tout ce dont j'ai besoin normalement

    pour cette question particulière, je ferais simplement ceci pour chaque ligne:

    donc le bloc de code pour additionner chaque ligne ressemblerait à ceci :

    C'est si vous vouliez seulement les additionner ligne par ligne. Cependant pour un total de tous numéro dans le fichier de données


    Modèles de données spatiales

    Structures composites

    Les modèles de données matricielles et vectorielles ont été implémentés dans une structure en couches. Les modèles de données raster sont intrinsèquement limités à une seule couche. Pour les modèles de données vectorielles, une couche individuelle est déterminée à la fois par le thème (par exemple, la propriété foncière, les zones de livraison ou les circonscriptions électorales) et par la géométrie (par exemple, les points, les lignes ou les polygones). Par exemple, un paysage urbain peut comprendre des zones résidentielles, commerciales, industrielles (polygones), des rues (lignes) et des individus (points). Dans de nombreux logiciels SIG, ce paysage doit être préparé en trois couches, un polygone, une ligne et une couche de points, respectivement, bien que tous appartiennent à un même thème. It is theoretically and technically feasible to develop a ‘composite’ structure to support the representation of different geometries or themes in a single layer. For the example above, all three types of geometric features can be presented in a single layer to support modeling and analysis. Computing methods, such as object-oriented and component-based modeling, can support the implementation of the composite structure. The theoretical design of such composite structure, on the other hand, has been discussed in the literature only recently.

    A multigeometry and multitheme ‘object fields’ has been developed for environmental management recently. Vector data of various geometries and themes are integrated with a continuous raster field of a different theme for comprehensive modeling. Furthermore, the nine-intersection system is a notable theoretical development to support the complex topology between points, lines, and polygons. The implementation of a composite structure requires sophisticated vector databases. Continued theoretical development in the research community and the technical development from the GIS software industry are critical for advancing this composite structure or any other more advanced spatial data models.


    Syntaxe

    The raster datasets that you want to merge together. The inputs must have the same number of bands and same bit depth.

    The path to contain the raster dataset. The path can be to a folder or geodatabase.

    The name of the dataset you are creating.

    When storing the raster dataset in a file format, you need to specify the file extension:

    • .bil —Esri BIL
    • .bip —Esri BIP
    • .bmp —BMP
    • .bsq —Esri BSQ
    • .dat —ENVI DAT
    • .gif —GIF
    • .img —ERDAS IMAGINER
    • .jpg —JPEG
    • .jp2 —JPEG 2000
    • .png —PNG
    • .tif —TIFF
    • pas d'extension pour Esri Grid

    Lors du stockage d'un jeu de données raster dans une géodatabase, n'ajoutez pas d'extension de fichier au nom du jeu de données raster.

    When storing your raster dataset to a JPEG file, a JPEG 2000 file, a TIFF file, or a geodatabase, you can specify a Compression Type and Compression Quality in the Environment Settings.

    The coordinate system for the output raster dataset. If this is not specified, the Output Coordinate System environment setting will be used.

    The bit depth, or radiometric resolution of the mosaic dataset.

    If you do not set the pixel type, the 8-bit default will be used and your output may be incorrect.

    • 1_BIT : un entier non signé de 1 bit. Les valeurs peuvent être 0 ou 1.
    • 2_BIT : un entier non signé de 2 bits. Les valeurs prises en charge peuvent être de 0 à 3.
    • 4_BIT : un entier non signé de 4 bits. Les valeurs prises en charge peuvent être de 0 à 15.
    • 8_BIT_UNSIGNED —Un type de données 8 bits non signé. Les valeurs prises en charge peuvent être de 0 à 255.
    • 8_BIT_SIGNED —Un type de données 8 bits signé. Les valeurs prises en charge peuvent aller de -128 à 127.
    • 16_BIT_UNSIGNED —Un type de données non signé 16 bits. Les valeurs peuvent aller de 0 à 65 535.
    • 16_BIT_SIGNED —Un type de données signé 16 bits. Les valeurs peuvent aller de -32 768 à 32 767.
    • 32_BIT_UNSIGNED —Un type de données 32 bits non signé. Les valeurs peuvent aller de 0 à 4 294 967 295.
    • 32_BIT_SIGNED : un type de données signé 32 bits. Les valeurs peuvent aller de -2 147 483 648 à 2 147 483 647.
    • 32_BIT_FLOAT —Un type de données 32 bits prenant en charge les décimales.
    • 64_BIT : un type de données 64 bits prenant en charge les décimales.

    The cell size for the new raster dataset.

    The number of bands that the output raster will have.

    Applies when the input raster datasets have a colormap.

    The method used to choose which color map from the input rasters will be applied to the mosaic output.


    2 réponses 2

    When finding the cell of raster r that has the minimum distance to a point falling outside r , we don't need to calculate the distance to interior cells of r .

    1. for points with x < xmin(r) and y < ymin(r) , the closest of r is the lower left cell
    2. for points with x > xmax(r) and y < ymin(r) , the closest of r is the lower right cell
    3. for points with x < xmin(r) and y > ymax(r) , the closest of r is the upper left cell
    4. for points with x > xmax(r) and y > ymax(r) , the closest of r is the upper right cell
    5. for points with xmin(r) < x < xmax(r) and y < ymin(r) , the closest cell of r will lie along the bottom edge
    6. for points with xmin(r) < x < xmax(r) and y > ymax(r) , the closest cell of r will lie along the top edge
    7. for points with x < xmin(r) and ymin(r) < y < ymax(r) , the closest cell of r will lie along the left edge
    8. for points with xmin(r) < x < xmax(r) and y > ymax(r) , the closest cell of r will lie along the top edge and
    9. points where xmin(r) < x < xmax(r) and ymin(r) < y < ymax(r) are already within the raster.

    Here's a function that works out within which of these 9 regions each point falls, identifies the raster columns or rows that they correspond to, and identifies the cell at that column or row along the relevant edge/corner.

    The function accepts either a 2 x n matrix of coordinates ( x then y ), or a SpatialPoints object. Set spatial=TRUE if you want the moved points returned as SpatialPoints .

    Note that points are assumed to be in a planar coordinate system.

    And an example for a 1000 x 1000 cell raster with 1000 points randomly placed (

    890 cells fall outside the raster's extent):

    For a 2000 x 2000 cell raster, with 1 million points (

    890000 points outside the raster's extent):

    And here's a plot showing how the points from the first example above have been moved.


    Sum function not working on cells with formulas

    You can encapsulate your calculated cells with VALUE() that needs to be summarized:

    This will force your formulae to output a number instead of text, and this can be summarized.

    Please note: The real issue is with the IF formulas. When returning a value, it should not be in quotes. The quotes make it text. For example, C1: should be If(D6>85,1,0). Then, Value is not necessary.

    You can also just encapsulate the item in the formula you want to be considered a number. In my case I did not want anything in the calculated cell if there is no result (IF = false) but encapsulating the whole formula resulted in a 0 result. If I make false = "" I get an error. So I just have =IF(test=X,Value(true),"") - X in my case is text but can be a number.

    May have happened that you wanted to sum a formula that previously uses iterative computation (circular reference). In that case, excel ocasionaly turns this feature ON/OFF without any notice. You would need to switch ON that function previously.

    To do that: Excel -> Option > Formulas . >


    Is it safe to use SUM() without ISNULL()

    Yes its safe . You can use Sum without handling NULL Value. You can also check that.

    You can use like that also.

    Returns the sum of all the values, or only the DISTINCT values, in the expression. SUM can be used with numeric columns only. Null values are ignored.

    If you have [1, 2, NULL, 5] in 4 columns, it will give the output as 8.

    However, it is not safe to use SUM() without checking for NULLS in many cases.

    You can receive null when it has no matching content for a given clause. And if you are using this SUMMED value in another function, that maybe a point of concern.

    Here are 3 images that shows without checking for NULL it returns NULL and not 0.

    SUM with ISNULL CHECK

    SUM without ISNULL CHECK

    SUM with COALESCE


    Voir la vidéo: Polynomien yhteenlasku