Suite

Puis-je connaître les domaines exacts couverts par chaque catégorie ?

Puis-je connaître les domaines exacts couverts par chaque catégorie ?


J'ai accédé à une carte d'utilisation des terres et j'ai délimité la zone appropriée que je dois analyser. Existe-t-il un moyen de trouver les domaines exacts couverts par chaque catégorie ?


1. Tableau des zones

La méthode la plus robuste de calcul des surfaces consiste à utiliser l'outil de géotraitement Tabuler les surfaces dans Spatial Analyst. Ceci est destiné à calculer une répartition des zones pour les données raster classifiées pour une série de zones. Par exemple, si vous avez besoin de la superficie de chaque classe d'occupation du sol pour chaque ville ou village de votre zone d'étude. Pour obtenir le total de tout, transmettez simplement le polygone que vous avez utilisé pour découper votre raster en tant que zone unique.

Les unités de Tabulate Areas sont des unités linéaires du système de coordonnées du raster


2. Table attributaire raster

Un moyen moins robuste mais légèrement plus rapide de calculer la superficie totale pour chaque classe de couverture terrestre consiste à examiner la table attributaire du raster. Cliquez avec le bouton droit de la souris sur la couche dans la table des matières, puis cliquez sur "Table attributaire". Si cette option est grisée, vous devrez exécuter l'outil de géotraitement Créer une table attributaire de raster. leCOMPTERchamp de ce tableau décrit le nombre de cellules avec cette valeur. Vous devrez multiplier cela par le surface de chaque cellule pour obtenir la superficie totale.


Je ne sais pas à quel point êtes-vous familial avec R, mais je pense qu'il existe la meilleure et très simple solution à votre problème :

library(raster) # read "raster" library setwd("D:/Data/… ") # définir votre répertoire de travail r<-raster("your_raster.tif") # importer votre fichier raster de catégorie t<-freq(r) # Calculez votre tableau de fréquence raster - # cela signifie combien de pixels appartiennent à 1 # catégorie et enregistrez-le dans un tableau "t" # ci-après vous devez connaître la surface de 1 pixel (en suivant votre exemple je suppose que c'est 1m2). # Multipliez cette valeur par le nombre de pixels dans chaque catégorie - à partir de la deuxième colonne de votre tableau t -> (t[,2]) my.area<-t[,2]*1 # 1 = zone de 1 pixel my .area.fin <- cbind(t, my.area) # exporte la table vers .txt : write.table(area_fin, file="area_by_category.txt", sep="	")

Si vous rencontrez un problème avec ce script, vous pouvez m'envoyer vos données image/exemple et j'adapterai le script.

Bonne chance ! :)


Bien que vous ayez affaire à une image et non à une couche de polygones pour vos classifications d'utilisation des terres, un service d'urbanisme aurait normalement cette couche dans un format de polygone pour les futures utilisations des terres prévues. Mon comté a une telle couche disponible en téléchargement. Si vous aviez une couche d'utilisation des terres Polygon, vous pouvez configurer les étiquettes de symbologie de votre couche pour afficher la zone à l'aide d'arcpy. Ce script pourrait être adapté pour s'appliquer à n'importe quelle couche de polygone pour n'importe quelle classification de symbologie de valeur unique de champ, pas seulement une couche d'utilisation des terres.

J'utilise un jeu de caractères de séparation pour séparer l'étiquette de base de la somme de zone ajoutée par le script. Je dois juste être sûr que le séparateur ne fait partie d'aucune étiquette de base. De cette façon, le script peut être exécuté encore et encore avec différentes sélections ou filtres et remplacer les valeurs de zone ajoutées aux étiquettes de base.

Pour la légende de votre carte, vous souhaiterez probablement sélectionner la couche sur la page Éléments de la boîte de dialogue Légende et vérifier le paramètre "Afficher uniquement les classes visibles dans l'étendue actuelle de la carte". De cette façon, toute catégorie unique qui n'existait que dans la couche principale et qui n'existait pas réellement dans la couche actuelle serait exclue de la légende. Le script ci-dessous respecte les requêtes de définition d'entités et les sélections d'entités lors de l'accumulation de la zone de chaque catégorie. Cependant, certaines modifications supplémentaires du script seraient nécessaires pour qu'il n'évalue réellement que les zones des polygones en fonction de l'étendue visible actuelle si les entités n'étaient pas déjà sélectionnées.

Vous trouverez ci-dessous un exemple de script que vous pouvez ajouter à un outil de script. Le script fonctionne même si vous avez regroupé les classifications d'utilisation des terres :

# Nom : ApplySymWithAreaLabels.py # Objectif : appliquer la symbologie d'une couche à une autre et afficher la zone dans les étiquettes # Importer les modules système importer arcpy depuis arcpy importer env #**** PERSONNALISER CES VARIABLES D'ENTRÉE **** # Définir l'espace de travail actuel env.workspace = r"C:UsersOWNERDocumentsArcGIS" # Attribuez une chaîne pour étiqueter les unités de surface. areaUnitStr = "Acres" # Attribuez un facteur de conversion pour les unités de surface. Utilisez 1.0 pour utiliser les unités natives de la couche en précision flottante. # Exemples de conversions : # Sq. m à Sq. km = 1,0 / 1000000,0 ou 0,000001 # carré Ft. à Acre = 1,0 / 43560,0 ou 0,0000229568411386593 # Sq. Ft. au carré Mi. = 1.0 / 27878400.0 ou 0.000000035870064279155 areaUnitFactor = 1.0 / 43560.0 # Définissez le nom de la couche dans la carte que vous souhaitez symboliser layerName = "Land Uses" # Variable de caractère(s) de séparation pour séparer l'étiquette de base de la zone # assurez-vous que le séparateur est ne fait pas partie du séparateur d'étiquette de base réel = ' - ' # Définit une chaîne de modèle d'étiquette. # Définissez en particulier le nombre de décimales pour le deuxième paramètre labelTemplate = '{0}' + séparateur + '{1:,.2f} {2}' #**** LE SCRIPT CI-DESSOUS NE DEVRAIT PAS AVOIR BESOIN DE RÉVISION **** # Pointer sur la carte active actuelle mxd = arcpy.mapping.MapDocument("current") # Définir la couche pour appliquer la symbologie à lyr = arcpy.mapping.ListLayers(mxd, layerName)[0] # Obtenir le champ qui définit la symbologie valueField = lyr.symbology.valueField # Obtenir la liste des catégories d'utilisation des terres uniques dans la couche classValuesList = lyr.symbology.classValues ​​# Obtenir la liste des étiquettes d'utilisation des terres uniques sans zone classLabelsList = lyr.symbology.classLabels valueDict = {} # Attribuer tout valeurs de classification de champ de couche à un dictionnaire avec la somme cumulée de leurs zones avec arcpy.da.SearchCursor(lyr, [valueField, "[email protected]"]) comme searchRows : pour searchRow dans searchRows : keyValue = searchRow[0] sinon keyValue in valueDict : # Lorsque keyValue n'est pas dans le dictionnaire, insérez-le et stockez sa zone valueDict[keyValue] = searchRow[1] else : # Lorsque la valeur-clé est déjà dans le dictionnaire, additionnez la zone valueDict[keyValue] += searchRow[1] # Créez un dictionnaire de classes pour suivre la somme cumulée des classifications groupées labelsDict = {} # parcourez toutes les valeurs de classe dans la couche pour i dans range(len(classValuesList)): classValue = classValuesList[i] classLabel = classLabelsList[i].split(separator)[0] sinon classLabel dans labelsDict: # Initialise le dictionnaire de classe avec 0 zone labelsDict[classLabel] = 0 si classValue dans valueDict : # somme cumulative des zones de classes de couches individuelles réelles dans les classifications groupées labelsDict[classLabel] += valueDict[classValue] classLabelsList[i] = labelTemplate.format(classLabelsList[i].split(separator)[0], (labelsDict [classLabel] * areaUnitFactor), areaUnitStr) # Attribuez les étiquettes ordonnées aux classes lyr.symbology.classLabels = classLabelsList # Actualisez la table des matières pour refléter le changement arcpy.RefreshTOC() # Actualisez la vue active pour refléter le changement arcp y.RefreshActiveView()

Le script a créé la sortie ci-dessous pour ma couche de polygones d'utilisation des terres. Il a converti mes unités de la région natale de pieds carrés en acres. Il aurait géré toutes les classifications groupées si je les avais configurées dans la couche principale.

Vous devez enregistrer un fichier de couche maître sur un disque contenant les symboles de couche, les étiquettes (sans valeurs de surface) et l'ordre configuré comme vous le souhaitez pour toutes les classes possibles de catégories d'utilisation des terres en tant que sauvegarde pour obtenir les étiquettes de base. Malheureusement, l'outil Appliquer la symbologie à partir de la couche ne respecte pas l'ordre des catégories de la couche enregistrée, vous devez donc utiliser l'option d'importation manuelle de la symbologie du bureau pour que les symboles aient l'ordre que vous avez enregistré dans votre fichier de couche principale. Sinon, j'utiliserais cet outil et je n'utiliserais pas le bouton Desktop Import. Soutenez l'idée de respecter l'ordre des couches source lors de l'utilisation de l'outil Appliquer la symbologie à partir de la couche et de la boîte de dialogue Redéfinir la symbologie sur le bureau pour faciliter le processus de tri, car une fois que vous avez dépassé 10 symboles, la boîte de dialogue actuelle est difficile à remplacer le tri par défaut ordre.

Vous souhaiterez peut-être modifier le script pour accepter les paramètres afin que vous puissiez utiliser l'outil de script pour vous permettre de choisir votre couche de sortie, la couche de symboles principaux enregistrée et/ou le type d'unité de surface et le facteur de conversion lors de l'exécution. Le script peut facilement être modifié pour obtenir d'autres statistiques, comme la somme de la longueur de chaque catégorie pour les polylignes ou les périmètres de polygones, ou le nombre d'entités pour l'un des types de géométrie.