深入解析 KMZ 文件的处理与可视化:从数据提取到地图展示项目实战

文章目录

      • 1. KMZ 文件与 KML 文件简介
        • 1.1 KMZ 文件
        • 1.2 KML 文件
      • 2. Python 环境配置与依赖安装
      • 3. 代码实现详解
        • 3.1 查找 KMZ 文件
        • 3.2 解压 KMZ 文件
        • 3.3 解析 KML 文件
        • 3.4 可视化 KMZ 数据
      • 4. 项目实战
        • 4.1. 数据采集
        • 4.2. 项目完整代码
      • 5. 项目运行与结果展示
      • 6. 总结与展望

在处理地理空间数据时,KMZ 文件是一种常见的格式,用于存储地图和地理信息数据。KMZ 文件是 KML 文件的压缩版本,其中 KML(Keyhole Markup Language)用于描述地理数据的格式。本文将详细介绍如何使用 Python 处理 KMZ 文件,提取其中的地理数据,并将其可视化到地图上。本文的核心代码将涉及文件的解压、KML 文件的解析、GPS 数据的提取以及如何使用 Folium 库将数据展示到地图上。

1. KMZ 文件与 KML 文件简介

1.1 KMZ 文件

KMZ 文件是 KML 文件的压缩版本,通常用于存储 Google Earth 或 Google Maps 中使用的地理信息数据。KMZ 文件可以包含一个或多个 KML 文件以及其他资源文件(如图片、图标等)。KML 文件是基于 XML 的格式,用于描述地理数据的标记、路径、区域等信息。

1.2 KML 文件

KML 文件由 XML 构成,用于存储地理数据,如地点标记、线条、区域、图像叠加等。KML 的基本结构包括:

  • Placemark:标记点
  • Point:点类型
  • LineString:线条
  • Polygon:多边形
  • TimeStamp:时间戳

2. Python 环境配置与依赖安装

在开始之前,确保你的 Python 环境中已经安装了以下依赖:

  • folium:用于地图可视化
  • xml.etree.ElementTree:用于解析 XML 文件
  • zipfile:用于解压 KMZ 文件
  • glob:用于文件路径匹配

可以使用以下命令安装所需的库:

pip install folium

3. 代码实现详解

3.1 查找 KMZ 文件
import os
import globdef find_kmz_files(directory):# 使用 glob 模块查找指定目录下的所有 .kmz 文件kmz_files = glob.glob(os.path.join(directory, '*.kmz'))return kmz_files
  • 功能:遍历指定目录,查找所有以 .kmz 结尾的文件。
  • 实现:使用 glob 模块和通配符模式来匹配所有 KMZ 文件。
3.2 解压 KMZ 文件
import zipfiledef extract_kml_from_kmz(kmz_file_path):# 解压 KMZ 文件with zipfile.ZipFile(kmz_file_path, 'r') as kmz:# 查找 KML 文件kml_files = [name for name in kmz.namelist() if name.lower().endswith('.kml')]if kml_files:kml_file_path = kml_files[0]kmz.extract(kml_file_path, os.path.dirname(kmz_file_path))return os.path.join(os.path.dirname(kmz_file_path), kml_file_path)return None
  • 功能:解压 KMZ 文件,并提取其中的 KML 文件。
  • 实现:使用 zipfile 模块打开 KMZ 文件,查找并解压 KML 文件。
3.3 解析 KML 文件
import xml.etree.ElementTree as ETdef parse_kml(kml_file_path):gps_data = []tree = ET.parse(kml_file_path)root = tree.getroot()# KML 的 XML namespacenamespace = {'kml': 'http://earth.google.com/kml/2.2'}print(f"Root element: {root.tag}")# 查找所有 Placemark 元素for placemark in root.findall('.//kml:Placemark', namespace):coordinates = placemark.find('.//kml:Point/kml:coordinates', namespace)if coordinates is not None:coords = coordinates.text.strip().split(',')if len(coords) >= 3:try:longitude = float(coords[0])latitude = float(coords[1])altitude = float(coords[2])gps_data.append({'latitude': latitude,'longitude': longitude,'altitude': altitude})except ValueError as e:print(f"Error parsing coordinates: {e}")return gps_data
  • 功能:解析 KML 文件,提取 GPS 数据(经纬度和高度)。
  • 实现:使用 xml.etree.ElementTree 解析 XML 格式的 KML 文件,通过查找 Placemark 元素和 coordinates 元素来获取地理数据。
3.4 可视化 KMZ 数据
import folium
from folium.features import CustomIcondef visualize_multiple_kmz_data(kmz_data_list):if not kmz_data_list:print("No GPS data available to visualize.")return# 计算所有经纬度的平均值,作为地图的中心all_latitudes = []all_longitudes = []for kmz_data in kmz_data_list:latitudes = [data['latitude'] for data in kmz_data['gps_data']]longitudes = [data['longitude'] for data in kmz_data['gps_data']]all_latitudes.extend(latitudes)all_longitudes.extend(longitudes)avg_latitude = sum(all_latitudes) / len(all_latitudes)avg_longitude = sum(all_longitudes) / len(all_longitudes)map_center = [avg_latitude, avg_longitude]gps_map = folium.Map(location=map_center, zoom_start=14, tiles='OpenStreetMap')folium.TileLayer(tiles='https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}',name='Google Satellite',attr='© Google').add_to(gps_map)folium.LayerControl().add_to(gps_map)# 为每个 KMZ 文件使用不同的颜色colors = ['red', 'blue', 'green', 'purple', 'orange', 'darkred', 'lightred', 'beige', 'darkblue', 'darkgreen', 'cadetblue', 'darkpurple', 'white', 'pink', 'lightblue', 'lightgreen', 'gray', 'black', 'lightgray']for idx, kmz_data in enumerate(kmz_data_list):color = colors[idx % len(colors)]for data in kmz_data['gps_data']:folium.CircleMarker([data['latitude'], data['longitude']],radius=0.5,  # 半径大小color=color,  # 边框颜色fill=True,fill_color=color,  # 填充颜色fill_opacity=0.8).add_to(gps_map)# 绘制路径线并添加箭头for i in range(1, len(kmz_data['gps_data'])):start_point = kmz_data['gps_data'][i-1]end_point = kmz_data['gps_data'][i]# 绘制线条folium.PolyLine(locations=[(start_point['latitude'], start_point['longitude']),(end_point['latitude'], end_point['longitude'])],color=color,weight=2).add_to(gps_map)# 添加箭头folium.Marker(location=[(start_point['latitude'] + end_point['latitude']) / 2,(start_point['longitude'] + end_point['longitude']) / 2],icon=CustomIcon('https://upload.wikimedia.org/wikipedia/commons/e/e5/Black_triangle_pointing_right.svg',icon_size=(10, 10), icon_anchor=(5, 5))).add_to(gps_map)gps_map.save('multiple_kmz_map.html')print("GPS map saved as 'multiple_kmz_map.html'.")
  • 功能:将多个 KMZ 文件的数据可视化到一个地图上,使用不同的颜色表示不同的 KMZ 文件。
  • 实现
    • 计算所有点的平均经纬度作为地图的中心。
    • 使用 folium.Map 创建地图,并添加地图图层。
    • 对每个 KMZ 文件使用不同的颜色,并将其 GPS 数据以 CircleMarker 的形式添加到地图上。

绘制路径线,并在路径中添加箭头指示方向。

4. 项目实战

4.1. 数据采集

两个kmz文件:
在这里插入图片描述
其中一个kmz文件解压,会看到有一个kml文件:
在这里插入图片描述
kml文件打开,会看到一些关键信息,以下是部分信息截图:
在这里插入图片描述

4.2. 项目完整代码
import os
import glob
import folium
import zipfile
import xml.etree.ElementTree as ET
from folium.features import CustomIcondef find_kmz_files(directory):kmz_files = glob.glob(os.path.join(directory, '*.kmz'))return kmz_filesdef extract_kml_from_kmz(kmz_file_path):with zipfile.ZipFile(kmz_file_path, 'r') as kmz:kml_files = [name for name in kmz.namelist() if name.lower().endswith('.kml')]if kml_files:kml_file_path = kml_files[0]kmz.extract(kml_file_path, os.path.dirname(kmz_file_path))return os.path.join(os.path.dirname(kmz_file_path), kml_file_path)return Nonedef parse_kml(kml_file_path):gps_data = []tree = ET.parse(kml_file_path)root = tree.getroot()namespace = {'kml': 'http://earth.google.com/kml/2.2'}for placemark in root.findall('.//kml:Placemark', namespace):coordinates = placemark.find('.//kml:Point/kml:coordinates', namespace)if coordinates is not None:coords = coordinates.text.strip().split(',')if len(coords) >= 3:try:longitude = float(coords[0])latitude = float(coords[1])altitude = float(coords[2])gps_data.append({'latitude': latitude,'longitude': longitude,'altitude': altitude})except ValueError as e:print(f"Error parsing coordinates: {e}")return gps_datadef visualize_multiple_kmz_data(kmz_data_list):if not kmz_data_list:print("No GPS data available to visualize.")returnall_latitudes = []all_longitudes = []for kmz_data in kmz_data_list:latitudes = [data['latitude'] for data in kmz_data['gps_data']]longitudes = [data['longitude'] for data in kmz_data['gps_data']]all_latitudes.extend(latitudes)all_longitudes.extend(longitudes)avg_latitude = sum(all_latitudes) / len(all_latitudes)avg_longitude = sum(all_longitudes) / len(all_longitudes)map_center = [avg_latitude, avg_longitude]gps_map = folium.Map(location=map_center, zoom_start=14, tiles='OpenStreetMap')folium.TileLayer(tiles='https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}',name='Google Satellite',attr='© Google').add_to(gps_map)folium.LayerControl().add_to(gps_map)colors = ['red', 'blue', 'green', 'purple', 'orange', 'darkred', 'lightred', 'beige', 'darkblue', 'darkgreen', 'cadetblue', 'darkpurple', 'white', 'pink', 'lightblue', 'lightgreen', 'gray', 'black', 'lightgray']for idx, kmz_data in enumerate(kmz_data_list):color = colors[idx % len(colors)]for data in kmz_data['gps_data']:folium.CircleMarker([data['latitude'], data['longitude']],radius=0.5,color=color,fill=True,fill_color=color,fill_opacity=0.8).add_to(gps_map)for i in range(1, len(kmz_data['gps_data'])):start_point = kmz_data['gps_data'][i-1]end_point = kmz_data['gps_data'][i]folium.PolyLine(locations=[(start_point['latitude'], start_point['longitude']),(end_point['latitude'], end_point['longitude'])],color=color,weight=2).add_to(gps_map)folium.Marker(location=[(start_point['latitude'] + end_point['latitude']) / 2,(start_point['longitude'] + end_point['longitude']) / 2],icon=CustomIcon('https://upload.wikimedia.org/wikipedia/commons/e/e5/Black_triangle_pointing_right.svg',icon_size=(10, 10), icon_anchor=(5, 5))).add_to(gps_map)gps_map.save('multiple_kmz_map.html')print("GPS map saved as 'multiple_kmz_map.html'.")if __name__ == '__main__':directory_path = "F:\\notebookComputer\\20240723"kmz_files = find_kmz_files(directory_path)if kmz_files:kmz_data_list = []for kmz_file_path in kmz_files:kml_file_path = extract_kml_from_kmz(kmz_file_path)if kml_file_path:parsed_gps_data = parse_kml(kml_file_path)print(f"Parsed GPS data: {parsed_gps_data}")kmz_data_list.append({'file_name': os.path.basename(kmz_file_path),'gps_data': parsed_gps_data})if kmz_data_list:visualize_multiple_kmz_data(kmz_data_list)else:print("No GPS data available to visualize.")else:print(f"No .kmz files found in directory: {directory_path}")

5. 项目运行与结果展示

在代码执行完毕后,将会生成一个名为 multiple_kmz_map.html 的文件,该文件可以用浏览器打开以查看地图上的标记点和路径。地图将会显示所有 KMZ 文件中提取的 GPS 数据,每个文件的标记点使用不同的颜色表示。
multiple_kmz_map.html文件不好截图如下:
在这里插入图片描述
浏览器打开multiple_kmz_map.html文件效果图如下:
在这里插入图片描述

6. 总结与展望

本文详细介绍了如何使用 Python 处理 KMZ 文件,提取其中的 GPS 数据,并通过 Folium 库将其可视化。通过将 KMZ 文件中的地理数据转换为地图标记点和路径线,我们可以更直观地分析和展示地理数据。未来的工作可以包括支持更多的地理数据格式、添加更多的地图样式和功能、以及优化代码的性能和可读性。根据需求,文章可以继续扩展,以包含更多的技术细节、优化建议和实际应用场景的分析。

欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/390975.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将后台传来的数据,转成easyui-tree所需格式

easyui 中文文档 EasyUI Tree组件需要一个包含特定属性(如id, text, children等)的JSON对象数组来初始化。 而后台返回的数据,它可能不是我们直接能拿来用的。 方式一:使用loadFilter函数处理来自Web Services的JSON数据。 $(#…

功能实现——通过阿里云 OSS 实现文件管理

目录 1.需求分析2.阿里云 OSS 开通与配置2.1.登录阿里云官网2.2.搜索 OSS 服务并开通2.3.OSS 配置 3.在项目使用阿里云 OSS3.1.项目环境搭建3.2.代码实现3.2.1.将本地文件上传到阿里云 OSS3.2.2.将前端传入的文件上传到阿里云 OSS3.2.3.下载文件到本地2.3.4.流式下载3.2.4.OSSC…

本地部署文生图模型 Flux

本地部署文生图模型 Flux 0. 引言1. 本地部署1-1. 创建虚拟环境1-2. 安装依赖模块1-3. 创建 Web UI1-4. 启动 Web UI1-5. 访问 Web UI 0. 引言 2024年8月1日,blackforestlabs.ai发布了 FLUX.1 模型套件。 FLUX.1 文本到图像模型套件,该套件定义了文本到…

【收录率高丨最快会后3-4个月EI检索 | 往届均已EI检索】第四届光学与通信技术国际学术会议(ICOCT 2024,8月9-11)

欢迎参加第四届光学与通信技术国际学术会议(ICOCT 2024),该会议将于2024年8月9-11日在南京举办。自2021年首次会议以来,ICOCT已经发展成为光学和通信领域较有影响力的国际会议之一,聚焦最前沿的技术进展与未来发展趋势…

【Redis 进阶】哨兵 Sentinel(重点理解流程和原理)

Redis 的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工进行主从切换,同时大量的客户端需要被通知切换到新的主节点上,对于上了一定规模的应用来说,这种方案是无法接受的,于是 Redis 从 2.8 开始…

“八股文“在现代编程面试中的角色重塑:助力、阻力还是桥梁?

🌈所属专栏:【其它】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您的点…

AI人工智能开发环境配置

AI人工智能 为什么使用Python来开发AI 人工智能被认为是未来的趋势技术。 已经有了许多应用程序。 因此,许多公司和研究人员都对此感兴趣。 但是这里出现的主要问题是,在哪种编程语言中可以开发这些 AI 应用程序? 有各种编程语言&#xff0c…

Python 实现股票指标计算——LON

LON - 铁龙长线 1 公式 LC : REF(CLOSE,1); VID : SUM(VOL,2)/(((HHV(HIGH,2)-LLV(LOW,2)))*100); RC : (CLOSE-LC)*VID; LONG : SUM(RC,0); DIFF : SMA(LONG,10,1); DEA : SMA(LONG,20,1); LON : DIFF-DEA; LONMA : MA(LON,10); LONT : LON, COLORSTICK; 2 数据准备…

练题模块环境搭建

文章目录 1.数据库表设计1.practice_set 套卷2.practice_set_detail 套卷细节3.practice_info 练习信息4.practice_detail 练习详情5.E-R图 2.架构设计(三层架构)3.练题微服务架构搭建1.创建一个练题微服务模块1.创建一个maven项目2.把src删除&#xff0…

Halcon 二维匹配

匹配:在训练图像中呈现一个所谓的模板。系统从这个模板中派生出一个模型,通过使用该模型来定位于搜索图像中的相似模板对象。此方法能够处理打光、杂乱、位置和旋转变换的图像。 匹配优点:鲁棒性和灵活性。匹配不需要对目标进行任何形式的分割…

假期BUUCTF小练习3

文章目录 [极客大挑战 2019]BuyFlag[BJDCTF2020]Easy MD5[HCTF 2018]admin第一种方法 直接登录第二种方法 flack session伪造第三种方法Unicode欺骗 [MRCTF2020]你传你🐎呢[护网杯 2018]easy_tornadoSSTI注入 [ZJCTF 2019]NiZhuanSiWei [极客大挑战 2019]BuyFlag 一…

vmware虚拟机linux服务器的IP需要重启才能生效问题

vmware虚拟机linux服务器的IP需要重启才能生效问题 问题说明处理办法关闭&禁用网络管理 再次重启linux服务器,IP显示正常 问题说明 用vmware虚拟的linux服务器,配置了静态IP,但是每次重启liunx,IP都不是设置的静态IP&#xf…

[GWCTF 2019]我有一个数据库1

打开题目,一串乱码,不认识的汉字 打开题目地址,用dirsearch对网站进行扫描,发现几个目录。 打开,其中一个显示为是一个MySQL数据库Version 4.8.1。 发现该数据给具有文件包含漏洞,输入以下代码验证存在 h…

java面向对象编程入门

一、前言: 在Java中,面向对象编程(Object-Oriented Programming, OOP)是一种核心的编程范式。Java的设计和开发都是基于面向对象的思想。面向对象编程的主要目的是提高代码的可重用性、灵活性和可维护性。以下是Java面向对象编程…

Neutralinojs教程项目实战初体验(踩坑指南),干翻 electron

Neutralinojs 项目实战初体验(踩坑指南),干翻 electron 大家好我是csdn的red润 Neutralinojs 官方文档 卧槽卧槽,!这个年轻人居然用浏览器把电脑关机了_哔哩哔哩_bilibili正是在下 本教程搭建的是纯原生项目&#x…

LeetCode每日一题_3143.正方形中的最多点数

解题思路:自己:先把points里的点拿来求出坐标系的离原点最远的点,然后根据最远距离新建一个数组,然后把points的点都在新建的数组上标记出来。然后再便利从边长为0的正方形开始,里面是否有重复的标签。但是代码写不出来…

vulhub-wordpress

1.打开wordpress关卡,选择简体中文 添加信息——点击安装WordPress 安装完成——登录 点击外观——编辑主题 可以加入一句话木马,但是我写入的是探针文件 也可以去上传一个带有木马的主题 上传之后会自动解压 1.php就是里面的木马文件

数据结构与算法 - 堆

1. 建堆 Floyd建堆算法作者(也是之前龟兔赛跑判环作者): ①找到最后一个非叶子节点②从后往前,对每个节点执行下潜 一些规律 一棵满二叉树节点个数为2^h - 1,如下例中高度h 3节点数是2 ^ 3 - 1 7非叶子节点范围为…

PMP--冲刺--敏捷中的角色职责与3个工件--题干关键词

文章目录 敏 捷 中 的 角 色 职 责 与 3 个 工 件--题干关键词说明题目 敏 捷 中 的 角 色 职 责 与 3 个 工 件–题干关键词 角色职责 1、产品负责人:题干关键词 “优先级排序、与客户沟通、下次迭代做什么、接受或拒绝用户故事”。 2、Scrum Master:题…

uniapp自定义网格布局用于选择金额、输入框焦点事件以及点击逻辑实战

样式 <view class="withdraw-section"><text class="section-title">提现金额</text><view class="amount-options"><view v-for="(item, index) in list" :key="index" class="amount-opt…