Примеры работы с необработанными файлами kml/kmz, экспортированными из приложения.

Эта страница содержит примеры постобработки файлов kmz/kml, которые могут быть вам полезны.

Подготовка:

  1. Экспорт из GPS Camera: Экспортировать точки как KMZ/KML
  2. Извлечь KML: Распаковать KMZ при необходимости

Обновление имен меток KML из imageNotes

Это руководство показывает, как автоматически обновлять имена меток в ваших файлах KML, извлекая информацию из поля imageNotes.

Обзор

При экспорте точек из GPS Camera приложение создает файлы KML с именами меток на основе названий фотографий и точек. Содержимое заметок (например, “Note 1”, “Note 2” и т.д.) хранится в поле imageNotes в виде значений, разделенных табуляцией. Этот скрипт позволяет автоматически извлекать эту информацию из заметок и использовать ее в качестве имени метки при необходимости.

Вероятно, лучше всего было просто помещать ваши заметки в поле “Название” при съемке фотографий. Этот скрипт пригодится, если вы так хотели, но не делали, а также как пример постобработки kml.

Вариант использования

До:

  • Имена меток показывают временные метки: 15Nov25 16:25, 12Nov25 17:24
  • Фактические заметки скрыты в поле imageNotes: Note 1, Note 2

После:

  • Имена меток показывают содержательные заметки: Note 1, Note 2
  • Легкая идентификация точек с первого взгляда в картографических приложениях

Структура файла KML

Экспортированный файл KML содержит метки со следующей структурой:

<Placemark>
  <name>15Nov25 16:25</name>
  <ExtendedData>
    <SchemaData schemaUrl="#blcPointSchema">
      <SimpleData name="imageNotes"><![CDATA[15Nov25 16:25	Note 1		Ad-hoc	V Třešňovce 227/12...]]></SimpleData>
    </SchemaData>
  </ExtendedData>
  <Point>
    <coordinates>14.502834,50.095184,239.0</coordinates>
  </Point>
</Placemark>

Поле imageNotes содержит значения, разделенные табуляцией:

  • Поле 0: Временная метка (15Nov25 16:25)
  • Поле 1: Текст заметки (Note 1) ← Это то, что мы извлекаем
  • Поле 2: Пусто
  • Поле 3: Тип (Ad-hoc)
  • Поле 4: Адрес

Решение: Python-скрипт

Мы создали скрипт Python, который автоматически обрабатывает файлы KML и обновляет имена меток на основе содержимого imageNotes.

Возможности скрипта

  • Автоматическое извлечение: Анализирует поле imageNotes, разделенное табуляцией
  • На основе позиции: Извлекает заметку из определенной позиции поля (по умолчанию: позиция 1)
  • Универсальный: Работает с любым файлом KML, следующим этой структуре
  • Безопасный: Создает резервные копии перед перезаписью файлов
  • Гибкий: Может выводить в новый файл или обновлять на месте

Как это работает

  1. Разобрать файл KML: Читает структуру XML
  2. Найти метки: Находит все элементы <Placemark>
  3. Извлечь заметки: Разделяет imageNotes по символу табуляции и получает заметку в позиции 1
  4. Обновить имена: Заменяет весь элемент <name> извлеченной заметкой
  5. Сохранить вывод: Записывает обновленный KML в файл

Установка и использование

Предварительные требования

  • Python 3 (предустановлен на macOS, скачать с python.org для Windows)
  • Дополнительные библиотеки не требуются (использует только стандартную библиотеку)

Пошаговое руководство

1. Загрузить скрипт

Загрузите update_kml_names.py и поместите его в ту же папку, что и ваш файл KML.

2. Запустить скрипт

macOS / Linux:

# Перейти в папку с вашим файлом KML
cd ~/Downloads/Points_20251115_163211

# Запустить скрипт (создает резервную копию, обновляет оригинал)
python3 update_kml_names.py doc.kml

# Или создать новый выходной файл (сохраняет оригинал)
python3 update_kml_names.py doc.kml updated_points.kml

Windows:

# Перейти в папку с вашим файлом KML
cd %USERPROFILE%\Downloads\Points_20251115_163211

# Запустить скрипт (создает резервную копию, обновляет оригинал)
python update_kml_names.py doc.kml

# Или создать новый выходной файл (сохраняет оригинал)
python update_kml_names.py doc.kml updated_points.kml

3. Просмотреть результаты

Скрипт отобразит обновления:

Updated: '15Nov25 16:25' -> 'Note 1'
Updated: '12Nov25 17:24' -> 'Note 2'

Completed! Updated 2 placemark(s).
Output saved to: doc.kml

Расширенное использование

Пользовательская позиция заметки

Если ваше поле imageNotes имеет другую структуру и заметка находится в другой позиции, вы можете указать это:

# Извлечь заметку из позиции 2 (третье поле, индексация с 0)
python3 update_kml_names.py doc.kml output.kml 2

Пакетная обработка

Вы можете обрабатывать несколько файлов KML используя простой скрипт:

macOS / Linux:

for file in *.kml; do
  python3 update_kml_names.py "$file"
done

Windows (PowerShell):

Get-ChildItem -Filter *.kml | ForEach-Object {
  python update_kml_names.py $_.Name
}

Пример: До и после

До обработки

<Placemark>
  <name>15Nov25 16:25</name>
  <SimpleData name="imageNotes">15Nov25 16:25	Note 1		Ad-hoc	Address...</SimpleData>
</Placemark>

<Placemark>
  <name>12Nov25 17:24</name>
  <SimpleData name="imageNotes">12Nov25 17:24	Note 2		Ad-hoc	Address...</SimpleData>
</Placemark>

После обработки

<Placemark>
  <name>Note 1</name>
  <SimpleData name="imageNotes">15Nov25 16:25	Note 1		Ad-hoc	Address...</SimpleData>
</Placemark>

<Placemark>
  <name>Note 2</name>
  <SimpleData name="imageNotes">12Nov25 17:24	Note 2		Ad-hoc	Address...</SimpleData>
</Placemark>

Технические детали

Реализация скрипта

Скрипт использует встроенный парсер XML Python (xml.etree.ElementTree) для:

  • Разбора файлов KML с правильной обработкой пространств имен
  • Навигации по структуре XML для поиска элементов меток
  • Извлечения и обработки значений, разделенных табуляцией
  • Обновления элементов с сохранением структуры файла

Совместимость

  • Версия KML: 2.2 (стандартный формат)
  • Версия Python: 3.6+
  • Операционные системы: macOS, Windows, Linux
  • Приложения: Совместим с Google Earth, QGIS, ArcGIS и другими приложениями, поддерживающими KML

Устранение неполадок

Проблема: Скрипт не найден

Причина: Python не установлен или отсутствует в системном PATH

Решение:

  • macOS: Python 3 должен быть предустановлен
  • Windows: Загрузить с python.org и убедиться, что “Add to PATH” отмечен при установке

Проблема: Пустые имена после обновления

Причина: Поле заметки пусто или находится в неправильной позиции

Решение: Скрипт покажет предупреждение. Проверьте формат вашего imageNotes и настройте параметр позиции.

Интеграция в ваш рабочий процесс

Этот скрипт можно интегрировать в автоматизированные рабочие процессы:

  1. Экспорт из GPS Camera: Экспортировать точки как KMZ/KML
  2. Извлечь KML: Распаковать KMZ при необходимости
  3. Запустить скрипт: Обработать KML для обновления имен
  4. Импортировать в GIS: Использовать в Google Earth, QGIS или других инструментах

Исходный код

#!/usr/bin/env python3
"""
Script to update KML placemark names with Note from imageNotes field.
Extracts the note from the tab-separated imageNotes field (position 2) and replaces the placemark name.
"""

import xml.etree.ElementTree as ET
import sys
import os

def update_kml_with_notes(input_file, output_file=None, note_position=1):
    """
    Update KML placemark names by extracting Note from tab-separated imageNotes field.

    Args:
        input_file: Path to input KML file
        output_file: Path to output KML file (if None, overwrites input)
        note_position: Position of the note in tab-separated imageNotes (0-indexed, default 1)
    """
    # Parse the KML file
    tree = ET.parse(input_file)
    root = tree.getroot()

    # Define namespace
    ns = {'kml': 'http://www.opengis.net/kml/2.2'}

    # Find all Placemark elements
    placemarks = root.findall('.//kml:Placemark', ns)

    updated_count = 0

    for placemark in placemarks:
        # Get the current name
        name_elem = placemark.find('kml:name', ns)
        if name_elem is None:
            continue

        current_name = name_elem.text

        # Find the imageNotes field
        image_notes_elem = placemark.find('.//kml:SimpleData[@name="imageNotes"]', ns)

        if image_notes_elem is not None and image_notes_elem.text:
            image_notes = image_notes_elem.text

            # Split by tab to get the note (tab-separated format)
            parts = image_notes.split('\t')

            if len(parts) > note_position and parts[note_position].strip():
                note_text = parts[note_position].strip()

                # Update the name - replace entirely with the note
                name_elem.text = note_text

                print(f"Updated: '{current_name}' -> '{note_text}'")
                updated_count += 1
            else:
                print(f"Warning: No note found at position {note_position} in imageNotes for placemark '{current_name}'")
                print(f"  imageNotes content: {image_notes}")
        else:
            print(f"Warning: No imageNotes found for placemark '{current_name}'")

    # Determine output file
    if output_file is None:
        output_file = input_file

    # Write the updated KML
    tree.write(output_file, encoding='utf-8', xml_declaration=True)

    print(f"\nCompleted! Updated {updated_count} placemark(s).")
    print(f"Output saved to: {output_file}")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python3 update_kml_names.py <input_kml_file> [output_kml_file] [note_position]")
        print("\nArguments:")
        print("  input_kml_file:  Path to the KML file to process")
        print("  output_kml_file: (Optional) Output file path. If not provided, input will be overwritten.")
        print("  note_position:   (Optional) 0-indexed position of note in tab-separated imageNotes (default: 1)")
        print("\nExample:")
        print("  python3 update_kml_names.py doc.kml")
        print("  python3 update_kml_names.py doc.kml doc_updated.kml")
        print("  python3 update_kml_names.py doc.kml doc_updated.kml 1")
        sys.exit(1)

    input_file = sys.argv[1]
    output_file = sys.argv[2] if len(sys.argv) > 2 else None
    note_position = int(sys.argv[3]) if len(sys.argv) > 3 else 1

    if not os.path.exists(input_file):
        print(f"Error: Input file '{input_file}' not found.")
        sys.exit(1)

    # Create backup if overwriting
    if output_file is None:
        backup_file = input_file + '.backup'
        import shutil
        shutil.copy2(input_file, backup_file)
        print(f"Backup created: {backup_file}\n")

    update_kml_with_notes(input_file, output_file, note_position)

Поддержка

По вопросам или проблемам:

  • Убедитесь, что Python 3 установлен правильно
  • Проверьте, что imageNotes содержит значения, разделенные табуляцией

Лицензия

Этот скрипт предоставляется как есть для использования с экспортами приложения. Не стесняйтесь изменять и адаптировать его под ваши конкретные нужды.


Связанная документация

Экспорт и импорт

Работа с Google Earth

Связанные рабочие процессы


Последнее обновление: Ноябрь 2025