大疆无人机航点飞行KMZ文件提取航点坐标

一、需要插件

<!--        解析KMZ航线--><dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.1.4</version></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version></dependency>

二、KMZ解压成KML

package com.dji.sample.common.util;import org.dom4j.Document;
import org.dom4j.io.SAXReader;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;//将KMZ航线转成KML航线
public class KmzKml {public Document unzipKmzToKml() throws Exception, Exception {String strkmz="/home/ych/KmzKml/航点飞行测试.kmz";System.out.println("**********************     【KMZ转kml开始】kmz路径:       **********************\n"+ strkmz);File file = new File(strkmz);ZipFile zipFile = new ZipFile(file);ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file));InputStream inputStream = null;ZipEntry entry = null;Document doc = null;while ((entry = zipInputStream.getNextEntry()) != null) {String zipEntryName = entry.getName();//获取所需文件的节点if (zipEntryName.equals("wpmz/template.kml")) {inputStream = zipFile.getInputStream(entry);SAXReader reader = new SAXReader();doc = (Document) reader.read(inputStream);inputStream.close();}}zipFile.close();zipInputStream.close();return doc;}}

三、KML提取航点坐标

package com.dji.sample.common.util;import org.dom4j.Document;
import org.dom4j.io.SAXReader;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;//将KMZ航线转成KML航线
public class KmzKml {public Document unzipKmzToKml() throws Exception, Exception {String strkmz="/home/ych/KmzKml/航点飞行测试.kmz";System.out.println("**********************     【KMZ转kml开始】kmz路径:       **********************\n"+ strkmz);File file = new File(strkmz);ZipFile zipFile = new ZipFile(file);ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file));InputStream inputStream = null;ZipEntry entry = null;Document doc = null;while ((entry = zipInputStream.getNextEntry()) != null) {String zipEntryName = entry.getName();//获取所需文件的节点if (zipEntryName.equals("wpmz/template.kml")) {inputStream = zipFile.getInputStream(entry);SAXReader reader = new SAXReader();doc = (Document) reader.read(inputStream);inputStream.close();}}zipFile.close();zipInputStream.close();return doc;}}

四、调用

@PostMapping("${url.wayline.prefix}${url.wayline.version}/workspaces/{workspace_id}/waylines/{wayline_id}/kmzKml")public HttpResultResponse<?> Kmz() throws Exception {KmzKml kmz = new KmzKml();Document unzipKmzToKml = kmz.unzipKmzToKml();// 将dom4j 的document对象转换成String// String asXML = unzipKmzToKml.asXML();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");Date date = new Date();String fileName = sdf.format(date);String strkml = "/home/ych/KmzKml/航点飞行.kml";// 创建kml到本地OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("utf-8");XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(strkml),format);xmlWriter.write(unzipKmzToKml);xmlWriter.close();System.out.println("\n**********************     【KMZ转kml成功】kml路径:       **********************\n"+ strkml);return HttpResultResponse.success();}@GetMapping("${url.wayline.prefix}${url.wayline.version}/workspaces/{workspace_id}/waylines/{wayline_id}/singlePoint")public  HttpResultResponse<?> Kml() throws Exception {File file = new File("/home/ych/KmzKml/航点飞行.kml");InputStream in  = new FileInputStream(file);Kml kml = new Kml();Collection<? extends String> coordinatesList = kml.parseXmlWithDom4j(in);List<?>  list = (List)coordinatesList;System.out.println(list.get(3));System.out.println("获取到的坐标值:");for (String coordinates : coordinatesList) {System.out.println(coordinates);}return HttpResultResponse.success(list);}

五、效果

获取到的坐标值:
[121.369754843606, 37.5227177120414]
[121.370733797755, 37.5233089872322]
[121.370402874547, 37.5243355293892]
[121.372488283707, 37.5240973025597]
[121.372337081214, 37.5227352183251]
[121.370980455301, 37.5213158608334]
[121.372248708559, 37.5224800846951]

六、航线文件解读

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:wpml="http://www.dji.com/wpmz/1.0.2">
<Document><!-- Step 1: Implement File Creation Information --><wpml:author>Name</wpml:author><wpml:createTime>1637600807044</wpml:createTime><wpml:updateTime>1637600875837</wpml:updateTime><!-- Step 2: Setup Mission Configuration --><wpml:missionConfig><wpml:flyToWaylineMode>safely</wpml:flyToWaylineMode><wpml:finishAction>goHome</wpml:finishAction><wpml:exitOnRCLost>goContinue</wpml:exitOnRCLost><wpml:executeRCLostAction>hover</wpml:executeRCLostAction><wpml:takeOffSecurityHeight>20</wpml:takeOffSecurityHeight><wpml:takeOffRefPoint>23.98057,115.987663,100</wpml:takeOffRefPoint><wpml:takeOffRefPointAGLHeight>35</wpml:takeOffRefPointAGLHeight><wpml:globalTransitionalSpeed>8</wpml:globalTransitionalSpeed><wpml:droneInfo><!-- Declare drone model with M30 --><wpml:droneEnumValue>67</wpml:droneEnumValue><wpml:droneSubEnumValue>0</wpml:droneSubEnumValue></wpml:droneInfo><wpml:payloadInfo><!-- Declare payload model with M30 --><wpml:payloadEnumValue>52</wpml:payloadEnumValue><wpml:payloadPositionIndex>0</wpml:payloadPositionIndex></wpml:payloadInfo></wpml:missionConfig><!-- Step 3: Setup A Folder for Waypoint Template --><Folder><wpml:templateType>waypoint</wpml:templateType><wpml:useGlobalTransitionalSpeed>0</wpml:useGlobalTransitionalSpeed><wpml:templateId>0</wpml:templateId><wpml:waylineCoordinateSysParam><wpml:coordinateMode>WGS84</wpml:coordinateMode><wpml:heightMode>EGM96</wpml:heightMode><wpml:globalShootHeight>50</wpml:globalShootHeight><wpml:positioningType>GPS</wpml:positioningType><wpml:surfaceFollowModeEnable>1</wpml:surfaceFollowModeEnable><wpml:surfaceRelativeHeight>100</wpml:surfaceRelativeHeight></wpml:waylineCoordinateSysParam><wpml:autoFlightSpeed>7</wpml:autoFlightSpeed><wpml:gimbalPitchMode>usePointSetting</wpml:gimbalPitchMode><wpml:globalWaypointHeadingParam><wpml:waypointHeadingMode>followWayline</wpml:waypointHeadingMode><wpml:waypointHeadingAngle>45</wpml:waypointHeadingAngle><wpml:waypointPoiPoint>24.323345,116.324532,31.000000</wpml:waypointPoiPoint><wpml:waypointHeadingPathMode>clockwise</wpml:waypointHeadingPathMode></wpml:globalWaypointHeadingParam><wpml:globalWaypointTurnMode>toPointAndStopWithDiscontinuityCurvature</wpml:globalWaypointTurnMode><wpml:globalUseStraightLine>0</wpml:globalUseStraightLine><Placemark><Point><!-- Fill longitude and latitude here --><coordinates>longitude,latitude</coordinates></Point><wpml:index>0</wpml:index><wpml:ellipsoidHeight>90.2</wpml:ellipsoidHeight><wpml:height>100</wpml:height><wpml:useGlobalHeight>1</wpml:useGlobalHeight><wpml:useGlobalSpeed>1</wpml:useGlobalSpeed><wpml:useGlobalHeadingParam>1</wpml:useGlobalHeadingParam><wpml:useGlobalTurnParam>1</wpml:useGlobalTurnParam><wpml:gimbalPitchAngle>0</wpml:gimbalPitchAngle></Placemark><Placemark><Point><!-- Fill longitude and latitude here --><coordinates>longitude,latitude</coordinates></Point><wpml:index>1</wpml:index><wpml:ellipsoidHeight>90.2</wpml:ellipsoidHeight><wpml:height>100</wpml:height><wpml:useGlobalHeight>1</wpml:useGlobalHeight><wpml:useGlobalSpeed>1</wpml:useGlobalSpeed><wpml:useGlobalHeadingParam>1</wpml:useGlobalHeadingParam><wpml:useGlobalTurnParam>1</wpml:useGlobalTurnParam><wpml:gimbalPitchAngle>0</wpml:gimbalPitchAngle><!-- Declare action group for waypoint 1# --><wpml:actionGroup><wpml:actionGroupId>0</wpml:actionGroupId><wpml:actionGroupStartIndex>1</wpml:actionGroupStartIndex><wpml:actionGroupEndIndex>1</wpml:actionGroupEndIndex><wpml:actionGroupMode>sequence</wpml:actionGroupMode><wpml:actionTrigger><wpml:actionTriggerType>reachPoint</wpml:actionTriggerType></wpml:actionTrigger><!-- Declare the 1st action: rotate gimbal --><wpml:action><wpml:actionId>0</wpml:actionId><wpml:actionActuatorFunc>gimbalRotate</wpml:actionActuatorFunc><wpml:actionActuatorFuncParam><wpml:gimbalRotateMode>absoluteAngle</wpml:gimbalRotateMode><wpml:gimbalPitchRotateEnable>0</wpml:gimbalPitchRotateEnable><wpml:gimbalPitchRotateAngle>0</wpml:gimbalPitchRotateAngle><wpml:gimbalRollRotateEnable>0</wpml:gimbalRollRotateEnable><wpml:gimbalRollRotateAngle>0</wpml:gimbalRollRotateAngle><wpml:gimbalYawRotateEnable>1</wpml:gimbalYawRotateEnable><wpml:gimbalYawRotateAngle>30</wpml:gimbalYawRotateAngle><wpml:gimbalRotateTimeEnable>0</wpml:gimbalRotateTimeEnable><wpml:gimbalRotateTime>0</wpml:gimbalRotateTime><wpml:payloadPositionIndex>0</wpml:payloadPositionIndex></wpml:actionActuatorFuncParam></wpml:action><!-- Declare the 2nd action: take photo --><wpml:action><wpml:actionId>1</wpml:actionId><wpml:actionActuatorFunc>takePhoto</wpml:actionActuatorFunc><wpml:actionActuatorFuncParam><wpml:fileSuffix>point1</wpml:fileSuffix><wpml:payloadPositionIndex>0</wpml:payloadPositionIndex></wpml:actionActuatorFuncParam></wpml:action></wpml:actionGroup></Placemark></Folder>
</Document>
</kml>

将航线里的<coordinates>标签检测到并读取值即可获得坐标,可以按照该思路获取其它类型的航线,再将坐标系转换即可将航线展示到前端。

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

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

相关文章

学习java第一百零七天

解释JDBC抽象和DAO模块 使用JDBC抽象和DAO模块&#xff0c;我们可以确保保持数据库代码的整洁和简单&#xff0c;并避免数据库资源关闭而导致的问题。它在多个数据库服务器给出的异常之上提供了一层统一的异常。它还利用Spring的AOP模块为Spring应用程序中的对象提供事务管理服…

计算机网络(概述)

该笔记为湖科大计算机网络相关笔记、教材参考计算机网络第六版 湖科大计算机网络 计算机网络概述 因特网概述 Internet和internet的区别 internet&#xff1a;只要是计算机与计算机连接&#xff0c;形成了网络&#xff0c;就可以叫internet Internet&#xff1a;泛指全世界的…

Excel 导入实例

在上一节的基础上&#xff0c;本文演示下如何导入excel数据。 Excel导入操作指导 继承ocean-easyexcel SDK&#xff0c;上一节打包生成 <dependency><groupId>com.angel.ocean</groupId><artifactId>ocean-easyexcel</artifactId><version…

晶谷电子器件烧结封装介质材料 绝缘用晶谷低温封接环保玻璃粉 耐压高

电子器件烧结封装介质材料是用于保护和封装电子器件的关键材料。 常见的电子器件烧结封装介质材料包括以下几种&#xff1a; 1. 陶瓷材料&#xff1a;具有良好的绝缘性能、耐高温性能和机械强度。 2. 高分子材料&#xff1a;如环氧树脂等&#xff0c;具有良好的柔韧性和耐湿…

k8s离线部署nginx

1. 拉取nginx离线包到本地 sudo docker save nginx:latest -o nginx.tar 2. 导入nginx image到k8s命名空间中 sudo ctr -n k8s.io images import nginx.tar 3. 编辑nginx.yaml apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deployment spec:selector:match…

GitHub的基本使用方法

GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;提供了版本控制功能、代码托管服务、协作功能等。以下是GitHub的基本使用方法&#xff1a; 注册并登录&#xff1a;首先&#xff0c;访问GitHub官网&#xff08;https://github.com/&#xff09;并点击右上角的"…

springCloudAlibaba之链路追踪组件---skywalking

skywalking skywalking skywalking 介绍 对于一个大型的几十个、几百个微服务构成的微服务架构系统&#xff0c;通常会遇到下面一些问题&#xff0c;比如&#xff1a;如何串联整个调用链路、快速定位问题&#xff1f;如何明确各个微服务之间的依赖关系&#xff1f;如何进行各个…

【C语言】解决C语言报错:Array Index Out of Bounds

文章目录 简介什么是Array Index Out of BoundsArray Index Out of Bounds的常见原因如何检测和调试Array Index Out of Bounds解决Array Index Out of Bounds的最佳实践详细实例解析示例1&#xff1a;访问负索引示例2&#xff1a;访问超出上限的索引示例3&#xff1a;循环边界…

ArcGIS实现不同地块分类与面积汇总

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 我们要做一个不同地块面积汇总&#xff01; 你有一批地块&#xff0c;不同面积&#xff0c;我们需…

Redis单例部署

目录 1. 概述2. 参考3. 环境4. 部署4.1 操作系统4.1.1 修改系统参数4.1.2 关闭透明大页内存4.1.3 修改系统限制 4.2 安装Redis4.2.1 下载Redis4.2.2 创建redis账号4.2.3 添加Redis环境变量4.2.4 创建Redis使用目录4.2.5 安装Redis4.2.6 手动修改配置文件&#xff08;**可跳过&a…

javaSE字符串学习笔记

API和API帮助文档 API API(Application Programming Interface)&#xff1a;应用程序编程接口简单理解&#xff1a;API酒啊别人已经写好的东西&#xff0c;我们不需要自己编写&#xff0c;直接使用即可。 API这个术语在编程圈中非常常见.我第一次接触API这个词语是在大一下。老…

【办公技巧】如何编辑带有限制编辑密码的PDF文件?

PDF文件打开之后发现设置了限制编辑&#xff0c;功能栏中的编辑按钮都是灰色的&#xff0c;导致PDF文件里的内容无法编辑。那么带有限制编辑的PDF文件&#xff0c;如何编辑&#xff1f;今天分享两个方法。 方法一&#xff1a; 我们可以将PDF文件转换成其他格式&#xff0c;有…

简单理解爬虫的概念

简单来说&#xff1a; 爬虫&#xff0c;即网络蜘蛛&#xff0c;是伪装成客户端与服务器进行数据交互的程序。 代码 代码教程分享&#xff08;无偿&#xff09;&#xff1a; 思路 1.获取网页的源码 pythondef askURL(url):head{"User-Agent":"Mozilla/5.0 (L…

SQL综合查询-学校教务管理系统数据库

一、一个完整的数据查询语句的格式 SELECT 【ALL|DISTINCT】<目标列表达式>【&#xff0c;<目标列表达式2>&#xff0c;...】 FROM <表名或视图名1>【&#xff0c;<表名或视图名2>&#xff0c;...】 【WHERE <元组选择条件表达式>】 【GROUP…

利用streamlit开发大模型API调用对话网页应用

利用streamlit开发大模型API调用对话网页应用 介绍 Streamlit是一个用于构建数据应用的开源框架&#xff0c;其简单易用的界面使得数据科学家和开发人员能够快速创建交互式应用。而OpenAI API则提供了强大的语言模型&#xff0c;可以生成自然语言响应。将这两者结合起来&…

【Computer Security : Art and Science】【Second Edition】

以下是书的目录&#xff1a; #### 第一部分&#xff1a;介绍 1. 计算机安全概述 - 1.1 基本组件 - 1.2 威胁 - 1.3 策略与机制 - 1.4 假设与信任 - 1.5 保证 - 1.6 操作问题 - 1.7 人为问题 - 1.8 综合概述 - 1.9 总结 - 1.10 研究问…

redis-基础篇(2)

黑马redis-基础篇笔记 3. redis的java客户端-Jedis 在Redis官网中提供了各种语言的客户端&#xff0c;地址&#xff1a;https://redis.io/docs/clients/ 标记为❤的就是推荐使用的java客户端&#xff0c;包括&#xff1a; Jedis和Lettuce&#xff1a;这两个主要是提供了Redi…

半结构化数据

定义&#xff1a; 半结构化数据是一种数据类型&#xff0c;它既不是完全结构化也不是完全非结构化。 特点&#xff1a; 元素组合、元素可变性、位置和顺序可变、重复性、可嵌套 应用&#xff1a; 网页内容、xml文档、json对象、电子邮件、日志文件 半结构化可转换成结构化…

webClient + fastJSON2 获取json格式的数据,同时解析至java class 并 下划线转驼峰

webClient中 .accept(MediaType.APPLICATION_JSON) 决定返回值是什么格式一般情况可以不写&#xff0c;但这里要获取JSON格式的 .bodyToMono(String.class)指定返回类型 fastJSON2中 Student student JSON.parseObject(result, Student.class, JSONReader.Feature.SupportSm…

# 消息中间件 RocketMQ 高级功能和源码分析(十)

消息中间件 RocketMQ 高级功能和源码分析&#xff08;十&#xff09; 一、消息中间件 RocketMQ 源码分析&#xff1a; 消息消费概述 1、集群模式和广播模式 消息消费以组的模式开展&#xff0c;一个消费组内可以包含多个消费者&#xff0c;每一个消费者组可订阅多个主题&…