Suite

Trouver le point avec l'altitude la plus élevée dans la zone à l'aide d'ArcObjects ?

Trouver le point avec l'altitude la plus élevée dans la zone à l'aide d'ArcObjects ?


Existe-t-il un moyen de trouver un point avec la plus haute altitude dans une zone spécifiée à l'aide d'ArcObjects ? Disons que j'ai un raster avec DEM et que j'aimerais établir quelques domaines d'intérêt dans ce raster. Dans chaque AOI, j'aurais besoin de trouver un point où le terrain a la plus haute altitude et les coordonnées de retour de ce point.

J'ai regardé dans l'API ArcObjects et je n'ai trouvé qu'un moyen manuel de découvrir un tel point, à savoir :

  1. Établir des zones d'intérêt
  2. Pour chaque AOI, trouvez les pixels correspondants dans le raster
  3. Avoir des ensembles de pixels définis pour les AOI, itérer sur chaque ensemble et renvoyer un point avec l'altitude la plus élevée

Ce processus est faisable mais absolument impraticable en raison de problèmes de performances.


Grâce aux commentaires de Vince, j'ai pu effectuer avec succès l'ensemble du processus.

Comme je l'ai écrit, je voulais d'abord établir un certain nombre d'AOI sur le raster. Rien d'extraordinaire ici, j'ai obtenu des propriétés raster en utilisant cette petite fonction ci-dessous :

public static IRasterProps GetRasterProperties(IRasterDataset rasterDataset, int rasterBandIndex) { IRasterBandCollection rasterBands = (IRasterBandCollection)rasterDataset; var rasterBand = rasterBands.Item(rasterBandIndex); renvoie (IRasterProps)rasterBand ; }

Compte tenu des propriétés raster, j'ai créé un certain nombre de zones définies chacune par une IEnvelope. Afin de diviser le raster en entrée en AOI, j'ai utilisé l'outil de géotraitement ExtractByRectangle.

ExtractByRectangle extract = new ExtractByRectangle(inputRaster, enveloppe, chemin); IGeoProcessorResult2 result = gp.Execute(extract, null) as IGeoProcessorResult2; paramètres : inputRaster - IRasterDataset (raster d'entrée) enveloppe - IEnvelope (définition de notre AOI) chemin - chemin du fichier vers le raster résultant

Je ne décrirai pas toutes les manigances de géotraitement, mais c'est là que ArcObjects devient très cryptique à mon avis. Un certain nombre de codes d'erreur qui n'ont pas d'explication évidente n'aident pas non plus. J'ai trouvé un excellent code de Kirk Kuykendall qui aide beaucoup au débogage ici : éviter les échecs du géotraitement ArcObjects avec .NET ?

Maintenant, nous avons nos petites AOI raster. J'ai besoin d'obtenir le point d'élévation maximale pour chacun d'eux. Par conséquent, je commence par calculer des statistiques pour chaque AOI en utilisant la fonction ci-dessous :

public void ComputeRasterStatistics(IRasterDataset rasterDataset, int rasterBandIndex) { IRasterBandCollection rasterBands = (IRasterBandCollection)rasterDataset; var rasterBand = rasterBands.Item(rasterBandIndex); RasterStatistics = rasterBand.Statistics; }

Les statistiques fournissent des informations concernant les valeurs des extrêmes de raster, y compris la valeur de point maximale d'un raster. Ensuite, je convertis le raster en points à l'aide de la fonction ci-dessous.

public static IFeatureClass RasterToPoints(IRasterDataset raster) { IConversionOp conversionOp = new RasterConversionOpClass(); IWorkspace shapeWS = FeatureWorkspaceHelper.CreateInMemoryWorkspace(); var featClass = conversionOp.RasterDataToPointFeatureData((IGeoDataset)raster, shapeWS, Guid.NewGuid().ToString()); return (IFeatureClass)featClass; }

FeatureWorkspaceHelper.CreateInMemoryWorkspace(); est une de mes fonctions d'assistance, qui crée un espace de travail en mémoire vide. Gardez à l'esprit que cela peut également être fait avec l'espace de travail de fichier "classique".

Maintenant, je dois juste trouver un point qui a l'altitude maximale et le retourner. La fonction ci-dessous (quelques codes durs là-bas !)

private IPoint GetRasterMaxElevationPoint(IFeatureClass featureClass, double val, int altitudeIndex) { IQueryFilter queryFilter=new QueryFilterClass(); queryFilter.WhereClause = "GRID_CODE >= " + (val - 0.01).ToString(); var curseur = featureClass.Search(queryFilter, true); Fonctionnalité IFeature = null ; Forme Igéométrie = null; double maxValue = double.MinValue; while ((feature = cursor.NextFeature()) != null) { if ((double) feature.Value[elevationIndex] > maxValue) { shape = feature.Shape; maxValue = (double) feature.Value[elevationIndex]; } } return new PointClass() { X = shape.Envelope.LowerLeft.X, Y = shape.Envelope.LowerLeft.Y, SpatialReference = shape.SpatialReference }; }

Vous pouvez générer un modèle d'élévation numérique en ligne basé sur un point de localisation et un périmètre (c'est-à-dire le rayon). L'algorithme trouve ensuite les altitudes les plus élevées à l'intérieur. https://www.mymountain.xyz - les comptes sont gratuits. Asheville, NC avec grand rayon]1


Voir la vidéo: Digitization by using Geodatabase GDB Method in ESRIs ArcGIS Desktop Software on SOI Toposheet