准备工作
jar 包
dom4j-2.0.3.jar
hutool-all-5.7.12.jar
gson-2.8.0.jar
kml 文件
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<Folder>
<name>系统默认任务</name>
<Placemark>
<Style>
<IconStyle>
<Icon>
<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
</Icon>
<color>ffffffff</color>
<scale>1</scale>
</IconStyle>
</Style>
<OvAttr>
<OvIcon>4</OvIcon>
<OvIconNum>0</OvIconNum>
<OvAttaList>
<OvAttaItem>d89cd0ad-a5c8-4862-b042-1c5dc8858afd.jpg</OvAttaItem>
<OvAttaItem>edf53fe0-93bb-4338-af4c-bc59d8bca646.jpg</OvAttaItem>
<OvAttaItem>2ae9bd50-ffa5-4a95-b0c3-25ffe9b2ed6f.mp4</OvAttaItem>
</OvAttaList>
</OvAttr>
<name>A1</name>
<Point>
<coordinates>122.90521628553613,27.703774764680027,0</coordinates>
</Point>
</Placemark>
<Placemark>
<Style>
<IconStyle>
<Icon>
<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
</Icon>
<color>ffffffff</color>
<scale>1</scale>
</IconStyle>
</Style>
<OvAttr>
<OvIcon>4</OvIcon>
<OvIconNum>0</OvIconNum>
<OvAttaList>
<OvAttaItem>3e4da924-4158-4f84-9dde-61765835e4ab.jpg</OvAttaItem>
<OvAttaItem>17ed3394-f384-410f-a67d-f17e68e1bacd.jpg</OvAttaItem>
</OvAttaList>
</OvAttr>
<name>A2</name>
<Point>
<coordinates>121.92842338001357,27.683479318586112,0</coordinates>
</Point>
</Placemark>
<Placemark>
<Style>
<IconStyle>
<Icon>
<href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
</Icon>
<color>ffffffff</color>
<scale>1</scale>
</IconStyle>
</Style>
<OvAttr>
<OvIcon>4</OvIcon>
<OvIconNum>0</OvIconNum>
<OvAttaList>
<OvAttaItem>f64961e8-2770-4dfc-88c4-7d4be637e40b.jpg</OvAttaItem>
<OvAttaItem>bf4be5c5-1413-4e35-b017-e8534fcd3693.jpg</OvAttaItem>
</OvAttaList>
</OvAttr>
<name>A3</name>
<Point>
<coordinates>122.95213066064754,27.676302134985708,0</coordinates>
</Point>
</Placemark>
</Folder>
</Document>
</kml>
Bean
BackendProject
package com.company.kmldemo;
/**
* @author bfsz
* @version 1.0
* @description: TODO
* @date 2021/9/22 15:53
*/
public class BackendProject {
private String uuid;
private String projectName;
private String projectDesc;
private String projectUrl;
private int version;
private int deleted;
private String mapJson;
private boolean isDefault;
private String createTime;
private String updateTime;
public BackendProject(String uuid, String projectName, String projectDesc, String projectUrl, int version, int deleted, String mapJson, boolean isDefault, String createTime, String updateTime) {
this.uuid = uuid;
this.projectName = projectName;
this.projectDesc = projectDesc;
this.projectUrl = projectUrl;
this.version = version;
this.deleted = deleted;
this.mapJson = mapJson;
this.isDefault = isDefault;
this.createTime = createTime;
this.updateTime = updateTime;
}
// =========================================================================
public BackendProject(String projectName, String projectDesc) {
this.projectName = projectName;
this.projectDesc = projectDesc;
}
public BackendProject() {}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) { this.projectName = projectName; }
public String getProjectDesc() {
return projectDesc;
}
public void setProjectDesc(String projectDesc) { this.projectDesc = projectDesc; }
public String getProjectUrl() {
return projectUrl == null ? "" : projectUrl;
}
public void setProjectUrl(String projectUrl) { this.projectUrl = projectUrl; }
public int getVersion() {
return version;
}
public int getDeleted() {
return deleted;
}
public String getMapJson() {
return mapJson;
}
public void setMapJson(String mapJson) {
this.mapJson = mapJson;
}
public boolean isDefault() {
return isDefault;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) { this.createTime = createTime; }
public String getUpdateTime() {
return updateTime == null ? "" : updateTime;
}
public void setVersion(int version) { this.version = version; }
public void setDeleted(int deleted) { this.deleted = deleted; }
public void setDefault(boolean aDefault) { isDefault = aDefault; }
public void setUpdateTime(String updateTime) { this.updateTime = updateTime; }
@Override
public String toString() { return JsonManager.getInstance().gson().toJson(this); }
}
MapData
package com.company.kmldemo;
import java.util.ArrayList;
import java.util.List;
/**
* @author bfsz
* @version 1.0
* @description: TODO
* @date 2021/9/22 16:12
*/
public class MapData {
private ArrayList<Point> points;
private ArrayList<Line> lines;
public List<Point> getPoints() {
return points;
}
public List<Line> getLines() {
return lines;
}
public void setPoints(ArrayList<Point> points) {
this.points = points;
}
public void setLines(ArrayList<Line> lines) {
this.lines = lines;
}
@Override
public String toString() {
return JsonManager.getInstance().gson().toJson(this);
}
public static class Point {
private String uuid;
private String name;
private String description;
private Coordinate coordinate;
private ArrayList<File> files;
public String getUuid() {
return uuid;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public Coordinate getCoordinate() {
return coordinate;
}
public ArrayList<File> getFiles() {
return files;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public void setName(String name) {
this.name = name;
}
public void setDescription(String description) {
this.description = description;
}
public void setCoordinate(Coordinate coordinate) {
this.coordinate = coordinate;
}
public void setFiles(ArrayList<File> files) {
this.files = files;
}
@Override
public String toString() {
return JsonManager.getInstance().gson().toJson(this);
}
}
public static class Line {
private String name;
private String description;
private ArrayList<Coordinate> coordinates;
private ArrayList<File> files;
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public ArrayList<File> getFiles() {
return files;
}
@Override
public String toString() {
return JsonManager.getInstance().gson().toJson(this);
}
}
public static class Coordinate {
private double lat;
private double lng;
public double getLat() {
return lat;
}
public double getLng() {
return lng;
}
public void setLat(double lat) {
this.lat = lat;
}
public void setLng(double lng) {
this.lng = lng;
}
@Override
public String toString() {
return JsonManager.getInstance().gson().toJson(this);
}
}
public static class File {
private String type; // image, video
private String name;
private String localPath;
private String path;
private String date;
public String getType() {
return type;
}
public String getName() {
return name;
}
public String getLocalPath() {
return localPath;
}
public void setLocalPath(String localPath) {
this.localPath = localPath;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public String getDate() {
return date;
}
public void setType(String type) {
this.type = type;
}
public void setName(String name) {
this.name = name;
}
public void setDate(String date) {
this.date = date;
}
@Override
public String toString() {
return JsonManager.getInstance().gson().toJson(this);
}
}
}
Json工具类
package com.company.kmldemo;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
* @author bfsz
* @version 1.0
* @description: TODO
* @date 2021/9/24 16:50
*/
public class JsonManager {
private static final JsonManager mInstance = new JsonManager();
private final Gson mGson;
public static JsonManager getInstance() {
return mInstance;
}
private JsonManager() {
mGson = new GsonBuilder()
.disableHtmlEscaping()
.create();
}
public Gson gson() {
return mGson;
}
}
KmlUtil 解析 kml 工具类
package com.company.kmldemo;
import cn.hutool.core.date.DateUtil;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
* @author bfsz
* @version 1.0
* @description: KmlUtil
* @date 2021/9/22 14:25
*/
public class KmlUtil {
/**
* @param file
* @return
*/
public static List<BackendProject> kml2projects(File file) {
SAXReader reader = new SAXReader();
Document doc = null;
try {
doc = reader.read(file);
} catch (DocumentException e) {
e.printStackTrace();
}
return getResultJSON(doc);
}
/**
* @param kmlString
* @return
*/
public static List<BackendProject> kml2projects(String kmlString) {
Document doc = null;
try {
doc = DocumentHelper.parseText(kmlString.trim());
} catch (DocumentException e) {
e.printStackTrace();
}
return getResultJSON(doc);
}
/**
* @param doc
* @return
*/
private static List<BackendProject> getResultJSON(Document doc) {
List<BackendProject> projects = new ArrayList<>();
if (doc == null) {
return projects;
}
List<Element> rootEls = doc.getRootElement().elements();
for (Element rootEl : rootEls) {
List<Element> documentEls = rootEl.elements();
for (Element documentEl : documentEls) {
if (documentEl.getName().equals("Folder")) {
List<Element> folderEls = documentEl.elements();
BackendProject project = new BackendProject();
MapData mapData = new MapData();
ArrayList<MapData.Point> points = new ArrayList<>();
ArrayList<MapData.Line> lines = new ArrayList<>();
for (Element folderEl : folderEls) {
if (folderEl.getName().equals("name")) {
project.setProjectName(folderEl.getStringValue());
}
if (folderEl.getName().equals("Placemark")) {
List<Element> placemarkEls = folderEl.elements();
ArrayList<MapData.File> filesDTOSList = new ArrayList<>();
MapData.Point pointsDTO = new MapData.Point();
for (Element placeMarkEl : placemarkEls) {
if (placeMarkEl.getName().equals("name")) {
pointsDTO.setName(placeMarkEl.getStringValue());
pointsDTO.setDescription("");
pointsDTO.setUuid(UUID.randomUUID().toString());
}
if (placeMarkEl.getName().equals("Point")) {
String coordinates = placeMarkEl.element("coordinates").getStringValue().trim();
MapData.Coordinate coordinateDTO = new MapData.Coordinate();
coordinateDTO.setLat(Double.parseDouble(coordinates.split(",")[1]));
coordinateDTO.setLng(Double.parseDouble(coordinates.split(",")[0]));
pointsDTO.setCoordinate(coordinateDTO);
}
if (placeMarkEl.getName().equals("OvAttr")) {
List<Element> ovAttaList = placeMarkEl.element("OvAttaList").elements();
for (Element ovAttaListE : ovAttaList) {
MapData.File filesDTO = new MapData.File();
String name = ovAttaListE.getStringValue().trim();
String type = name.endsWith("mp4") ? "video" : "image";
filesDTO.setName(name);
filesDTO.setLocalPath(name);
filesDTO.setType(type);
filesDTO.setPath("");
filesDTO.setDate(DateUtil.now());
filesDTOSList.add(filesDTO);
}
}
pointsDTO.setFiles(filesDTOSList);
}
points.add(pointsDTO);
}
}
mapData.setPoints(points);
mapData.setLines(lines);
project.setMapJson(JsonManager.getInstance().gson().toJson(mapData));
project.setCreateTime("");
project.setProjectDesc("");
project.setProjectUrl("");
project.setUpdateTime("");
project.setUuid("");
project.setDefault(false);
project.setDeleted(0);
project.setVersion(0);
projects.add(project);
}
}
}
return projects;
}
}
使用
package com.company;
import com.company.kmldemo.KmlUtil;
import java.io.File;
public class Main {
public static void main(String[] args) {
// 文件
List<BackendProject> backendProjects = KmlUtil.kml2projects(new File("E:\\IdeaProjects\\Java-Demo\\src\\com\\company\\kmldemo\\xmls\\kml922.kml"));
// 字符串
List<BackendProject> backendProjects1 = KmlUtil.kml2projects("<?xml version=\"1.0\" encoding=\"UTF-8\"?><kml xmlns=\"http://www.opengis.net/kml/2.2\"><Document><Folder><name>系统默认任务</name><Placemark><Style><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href></Icon><color>ffffffff</color><scale>1</scale></IconStyle></Style><OvAttr><OvIcon>4</OvIcon><OvIconNum>0</OvIconNum><OvAttaList><OvAttaItem>d89cd0ad-a5c8-4862-b042-1c5dc8858afd.jpg</OvAttaItem><OvAttaItem>edf53fe0-93bb-4338-af4c-bc59d8bca646.jpg</OvAttaItem><OvAttaItem>2ae9bd50-ffa5-4a95-b0c3-25ffe9b2ed6f.mp4</OvAttaItem></OvAttaList></OvAttr><name>A1</name><Point><coordinates>106.90521628553613,27.703774764680027,0</coordinates></Point></Placemark><Placemark><Style><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href></Icon><color>ffffffff</color><scale>1</scale></IconStyle></Style><OvAttr><OvIcon>4</OvIcon><OvIconNum>0</OvIconNum><OvAttaList><OvAttaItem>3e4da924-4158-4f84-9dde-61765835e4ab.jpg</OvAttaItem><OvAttaItem>17ed3394-f384-410f-a67d-f17e68e1bacd.jpg</OvAttaItem></OvAttaList></OvAttr><name>A2</name><Point><coordinates>106.92842338001357,27.683479318586112,0</coordinates></Point></Placemark><Placemark><Style><IconStyle><Icon><href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href></Icon><color>ffffffff</color><scale>1</scale></IconStyle></Style><OvAttr><OvIcon>4</OvIcon><OvIconNum>0</OvIconNum><OvAttaList><OvAttaItem>f64961e8-2770-4dfc-88c4-7d4be637e40b.jpg</OvAttaItem><OvAttaItem>bf4be5c5-1413-4e35-b017-e8534fcd3693.jpg</OvAttaItem></OvAttaList></OvAttr><name>A3</name><Point><coordinates>106.95213066064754,27.676302134985708,0</coordinates></Point></Placemark></Folder></Document></kml>");
System.out.println(backendProjects);
System.out.println(backendProjects1);
}
}
结果:
{
"uuid":"",
"projectName":"系统默认任务",
"projectDesc":"",
"projectUrl":"",
"version":0,
"deleted":0,
"mapJson":"{\"points\":[{\"uuid\":\"e029eef2-aabc-4852-bac8-7e3b242f705a\",\"name\":\"A1\",\"description\":\"\",\"coordinate\":{\"lat\":27.703774764680027,\"lng\":106.90521628553613},\"files\":[{\"type\":\"image\",\"name\":\"d89cd0ad-a5c8-4862-b042-1c5dc8858afd.jpg\",\"localPath\":\"d89cd0ad-a5c8-4862-b042-1c5dc8858afd.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"},{\"type\":\"image\",\"name\":\"edf53fe0-93bb-4338-af4c-bc59d8bca646.jpg\",\"localPath\":\"edf53fe0-93bb-4338-af4c-bc59d8bca646.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"},{\"type\":\"video\",\"name\":\"2ae9bd50-ffa5-4a95-b0c3-25ffe9b2ed6f.mp4\",\"localPath\":\"2ae9bd50-ffa5-4a95-b0c3-25ffe9b2ed6f.mp4\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"}]},{\"uuid\":\"b58683fe-64d9-4b91-a237-8336c9b71f69\",\"name\":\"A2\",\"description\":\"\",\"coordinate\":{\"lat\":27.683479318586112,\"lng\":106.92842338001357},\"files\":[{\"type\":\"image\",\"name\":\"3e4da924-4158-4f84-9dde-61765835e4ab.jpg\",\"localPath\":\"3e4da924-4158-4f84-9dde-61765835e4ab.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"},{\"type\":\"image\",\"name\":\"17ed3394-f384-410f-a67d-f17e68e1bacd.jpg\",\"localPath\":\"17ed3394-f384-410f-a67d-f17e68e1bacd.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"}]},{\"uuid\":\"bf7a325e-1e3a-4c97-b51b-792e5cfd6bb4\",\"name\":\"A3\",\"description\":\"\",\"coordinate\":{\"lat\":27.676302134985708,\"lng\":106.95213066064754},\"files\":[{\"type\":\"image\",\"name\":\"f64961e8-2770-4dfc-88c4-7d4be637e40b.jpg\",\"localPath\":\"f64961e8-2770-4dfc-88c4-7d4be637e40b.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"},{\"type\":\"image\",\"name\":\"bf4be5c5-1413-4e35-b017-e8534fcd3693.jpg\",\"localPath\":\"bf4be5c5-1413-4e35-b017-e8534fcd3693.jpg\",\"path\":\"\",\"date\":\"2021-09-24 16:54:17\"}]}]}",
"isDefault":false,
"createTime":"",
"updateTime":""
}