Trouver le point central d'un raster dans ArcGIS?


10

Si j'ai, par exemple, un fichier raster rectangulaire et géoréférencé chargé dans un document ArcMap 10 (.tiff avec tfw associé), comment puis-je trouver facilement son point central et le stocker dans une couche vectorielle de points?

De plus, si j'ai plusieurs rasters de ce type dans mon document ArcMap, comment puis-je appliquer le processus à chacun d'eux?

Malheureusement, je n'ai aucune expérience Python. Par conséquent, une solution de programmation est OK, mais j'aurai besoin d'instructions spécifiques sur la façon de charger un script existant dans ArcGIS 10 et de l'exécuter sur les rasters en questions. (BTW, les rasters sont tous dans leurs couches séparées).


1
Les solutions programmatiques sont-elles acceptables?
Kirk Kuykendall

Je voudrais accepter une solution programmatique, mais je n'ai aucune expérience en python. J'aurai besoin d'instructions pour charger le script dans ArcGIS et l'exécuter sur les rasters en question.
hpy

Réponses:


7

Bien que la question d'origine soit pour 10.0, j'ai mis à jour le code ci-dessous pour 10.3.1.

Copiez-collez ceci dans la fenêtre python dans arcmap pour créer la fonction RasterCenter:

import arcpy, os
def RasterCenter(raster):
    #raster: string reference to raster
    raster = arcpy.Raster(raster)
    fcname = "{}_center".format(os.path.basename(str(raster)))
    x = raster.extent.XMin + (raster.extent.XMax - raster.extent.XMin)/2
    y = raster.extent.YMin + (raster.extent.YMax - raster.extent.YMin)/2
    featureclass = arcpy.CreateFeatureclass_management("in_memory", fcname, "POINT",spatial_reference = raster.spatialReference)
    with arcpy.da.InsertCursor(featureclass, ['SHAPE@XY']) as cursor:
        cursor.insertRow(((x, y),))
    mxd = arcpy.mapping.MapDocument("CURRENT")
    df = arcpy.mapping.ListDataFrames(mxd)[0]
    arcpy.MakeFeatureLayer_management(featureclass, fcname)
    layer = arcpy.mapping.Layer(fcname)
    arcpy.mapping.AddLayer(df, layer)

Ensuite, vous pouvez utiliser la fenêtre python pour créer votre classe d'entités en appelant

RasterCenter("<reference to raster">)

Ainsi, par exemple, si vous avez un raster nommé DEM, vous appelez RasterCenter ("dem") dans la fenêtre python, et il ajoutera une couche nommée "dem_center" avec un seul point au centre du raster. La couche est stockée en mémoire, donc si vous voulez la conserver, exportez-la.

Pour aller plus loin, vous pouvez enregistrer le script dans un fichier .py et placer le fichier .py dans le chemin de recherche de python. par exemple, enregistrez-le sous RasterCenter.py et placez-le dans PYTHONPATH (normalement l'emplacement est C: \ Python26 \ ArcGIS10.0 \ Lib)

Ensuite, vous pourriez faire:

import RasterCenter
RasterCenter.RasterCenter("<reference to raster">)

6

Très facile, simple, obtenez les propriétés des rasters et calculez le point central à partir de min, max x et y

MinX = arcpy.GetRasterProperties_management("raster", "LEFT")
MinY = arcpy.GetRasterProperties_management("raster", "BOTTOM")
MaxX = arcpy.GetRasterProperties_management("raster", "RIGHT")
MaxY = arcpy.GetRasterProperties_management("raster", "TOP")

centreX = (MaxX + MinX) / 2
centreY = (MaxY + MinY) / 2

Et la vérification d'erreur habituelle, etc.

Ajoutez ensuite à votre table de points avec un updateCursor


2
Belle approche. Je pense que vous voulez améliorer vos formules pour les coordonnées du centre: ce sont les moyens des points d'extrémité, pas leurs différences.
whuber

Cela ressemble à ce que je recherche, mais comme je n'ai aucune expérience de script dans ArcGIS, pouvez-vous me dire comment charger et exécuter un tel script? (J'ai mis à jour la question d'origine pour refléter cela ...) merci!
hpy

1
Vous pouvez également accéder aux valeurs à l'aide des propriétés d'étendue raster, par exemple raster = arcpy.Raster ("raster"), puis centreX = raster.extent.XMax - raster.extent.XMin
blord-castillo

1
@Whuber Je peux voir l'erreur maintenant, je pensais à autre chose que je faisais! Merci Whuber
Hairy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.