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ị:
- Xuất từ GPS Camera: Xuất điểm dưới dạng KMZ/KML
- 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
- Phân tích tệp KML: Đọc cấu trúc XML
- Tìm placemark: Định vị tất cả các phần tử
<Placemark> - Trích xuất ghi chú: Tách
imageNotesbằng ký tự tab và lấy ghi chú ở vị trí 1 - Cập nhật tên: Thay thế toàn bộ phần tử
<name>bằng ghi chú được trích xuất - 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:
- Xuất từ GPS Camera: Xuất điểm dưới dạng KMZ/KML
- Giải nén KML: Giải nén KMZ nếu cần
- Chạy script: Xử lý KML để cập nhật tên
- 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
imageNotescó 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
- Tùy chọn chia sẻ ảnh/điểm - Tìm hiểu cách xuất điểm ở định dạng KMZ, KML, GPX và CSV
- Tổ chức điểm thành bộ sưu tập - Hiểu cấu trúc dữ liệu trước khi xuất
Làm việc với Google Earth
- Tinh chỉnh và tùy chỉnh Google Earth - Tùy chỉnh tệp KMZ trong Google Earth, kiểu bong bóng và truy cập KML thô
Quy trình làm việc liên quan
- Tùy chỉnh tên tệp cho xuất hàng loạt - Tự động hóa đặt tên tệp trong script xử lý hàng loạt
- Sao lưu cài đặt cho tự động hóa quy trình làm việc - Quản lý hồ sơ quy trình làm việc theo chương trình
- Nhập ảnh với dữ liệu vị trí - Hoàn thành quy trình xuất/xử lý/nhập
Cập nhật lần cuối: Tháng 11 năm 2025