[add] 新增无人机模块后端项目
[refactor] 重构后端项目
This commit is contained in:
		| @ -0,0 +1,297 @@ | ||||
| package com.ruoyi.wayline.waypoint; | ||||
|  | ||||
| /** | ||||
|  * @Author zhouzhixiong | ||||
|  * @Date 2023/12/2 17:04 | ||||
|  */ | ||||
|  | ||||
|  | ||||
| import com.ruoyi.wayline.domain.Action; | ||||
| import com.ruoyi.wayline.domain.Placemark; | ||||
| import com.ruoyi.wayline.domain.WaypointData; | ||||
| import org.w3c.dom.Document; | ||||
| import org.w3c.dom.Element; | ||||
| import org.w3c.dom.Node; | ||||
| import org.w3c.dom.NodeList; | ||||
| import org.xml.sax.SAXException; | ||||
|  | ||||
| import javax.xml.parsers.DocumentBuilder; | ||||
| import javax.xml.parsers.DocumentBuilderFactory; | ||||
| import javax.xml.parsers.ParserConfigurationException; | ||||
| import javax.xml.transform.OutputKeys; | ||||
| import javax.xml.transform.Transformer; | ||||
| import javax.xml.transform.TransformerException; | ||||
| import javax.xml.transform.TransformerFactory; | ||||
| import javax.xml.transform.dom.DOMSource; | ||||
| import javax.xml.transform.stream.StreamResult; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.StringWriter; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| public class WayPointKmlProcessorModify { | ||||
|  | ||||
|     /** | ||||
|      * 根据提供的数据请求处理并生成航点飞行的 KML 文件 | ||||
|      * | ||||
|      * @param dataRequest | ||||
|      * @return | ||||
|      */ | ||||
|     public byte[] processKml(WaypointData dataRequest, int templateId) { | ||||
|         try { | ||||
|             // 创建文件的编辑对象 | ||||
|             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); | ||||
|             DocumentBuilder builder = factory.newDocumentBuilder(); | ||||
|  | ||||
|             // 从资源中读取 KML 模板文件 | ||||
|             InputStream inputStream = getClass().getClassLoader().getResourceAsStream("waypoint/template.kml"); | ||||
|             Document document = builder.parse(inputStream); | ||||
|  | ||||
|             // 使用提供的数据请求更新文档 | ||||
|             updateDocumentWithRequestData(document, dataRequest, templateId); | ||||
|  | ||||
|             // 将更新后的文档转换为字节数组 | ||||
|             return convertDocumentToByteArray(document); | ||||
|         } catch (ParserConfigurationException | SAXException | IOException | TransformerException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 根据请求中的信息来更新文档内容 | ||||
|      * | ||||
|      * @param document | ||||
|      * @param dataRequest | ||||
|      */ | ||||
|     private void updateDocumentWithRequestData(Document document, WaypointData dataRequest, int templateId) { | ||||
|         // 更新安全起飞高度 | ||||
|         document.getElementsByTagName("wpml:takeOffSecurityHeight").item(0).setTextContent(String.valueOf(dataRequest.getTakeOffSecurityHeight())); | ||||
|  | ||||
|         // 更新参考起飞点 | ||||
|         document.getElementsByTagName("wpml:takeOffRefPoint").item(0).setTextContent(dataRequest.getTakeOffRefPoint()); | ||||
|  | ||||
|         // 更新飞向首航点速度 | ||||
|         document.getElementsByTagName("wpml:globalTransitionalSpeed").item(0).setTextContent(String.valueOf(dataRequest.getGlobalTransitionalSpeed())); | ||||
|  | ||||
|         // 更新无人机的信息和负载的信息 | ||||
|         updateDroneAndPayloadInfo(document, dataRequest); | ||||
|  | ||||
|         // 生成并设置 templateId | ||||
|         document.getElementsByTagName("wpml:templateId").item(0).setTextContent(String.valueOf(templateId)); | ||||
|  | ||||
|         // 更新全局航线速度 | ||||
|         document.getElementsByTagName("wpml:autoFlightSpeed").item(0).setTextContent(String.valueOf(dataRequest.getAutoFlightSpeed())); | ||||
|  | ||||
|         // 更新相对起飞点高度 | ||||
|         document.getElementsByTagName("wpml:globalHeight").item(0).setTextContent(String.valueOf(dataRequest.getGlobalHeight())); | ||||
|  | ||||
|         // 更新飞行器离被摄面高度(相对地面高) | ||||
|         document.getElementsByTagName("wpml:globalShootHeight").item(0).setTextContent(String.valueOf(dataRequest.getGlobalShootHeight())); | ||||
|  | ||||
|         // 更新图片格式列表 | ||||
|         document.getElementsByTagName("wpml:imageFormat").item(0).setTextContent(dataRequest.getImageFormat()); | ||||
|  | ||||
|         // 删除模板中现有的所有 <Placemark> 节点 | ||||
|         removeExistingPlacemarks(document); | ||||
|  | ||||
|         // TODO 根据提供的位置列表添加若干新的 <Placemark> 节点 | ||||
|         Element folderElement = (Element) document.getElementsByTagName("Folder").item(0); | ||||
|         for (int index = 0; index < dataRequest.getPlacemarkList().size(); index++) { | ||||
|             Placemark location = dataRequest.getPlacemarkList().get(index); | ||||
|             folderElement.appendChild(createPlacemarkElement(document, index, location, dataRequest)); | ||||
|         } | ||||
|  | ||||
|         // 更新文档中全部的负载位置索引标签 | ||||
|         updateAllPayloadPositionIndexes(document, dataRequest); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 更新所有 <wpml:payloadPositionIndex> 标签 | ||||
|      * | ||||
|      * @param document | ||||
|      * @param dataRequest | ||||
|      */ | ||||
|     private void updateAllPayloadPositionIndexes(Document document, WaypointData dataRequest) { | ||||
|         NodeList payloadPositionIndexes = document.getElementsByTagName("wpml:payloadPositionIndex"); | ||||
|         for (int i = 0; i < payloadPositionIndexes.getLength(); i++) { | ||||
|             payloadPositionIndexes.item(i).setTextContent(String.valueOf(dataRequest.getPayloadInfo().getPayloadPositionIndex())); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 创建一个新的 <Placemark> 元素 | ||||
|      * | ||||
|      * @param document | ||||
|      * @param index | ||||
|      * @param location | ||||
|      * @return | ||||
|      */ | ||||
|     private Element createPlacemarkElement(Document document, int index, Placemark location, WaypointData dataRequest) { | ||||
|         // 创建 <Placemark> 根节点 | ||||
|         Element placemark = document.createElement("Placemark"); | ||||
|  | ||||
|         // 设置 <Point> 元素及其坐标 | ||||
|         Element point = document.createElement("Point"); | ||||
|         Element coordinatesElement = document.createElement("coordinates"); | ||||
|         String coordinates = location.getLongitude() + "," + location.getLatitude(); | ||||
|         coordinatesElement.setTextContent(coordinates); | ||||
|         point.appendChild(coordinatesElement); | ||||
|         placemark.appendChild(point); | ||||
|  | ||||
|         // 设置 <wpml:index> 元素 | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:index", String.valueOf(index))); | ||||
|  | ||||
|         // 设置其他 <Placemark> 元素的属性 | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:ellipsoidHeight", String.valueOf(location.getAltitude()))); | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:height", String.valueOf(location.getAltitude()))); | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:useGlobalHeight", "0")); | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:useGlobalSpeed", "1")); | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:useGlobalHeadingParam", "1")); | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:useGlobalTurnParam", "1")); | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:useStraightLine", "1")); | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:gimbalPitchAngle", "0.0")); | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:waypointSpeed", String.valueOf(dataRequest.getAutoFlightSpeed()))); | ||||
|  | ||||
|         // 根据每个 Placemark 的动作列表创建动作组 | ||||
|         createActionGroup(document, location, placemark, index); | ||||
|  | ||||
|         return placemark; | ||||
|     } | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * 更新无人机的信息和负载信息 | ||||
|      * | ||||
|      * @param document | ||||
|      * @param dataRequest | ||||
|      */ | ||||
|     public void updateDroneAndPayloadInfo(Document document, WaypointData dataRequest) { | ||||
|         // 更新飞行器的信息 | ||||
|         NodeList droneInfoNodes = document.getElementsByTagName("wpml:droneInfo").item(0).getChildNodes(); | ||||
|         for (int i = 0; i < droneInfoNodes.getLength(); i++) { | ||||
|             Node node = droneInfoNodes.item(i); | ||||
|             if (node.getNodeName().equals("wpml:droneEnumValue")) { | ||||
|                 node.setTextContent(String.valueOf(dataRequest.getDroneInfo().getDroneEnumValue())); | ||||
|             } else if (node.getNodeName().equals("wpml:droneSubEnumValue")) { | ||||
|                 node.setTextContent(String.valueOf(dataRequest.getDroneInfo().getDroneSubEnumValue())); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         // 更新负载的信息 | ||||
|         NodeList payloadInfoNodes = document.getElementsByTagName("wpml:payloadInfo").item(0).getChildNodes(); | ||||
|         for (int i = 0; i < payloadInfoNodes.getLength(); i++) { | ||||
|             Node node = payloadInfoNodes.item(i); | ||||
|             if (node.getNodeName().equals("wpml:payloadEnumValue")) { | ||||
|                 node.setTextContent(String.valueOf(dataRequest.getPayloadInfo().getPayloadEnumValue())); | ||||
|             } else if (node.getNodeName().equals("wpml:payloadSubEnumValue")) { | ||||
|                 node.setTextContent(String.valueOf(dataRequest.getPayloadInfo().getPayloadSubEnumValue())); | ||||
|             } else if (node.getNodeName().equals("wpml:payloadPositionIndex")) { | ||||
|                 node.setTextContent(String.valueOf(dataRequest.getPayloadInfo().getPayloadPositionIndex())); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 从文档中移除所有现有的 <Placemark> 节点 | ||||
|      * | ||||
|      * @param document | ||||
|      */ | ||||
|     public void removeExistingPlacemarks(Document document) { | ||||
|         NodeList placemarks = document.getElementsByTagName("Placemark"); | ||||
|         int length = placemarks.getLength(); | ||||
|         for (int i = length - 1; i >= 0; i--) { | ||||
|             Node placemark = placemarks.item(i); | ||||
|             placemark.getParentNode().removeChild(placemark); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 创建带文本内容的新元素 | ||||
|      * | ||||
|      * @param document | ||||
|      * @param tagName | ||||
|      * @param textContent | ||||
|      * @return | ||||
|      */ | ||||
|     public Element createElementWithTextContent(Document document, String tagName, String textContent) { | ||||
|         Element element = document.createElement(tagName); | ||||
|         element.setTextContent(textContent); | ||||
|         return element; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 创建动作组 | ||||
|      * | ||||
|      * @param document | ||||
|      * @param placemark | ||||
|      */ | ||||
|     private void createActionGroup(Document document, Placemark placemark, Element placemarkElement, int index) { | ||||
|         // 创建 <wpml:actionGroup> 节点 | ||||
|         Element actionGroup = document.createElement("wpml:actionGroup"); | ||||
|         actionGroup.appendChild(createElementWithTextContent(document, "wpml:actionGroupId", "0")); | ||||
|         actionGroup.appendChild(createElementWithTextContent(document, "wpml:actionGroupStartIndex", String.valueOf(index))); | ||||
|         actionGroup.appendChild(createElementWithTextContent(document, "wpml:actionGroupEndIndex", String.valueOf(index))); | ||||
|         actionGroup.appendChild(createElementWithTextContent(document, "wpml:actionGroupMode", "sequence")); | ||||
|  | ||||
|         Element actionTrigger = document.createElement("wpml:actionTrigger"); | ||||
|         actionTrigger.appendChild(createElementWithTextContent(document, "wpml:actionTriggerType", "reachPoint")); | ||||
|         actionGroup.appendChild(actionTrigger); | ||||
|  | ||||
|         // 添加每个动作到动作组中 | ||||
|         List<Action> actions = placemark.getActions(); | ||||
|         if (actions == null || actions.isEmpty()) { | ||||
|             return; | ||||
|         } | ||||
|         for (int i = 0; i < actions.size(); i++) { | ||||
|             Action action = actions.get(i); | ||||
|             Element actionElement = createActionElement(document, i, action.getType(), action.getParams()); | ||||
|             actionGroup.appendChild(actionElement); | ||||
|         } | ||||
|  | ||||
|         // 将动作组添加到 Placemark | ||||
|         placemarkElement.appendChild(actionGroup); | ||||
|     } | ||||
|  | ||||
|     private Element createActionElement(Document document, int actionId, String actionActuatorFunc, Map<String, String> actionParams) { | ||||
|         Element actionElement = document.createElement("wpml:action"); | ||||
|  | ||||
|         // 设置动作ID | ||||
|         actionElement.appendChild(createElementWithTextContent(document, "wpml:actionId", String.valueOf(actionId))); | ||||
|  | ||||
|         // 设置动作类型 | ||||
|         actionElement.appendChild(createElementWithTextContent(document, "wpml:actionActuatorFunc", actionActuatorFunc)); | ||||
|  | ||||
|         // 创建并设置动作参数 | ||||
|         Element actionParamsElement = document.createElement("wpml:actionActuatorFuncParam"); | ||||
|         for (Map.Entry<String, String> param : actionParams.entrySet()) { | ||||
|             actionParamsElement.appendChild(createElementWithTextContent(document, "wpml:" + param.getKey(), param.getValue())); | ||||
|         } | ||||
|         actionElement.appendChild(actionParamsElement); | ||||
|  | ||||
|         return actionElement; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 将文档转换为字节数组 | ||||
|      * | ||||
|      * @param document 要转换的文档 | ||||
|      * @return 转换后的字节数组 | ||||
|      * @throws TransformerException | ||||
|      */ | ||||
|     public byte[] convertDocumentToByteArray(Document document) throws TransformerException { | ||||
|         TransformerFactory transformerFactory = TransformerFactory.newInstance(); | ||||
|         Transformer transformer = transformerFactory.newTransformer(); | ||||
|         transformer.setOutputProperty(OutputKeys.INDENT, "yes"); | ||||
|         transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); | ||||
|         DOMSource source = new DOMSource(document); | ||||
|         StringWriter stringWriter = new StringWriter(); | ||||
|         StreamResult result = new StreamResult(stringWriter); | ||||
|         transformer.transform(source, result); | ||||
|         String xmlString = stringWriter.toString(); | ||||
|         // 使用正则表达式移除空白行 | ||||
|         xmlString = xmlString.replaceAll("(?m)^[ \t]*\r?\n", ""); | ||||
|         return xmlString.getBytes(StandardCharsets.UTF_8); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,210 @@ | ||||
| package com.ruoyi.wayline.waypoint; | ||||
|  | ||||
| import com.ruoyi.wayline.domain.Placemark; | ||||
| import com.ruoyi.wayline.domain.WaypointData; | ||||
| import com.ruoyi.wayline.domain.Action; | ||||
| import org.w3c.dom.Document; | ||||
| import org.w3c.dom.Element; | ||||
| import org.w3c.dom.Node; | ||||
| import org.w3c.dom.NodeList; | ||||
| import org.xml.sax.SAXException; | ||||
|  | ||||
| import javax.xml.parsers.DocumentBuilder; | ||||
| import javax.xml.parsers.DocumentBuilderFactory; | ||||
| import javax.xml.parsers.ParserConfigurationException; | ||||
| import javax.xml.transform.OutputKeys; | ||||
| import javax.xml.transform.Transformer; | ||||
| import javax.xml.transform.TransformerException; | ||||
| import javax.xml.transform.TransformerFactory; | ||||
| import javax.xml.transform.dom.DOMSource; | ||||
| import javax.xml.transform.stream.StreamResult; | ||||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.StringWriter; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
|  | ||||
| public class WayPointWpmlProcessorModify { | ||||
|  | ||||
|     public byte[] processWpml(WaypointData dataRequest, int templateId) { | ||||
|         try { | ||||
|             DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); | ||||
|             DocumentBuilder builder = factory.newDocumentBuilder(); | ||||
|             InputStream inputStream = getClass().getClassLoader().getResourceAsStream("waypoint/waylines.wpml"); | ||||
|             Document document = builder.parse(inputStream); | ||||
|  | ||||
|             updateDocumentWithRequest(document, dataRequest, templateId); | ||||
|  | ||||
|             return convertDocumentToByteArray(document); | ||||
|         } catch (ParserConfigurationException | SAXException | IOException | TransformerException e) { | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private void updateDocumentWithRequest(Document document, WaypointData dataRequest, int templateId) { | ||||
|         document.getElementsByTagName("wpml:takeOffSecurityHeight").item(0).setTextContent(String.valueOf(dataRequest.getTakeOffSecurityHeight())); | ||||
|         document.getElementsByTagName("wpml:globalTransitionalSpeed").item(0).setTextContent(String.valueOf(dataRequest.getGlobalTransitionalSpeed())); | ||||
|         updateDroneAndPayloadInfo(document, dataRequest); | ||||
|         document.getElementsByTagName("wpml:templateId").item(0).setTextContent(String.valueOf(templateId)); | ||||
|         document.getElementsByTagName("wpml:autoFlightSpeed").item(0).setTextContent(String.valueOf(dataRequest.getAutoFlightSpeed())); | ||||
|  | ||||
|         removeExistingPlacemarks(document); | ||||
|  | ||||
|         Element folderElement = (Element) document.getElementsByTagName("Folder").item(0); | ||||
|         List<Placemark> placemarkList = dataRequest.getPlacemarkList(); | ||||
|         for (int index = 0; index < placemarkList.size(); index++) { | ||||
|             Placemark location = placemarkList.get(index); | ||||
|             String coordinates = location.getLongitude() + "," + location.getLatitude(); | ||||
|             String height = String.valueOf(dataRequest.getGlobalHeight()); | ||||
|             folderElement.appendChild(createPlacemarkElement(document, coordinates, location, dataRequest, index, height)); | ||||
|         } | ||||
|  | ||||
|         updateAllPayloadPositionIndexes(document, dataRequest); | ||||
|     } | ||||
|  | ||||
|     private void updateAllPayloadPositionIndexes(Document document, WaypointData dataRequest) { | ||||
|         NodeList payloadPositionIndexes = document.getElementsByTagName("wpml:payloadPositionIndex"); | ||||
|         for (int i = 0; i < payloadPositionIndexes.getLength(); i++) { | ||||
|             payloadPositionIndexes.item(i).setTextContent(String.valueOf(dataRequest.getPayloadInfo().getPayloadPositionIndex())); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private Element createPlacemarkElement(Document document, String coordinates, Placemark placemarkData, WaypointData dataRequest, int index, String height) { | ||||
|         Element placemark = document.createElement("Placemark"); | ||||
|  | ||||
|         Element point = document.createElement("Point"); | ||||
|         Element coordinatesElement = document.createElement("coordinates"); | ||||
|         coordinatesElement.setTextContent(coordinates); | ||||
|         point.appendChild(coordinatesElement); | ||||
|         placemark.appendChild(point); | ||||
|  | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:index", String.valueOf(index))); | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:executeHeight", placemarkData.getAltitude())); | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:waypointSpeed", String.valueOf(dataRequest.getAutoFlightSpeed()))); | ||||
|  | ||||
|         addWaypointHeadingParam(placemark, document); | ||||
|         addWaypointTurnParam(placemark, document); | ||||
|         addWaypointGimbalHeadingParam(placemark, document); | ||||
|  | ||||
|         placemark.appendChild(createElementWithTextContent(document, "wpml:useStraightLine", "1")); | ||||
|  | ||||
|         createActionGroup(document, placemark, placemarkData, index); | ||||
|  | ||||
|         return placemark; | ||||
|     } | ||||
|  | ||||
|     private void createActionGroup(Document document, Element placemarkElement, Placemark placemarkData, int index) { | ||||
|         Element actionGroup = document.createElement("wpml:actionGroup"); | ||||
|  | ||||
|         actionGroup.appendChild(createElementWithTextContent(document, "wpml:actionGroupId", "0")); | ||||
|         actionGroup.appendChild(createElementWithTextContent(document, "wpml:actionGroupStartIndex", String.valueOf(index))); | ||||
|         actionGroup.appendChild(createElementWithTextContent(document, "wpml:actionGroupEndIndex", String.valueOf(index))); | ||||
|         actionGroup.appendChild(createElementWithTextContent(document, "wpml:actionGroupMode", "sequence")); | ||||
|  | ||||
|         Element actionTrigger = document.createElement("wpml:actionTrigger"); | ||||
|         actionTrigger.appendChild(createElementWithTextContent(document, "wpml:actionTriggerType", "reachPoint")); | ||||
|         actionGroup.appendChild(actionTrigger); | ||||
|  | ||||
|         // 动态添加动作 | ||||
|         List<Action> actions = placemarkData.getActions(); | ||||
|         if (actions == null || actions.isEmpty()) { | ||||
|             return; | ||||
|         } | ||||
|         for (int i = 0; i < actions.size(); i++) { | ||||
|             Action action = actions.get(i); | ||||
|             Element actionElement = createActionElement(document, i, action.getType(), action.getParams()); | ||||
|             actionGroup.appendChild(actionElement); | ||||
|         } | ||||
|  | ||||
|         placemarkElement.appendChild(actionGroup); | ||||
|     } | ||||
|  | ||||
|     private Element createActionElement(Document document, int actionId, String actionActuatorFunc, Map<String, String> actionParams) { | ||||
|         Element actionElement = document.createElement("wpml:action"); | ||||
|         actionElement.appendChild(createElementWithTextContent(document, "wpml:actionId", String.valueOf(actionId))); | ||||
|         actionElement.appendChild(createElementWithTextContent(document, "wpml:actionActuatorFunc", actionActuatorFunc)); | ||||
|  | ||||
|         Element actionParamsElement = document.createElement("wpml:actionActuatorFuncParam"); | ||||
|         for (Map.Entry<String, String> param : actionParams.entrySet()) { | ||||
|             actionParamsElement.appendChild(createElementWithTextContent(document, "wpml:" + param.getKey(), param.getValue())); | ||||
|         } | ||||
|         actionElement.appendChild(actionParamsElement); | ||||
|  | ||||
|         return actionElement; | ||||
|     } | ||||
|  | ||||
|     private void addWaypointHeadingParam(Element placemark, Document document) { | ||||
|         Element waypointHeadingParam = document.createElement("wpml:waypointHeadingParam"); | ||||
|         waypointHeadingParam.appendChild(createElementWithTextContent(document, "wpml:waypointHeadingMode", "followWayline")); | ||||
|         waypointHeadingParam.appendChild(createElementWithTextContent(document, "wpml:waypointHeadingAngle", "0")); | ||||
|         waypointHeadingParam.appendChild(createElementWithTextContent(document, "wpml:waypointHeadingPathMode", "followBadArc")); | ||||
|         placemark.appendChild(waypointHeadingParam); | ||||
|     } | ||||
|  | ||||
|     private void addWaypointTurnParam(Element placemark, Document document) { | ||||
|         Element waypointTurnParam = document.createElement("wpml:waypointTurnParam"); | ||||
|         waypointTurnParam.appendChild(createElementWithTextContent(document, "wpml:waypointTurnMode", "toPointAndStopWithDiscontinuityCurvature")); | ||||
|         waypointTurnParam.appendChild(createElementWithTextContent(document, "wpml:waypointTurnDampingDist", "0.0")); | ||||
|         placemark.appendChild(waypointTurnParam); | ||||
|     } | ||||
|  | ||||
|     private void addWaypointGimbalHeadingParam(Element placemark, Document document) { | ||||
|         Element waypointGimbalHeadingParam = document.createElement("wpml:waypointGimbalHeadingParam"); | ||||
|         waypointGimbalHeadingParam.appendChild(createElementWithTextContent(document, "wpml:waypointGimbalPitchAngle", "0.0")); | ||||
|         placemark.appendChild(waypointGimbalHeadingParam); | ||||
|     } | ||||
|  | ||||
|     public void updateDroneAndPayloadInfo(Document document, WaypointData dataRequest) { | ||||
|         NodeList droneInfoNodes = document.getElementsByTagName("wpml:droneInfo").item(0).getChildNodes(); | ||||
|         for (int i = 0; i < droneInfoNodes.getLength(); i++) { | ||||
|             Node node = droneInfoNodes.item(i); | ||||
|             if (node.getNodeName().equals("wpml:droneEnumValue")) { | ||||
|                 node.setTextContent(String.valueOf(dataRequest.getDroneInfo().getDroneEnumValue())); | ||||
|             } else if (node.getNodeName().equals("wpml:droneSubEnumValue")) { | ||||
|                 node.setTextContent(String.valueOf(dataRequest.getDroneInfo().getDroneSubEnumValue())); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         NodeList payloadInfoNodes = document.getElementsByTagName("wpml:payloadInfo").item(0).getChildNodes(); | ||||
|         for (int i = 0; i < payloadInfoNodes.getLength(); i++) { | ||||
|             Node node = payloadInfoNodes.item(i); | ||||
|             if (node.getNodeName().equals("wpml:payloadEnumValue")) { | ||||
|                 node.setTextContent(String.valueOf(dataRequest.getPayloadInfo().getPayloadEnumValue())); | ||||
|             } else if (node.getNodeName().equals("wpml:payloadSubEnumValue")) { | ||||
|                 node.setTextContent(String.valueOf(dataRequest.getPayloadInfo().getPayloadSubEnumValue())); | ||||
|             } else if (node.getNodeName().equals("wpml:payloadPositionIndex")) { | ||||
|                 node.setTextContent(String.valueOf(dataRequest.getPayloadInfo().getPayloadPositionIndex())); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void removeExistingPlacemarks(Document document) { | ||||
|         NodeList placemarks = document.getElementsByTagName("Placemark"); | ||||
|         int length = placemarks.getLength(); | ||||
|         for (int i = length - 1; i >= 0; i--) { | ||||
|             Node placemark = placemarks.item(i); | ||||
|             placemark.getParentNode().removeChild(placemark); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public Element createElementWithTextContent(Document document, String tagName, String textContent) { | ||||
|         Element element = document.createElement(tagName); | ||||
|         element.setTextContent(textContent); | ||||
|         return element; | ||||
|     } | ||||
|  | ||||
|     public byte[] convertDocumentToByteArray(Document document) throws TransformerException { | ||||
|         TransformerFactory transformerFactory = TransformerFactory.newInstance(); | ||||
|         Transformer transformer = transformerFactory.newTransformer(); | ||||
|         transformer.setOutputProperty(OutputKeys.INDENT, "yes"); | ||||
|         transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); | ||||
|         DOMSource source = new DOMSource(document); | ||||
|         StringWriter stringWriter = new StringWriter(); | ||||
|         StreamResult result = new StreamResult(stringWriter); | ||||
|         transformer.transform(source, result); | ||||
|         String xmlString = stringWriter.toString(); | ||||
|         xmlString = xmlString.replaceAll("(?m)^[ \t]*\r?\n", ""); | ||||
|         return xmlString.getBytes(StandardCharsets.UTF_8); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user