Программно редактировать / обновлять метаданные в ArcGIS?

10

Кому-нибудь удалось программно обновить метаданные в ArcGIS 10? Рассматривая использование Python / arcpy, но ArcObjects (C # или Python / comtypes) также возможны.

Мне нужно обновить метаданные формата FGDC и ArcGIS-ISO, и любое используемое решение должно быть в состоянии сохранить существующие (непустые) элементы вместе с добавленными элементами, за исключением случаев, когда они конфликтуют, и в этом случае добавленные элементы перезаписывают существующие элементы.

blah238
источник

Ответы:

9

Самый простой способ сделать это из ArcPy - это создать файл XML с использованием Python, а затем вызвать Import Metadata (Conversion) . Однако это перезапишет все.

Альтернативой является использование ArcObjects для получения IName в наборе данных, приведения к IMetadata и редактирования IPropertyset.

Джеймс Шек
источник
11

У нас была большая потребность в подобной возможности, и в итоге мы создали для этого общую бесплатную библиотеку Python с открытым исходным кодом. Вы можете найти его по адресу https://github.com/ucd-cws/arcpy_metadata или запустив «pip install arcpy_metadata». Существует некоторая документация о функциях и способах их использования, а также некоторые дополнительные материалы от Института мировых ресурсов. Мы старались держать вещи относительно Pythonic, чтобы они хорошо интегрировались и могли быть изучены быстро. Вот пример:

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!

В него все еще можно добавить множество вещей, но оно довольно расширяемое, если вы подклассифицируете элементы, которые уже есть, или настроите их правильно. Это все еще о программном обеспечении альфа-качества, но оно работает, и мы довольны этим.


Для тех, кто ищет эту возможность в ArcGIS Pro, начиная с версии 2.5, они теперь включают API метаданных из Python. Более подробная информация содержится в документации класса Metadata .

nicksan
источник
9

Мы боролись с этим и решили его, создав простую библиотеку Python, построенную на основе функций метаданных arcobjects. Он основан на xml-файле, в котором значения метаданных заменены ключевыми словами. Вы можете использовать эти ключевые слова в своем коде Python, чтобы получить или установить значение поля метаданных. Код будет выглядеть примерно так:

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")

Инструмент можно найти здесь: http://www.aris.nl/dataprocessing_arcgis и находится в свободном доступе. Версия на сайте для Arcgis 9.3. Версия Arcgis 10 будет доступна, но больше не будет бесплатной.

(Полное раскрытие: я работаю в голландском правительственном агентстве, где у нас была текущая версия этого инструмента, построенная частично из денег налогоплательщиков и частично из времени, пожертвованного программистом. Вот почему он доступен бесплатно, но не с открытым исходным кодом. С 2013 года мы будем не буду финансировать какие-либо новые версии. Я ни в коем случае не буду зарабатывать на этом деньги. Я просто надеюсь, что он получит больше пользы.)

Арджан В.Д. Пут
источник
1

Третий вариант, который я сейчас изучаю, - это использование файла XSLT вместе с инструментом XSLT Transformation (Conversion) . Мне в значительной степени приходится изучать язык по ходу дела, и они не облегчают вам задачу с помощью реализации .NET, которая использует более старые стандарты XSLT / XPath 1.0.

blah238
источник
1

У меня есть некоторый код, который использует ArcPy и DOM для преобразования существующих MD, создания с нуля (если таковых не существует) и обновления некоторых элементов с использованием DOM. Это немного неуклюже, с довольно много жестко закодированных путей и так далее.

Стив Пиделл
источник