Ví dụ làm việc với các tệp kml/kmz thô được xuất từ ứng dụng.

Trang này cung cấp các ví dụ về xử lý hậu kỳ tệp kmz/kml mà bạn có thể thấy hữu ích.

Chuẩn bị:

  1. Xuất từ GPS Camera: Xuất điểm dưới dạng KMZ/KML
  2. Giải nén KML: Giải nén KMZ nếu cần

Cập nhật tên Placemark KML từ imageNotes

Hướng dẫn này cho thấy cách tự động cập nhật tên placemark trong tệp KML của bạn bằng cách trích xuất thông tin từ trường imageNotes.

Tổng quan

Khi xuất điểm từ GPS Camera, ứng dụng tạo các tệp KML với tên placemark dựa trên tiêu đề ảnh và điểm. Nội dung ghi chú (như “Note 1”, “Note 2”, v.v.) được lưu trữ trong trường imageNotes dưới dạng các giá trị được phân tách bằng tab. Script này cho phép bạn tự động trích xuất thông tin ghi chú đó và sử dụng nó làm tên placemark nếu cần.

Có lẽ tốt nhất là chỉ cần đặt ghi chú của bạn vào trường Tiêu đề khi chụp ảnh. Script này sẽ hữu ích nếu bạn không làm như vậy và cũng như một ví dụ về xử lý hậu kỳ kml.

Trường hợp sử dụng

Trước:

  • Tên placemark hiển thị dấu thời gian: 15Nov25 16:25, 12Nov25 17:24
  • Ghi chú thực tế được ẩn trong trường imageNotes: Note 1, Note 2

Sau:

  • Tên placemark hiển thị ghi chú có ý nghĩa: Note 1, Note 2
  • Dễ dàng xác định điểm trong ứng dụng bản đồ chỉ với một cái nhìn

Cấu trúc tệp KML

Tệp KML được xuất chứa các placemark với cấu trúc sau:

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

Trường imageNotes chứa các giá trị được phân tách bằng tab:

  • Trường 0: Dấu thời gian (15Nov25 16:25)
  • Trường 1: Văn bản ghi chú (Note 1) ← Đây là những gì chúng ta trích xuất
  • Trường 2: Trống
  • Trường 3: Loại (Ad-hoc)
  • Trường 4: Địa chỉ

Giải pháp: Script Python

Chúng tôi đã tạo một script Python tự động xử lý các tệp KML và cập nhật tên placemark dựa trên nội dung imageNotes.

Tính năng của Script

  • Trích xuất tự động: Phân tích trường imageNotes được phân tách bằng tab
  • Dựa trên vị trí: Trích xuất ghi chú từ một vị trí trường cụ thể (mặc định: vị trí 1)
  • Tổng quát: Hoạt động với bất kỳ tệp KML nào theo cấu trúc này
  • An toàn: Tạo bản sao lưu trước khi ghi đè tệp
  • Linh hoạt: Có thể xuất ra tệp mới hoặc cập nhật tại chỗ

Cách hoạt động

  1. Phân tích tệp KML: Đọc cấu trúc XML
  2. Tìm placemark: Định vị tất cả các phần tử <Placemark>
  3. Trích xuất ghi chú: Tách imageNotes bằng ký tự tab và lấy ghi chú ở vị trí 1
  4. Cập nhật tên: Thay thế toàn bộ phần tử <name> bằng ghi chú được trích xuất
  5. Lưu đầu ra: Ghi KML đã cập nhật vào tệp

Cài đặt & Sử dụng

Yêu cầu

  • Python 3 (được cài đặt sẵn trên macOS, tải xuống từ python.org cho Windows)
  • Không cần thư viện bổ sung (chỉ sử dụng thư viện chuẩn)

Hướng dẫn từng bước

1. Tải xuống Script

Tải xuống update_kml_names.py và đặt nó trong cùng thư mục với tệp KML của bạn.

2. Chạy Script

macOS / Linux:

# Điều hướng đến thư mục chứa tệp KML của bạn
cd ~/Downloads/Points_20251115_163211

# Chạy script (tạo bản sao lưu, cập nhật bản gốc)
python3 update_kml_names.py doc.kml

# Hoặc tạo tệp đầu ra mới (giữ bản gốc)
python3 update_kml_names.py doc.kml updated_points.kml

Windows:

# Điều hướng đến thư mục chứa tệp KML của bạn
cd %USERPROFILE%\Downloads\Points_20251115_163211

# Chạy script (tạo bản sao lưu, cập nhật bản gốc)
python update_kml_names.py doc.kml

# Hoặc tạo tệp đầu ra mới (giữ bản gốc)
python update_kml_names.py doc.kml updated_points.kml

3. Xem kết quả

Script sẽ hiển thị các cập nhật:

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

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

Sử dụng nâng cao

Vị trí ghi chú tùy chỉnh

Nếu trường imageNotes của bạn có cấu trúc khác và ghi chú ở vị trí khác, bạn có thể chỉ định:

# Trích xuất ghi chú từ vị trí 2 (trường thứ ba, chỉ số 0)
python3 update_kml_names.py doc.kml output.kml 2

Xử lý hàng loạt

Bạn có thể xử lý nhiều tệp KML bằng một script đơn giản:

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
}

Ví dụ: Trước và Sau

Trước khi xử lý

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

Sau khi xử lý

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

Chi tiết kỹ thuật

Triển khai Script

Script sử dụng trình phân tích XML tích hợp của Python (xml.etree.ElementTree) để:

  • Phân tích các tệp KML với xử lý namespace phù hợp
  • Điều hướng cấu trúc XML để tìm các phần tử placemark
  • Trích xuất và xử lý các giá trị được phân tách bằng tab
  • Cập nhật các phần tử trong khi vẫn giữ nguyên cấu trúc tệp

Khả năng tương thích

  • Phiên bản KML: 2.2 (định dạng chuẩn)
  • Phiên bản Python: 3.6+
  • Hệ điều hành: macOS, Windows, Linux
  • Ứng dụng: Tương thích với Google Earth, QGIS, ArcGIS và các ứng dụng hỗ trợ KML khác

Khắc phục sự cố

Vấn đề: Không tìm thấy script

Nguyên nhân: Python chưa được cài đặt hoặc không có trong PATH hệ thống

Giải pháp:

  • macOS: Python 3 nên được cài đặt sẵn
  • Windows: Tải xuống từ python.org và đảm bảo “Add to PATH” được chọn trong quá trình cài đặt

Vấn đề: Tên trống sau khi cập nhật

Nguyên nhân: Trường ghi chú trống hoặc ở vị trí sai

Giải pháp: Script sẽ hiển thị cảnh báo. Kiểm tra định dạng imageNotes của bạn và điều chỉnh tham số vị trí.

Tích hợp với quy trình làm việc của bạn

Script này có thể được tích hợp vào các quy trình làm việc tự động:

  1. Xuất từ GPS Camera: Xuất điểm dưới dạng KMZ/KML
  2. Giải nén KML: Giải nén KMZ nếu cần
  3. Chạy script: Xử lý KML để cập nhật tên
  4. Nhập vào GIS: Sử dụng trong Google Earth, QGIS hoặc các công cụ khác

Mã nguồn

#!/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)

Hỗ trợ

Đối với câu hỏi hoặc vấn đề:

  • Xác minh rằng Python 3 đã được cài đặt đúng
  • Kiểm tra xem imageNotes có chứa các giá trị được phân tách bằng tab

Giấy phép

Script này được cung cấp như hiện tại để sử dụng với các bản xuất ứng dụng. Hãy thoải mái sửa đổi và điều chỉnh nó theo nhu cầu cụ thể của bạn.


Tài liệu liên quan

Xuất & Nhập

Làm việc với Google Earth

Quy trình làm việc liên quan


Cập nhật lần cuối: Tháng 11 năm 2025