¿Editar / actualizar metadatos mediante programación en ArcGIS?

10

¿Alguien ha logrado actualizar metadatos mediante programación en ArcGIS 10? Considerar el uso de Python / arcpy pero ArcObjects (C # o Python / comtypes) también es una posibilidad.

Necesito actualizar los metadatos de formato FGDC y ArcGIS-ISO, y cualquier solución que se use debe ser capaz de retener los elementos existentes (no en blanco) junto con los elementos agregados, excepto cuando estén en conflicto, en cuyo caso el Los elementos agregados sobrescriben los elementos existentes.

blah238
fuente

Respuestas:

9

La forma más fácil de hacer esto desde ArcPy es crear un archivo XML usando Python y luego invocar Importar metadatos (conversión) . Sin embargo, esto sobrescribirá todo.

Una alternativa es usar ArcObjects para obtener un IName para el conjunto de datos, convertir a IMetadata y editar el IPropertyset.

James Schek
fuente
11

Teníamos una gran necesidad de una capacidad similar y terminamos construyendo una biblioteca Python general, gratuita y de código abierto para ese propósito. Puede encontrarlo en https://github.com/ucd-cws/arcpy_metadata o ejecutando un "pip install arcpy_metadata". Existe cierta documentación de las características y cómo usarla, con algunas contribuciones adicionales del World Resources Institute. Intentamos mantener las cosas relativamente Pythonic para que se integre bien y se pueda aprender rápidamente. Aquí hay un ejemplo:

import arcpy_metadata as md
import datetime

metadata = md.MetadataEditor(path_to_some_feature_class)  # also has a feature_layer parameter if you're working with one, but edits get saved back to the source feature class
metadata.title = "The metadata title!"

generated_time = "This layer was generated on {0:s}".format(datetime.datetime.now().strftime("%m/%d/%Y %I:%M %p"))

metadata.purpose = "Layer represents locations of the rare Snipe."

metadata.abstract.append("generated by ___ software")
metadata.abstract.append(generated_time)  # .prepend also exists
metadata.tags.add(["foo", "bar", "baz"])  # tags.extend is equivalent to maintain list semantics

metadata.finish()  # save the metadata back to the original source feature class and cleanup. Without calling finish(), your edits are NOT saved!

Todavía tiene mucho que se podría agregar, pero es bastante extensible si subclasifica los elementos que ya están allí o los configura correctamente. Todavía se trata de software de calidad alfa, pero funciona y estamos contentos con él.


Para cualquiera que busque esta capacidad dentro de ArcGIS Pro, a partir de la versión 2.5, ahora incluye una API de metadatos de Python. Hay más detalles en la documentación de la clase Metadata .

nicksan
fuente
9

Hemos estado luchando con esto y lo resolvimos al tener una biblioteca simple de Python construida alrededor de las funciones de metadatos de arcobjects. Se basa en un archivo xml donde los valores de metadatos se han reemplazado por palabras clave. Puede usar estas palabras clave en su código de Python para obtener o establecer el valor de un campo de metadatos. El código debería verse así:

import dataprocessing
DP = dataprocessing.create()

md = DP.OpenMetadata("C:/MyShapefile.shp") # Works also on geodatabases
myKeyword = "%FGDC.abstract" # Keywords have to start with '%' but the rest is up to you

if md.GetValue(myKeyword) == "Not what I want":
    md.SetValue(myKeyword, "New value that suits me better")

La herramienta se puede encontrar aquí: http://www.aris.nl/dataprocessing_arcgis y está disponible gratuitamente. La versión en el sitio web es para arcgis 9.3. Una versión de arcgis 10 estará disponible pero ya no será gratuita.

(Divulgación completa: trabajo para una agencia gubernamental holandesa donde teníamos la versión actual de esta herramienta construida en parte del dinero de los contribuyentes y en parte del tiempo donado por el programador. Por eso está disponible de forma gratuita pero no de código abierto. A partir de 2013 lo haremos no estar financiando ninguna versión nueva. No estoy haciendo dinero de ninguna manera. Solo espero que se use más).

Arjan vd Put
fuente
1

Una tercera opción que estoy estudiando ahora es usar un archivo XSLT junto con la herramienta de transformación (conversión) XSLT . Sin embargo, tengo que aprender el idioma a medida que avanzo, y no te lo ponen fácil al usar la implementación de .NET que usa los estándares XSLT / XPath 1.0 anteriores.

blah238
fuente
1

Tengo un código que usa ArcPy y DOM para la conversión de MD existente, la creación desde cero (si no existe) y la actualización de ciertos elementos usando DOM. Es un poco torpe, con bastantes nombres de ruta codificados, etc.

Steve Peedell
fuente