Compare commits
2 Commits
bd6dccb6bf
...
1604ecb523
Author | SHA1 | Date |
---|---|---|
|
1604ecb523 | 2 weeks ago |
|
2a1b1b682a | 2 weeks ago |
7 changed files with 253 additions and 26 deletions
@ -0,0 +1,140 @@ |
|||||
|
package org.dromara.system.utils; |
||||
|
|
||||
|
import cn.hutool.core.util.ObjectUtil; |
||||
|
|
||||
|
import java.io.*; |
||||
|
import java.util.*; |
||||
|
|
||||
|
/** |
||||
|
* KML文件解析器 |
||||
|
* KML是Google Earth使用的标记语言格式 |
||||
|
*/ |
||||
|
public class KmlParserUtil { |
||||
|
|
||||
|
/** |
||||
|
* 从KML内容中提取所有Placemark数据 |
||||
|
* |
||||
|
* @param kmlContent KML内容 |
||||
|
* @return 包含name和coordinates的Map列表 |
||||
|
*/ |
||||
|
public static List<Map<String, String>> extractPlacemarks(String kmlContent) { |
||||
|
List<Map<String, String>> placemarkList = new ArrayList<>(); |
||||
|
int startIndex = 0; |
||||
|
|
||||
|
while (true) { |
||||
|
// 查找Placemark开始标签
|
||||
|
int startPlacemark = kmlContent.indexOf("<Placemark>", startIndex); |
||||
|
if (startPlacemark == -1) { |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
// 查找Placemark结束标签
|
||||
|
int endPlacemark = kmlContent.indexOf("</Placemark>", startPlacemark); |
||||
|
if (endPlacemark == -1) { |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
// 提取当前Placemark的内容
|
||||
|
String placemarkContent = kmlContent.substring(startPlacemark, endPlacemark + "</Placemark>".length()); |
||||
|
|
||||
|
// 提取name
|
||||
|
String name = ""; |
||||
|
int nameStart = placemarkContent.indexOf("<name>"); |
||||
|
int nameEnd = placemarkContent.indexOf("</name>"); |
||||
|
if (nameStart != -1 && nameEnd != -1) { |
||||
|
name = placemarkContent.substring(nameStart + "<name>".length(), nameEnd).trim(); |
||||
|
} |
||||
|
|
||||
|
// 提取coordinates
|
||||
|
String coordinates = ""; |
||||
|
int coordStart = placemarkContent.indexOf("<coordinates>"); |
||||
|
int coordEnd = placemarkContent.indexOf("</coordinates>"); |
||||
|
if (coordStart != -1 && coordEnd != -1) { |
||||
|
coordinates = placemarkContent.substring(coordStart + "<coordinates>".length(), coordEnd).trim(); |
||||
|
} |
||||
|
|
||||
|
//提取<Data name ="name">
|
||||
|
if (ObjectUtil.isEmpty(name)){ |
||||
|
int dataStart = placemarkContent.indexOf("Data name =\"name\""); |
||||
|
if (dataStart != -1) { |
||||
|
int valueStart = placemarkContent.indexOf("<value>", dataStart); |
||||
|
int valueEnd = placemarkContent.indexOf("</value>", valueStart); |
||||
|
if (valueStart != -1 && valueEnd != -1) { |
||||
|
name = placemarkContent.substring(valueStart + "<value>".length(), valueEnd).trim(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// 创建Map并添加到列表
|
||||
|
Map<String, String> placemarkMap = new HashMap<>(); |
||||
|
placemarkMap.put("XZQMC", name); |
||||
|
|
||||
|
String wkt = convertToWKT(coordinates); |
||||
|
|
||||
|
placemarkMap.put("the_geom", wkt); |
||||
|
|
||||
|
placemarkList.add(placemarkMap); |
||||
|
|
||||
|
// 更新搜索起始位置
|
||||
|
startIndex = endPlacemark + "</Placemark>".length(); |
||||
|
} |
||||
|
|
||||
|
return placemarkList; |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 将坐标字符串转换为WKT(Well-Known Text)格式 |
||||
|
* |
||||
|
* @param coordinates 坐标字符串 |
||||
|
* @return WKT格式的字符串 |
||||
|
*/ |
||||
|
public static String convertToWKT(String coordinates) { |
||||
|
if (coordinates == null || coordinates.trim().isEmpty()) { |
||||
|
return ""; |
||||
|
} |
||||
|
|
||||
|
// 构建WKT格式的多边形
|
||||
|
StringBuilder wkt = new StringBuilder("POLYGON(("); |
||||
|
String[] coordPairs = coordinates.trim().split("\\s+"); |
||||
|
|
||||
|
// 处理每个坐标对
|
||||
|
for (int i = 0; i < coordPairs.length; i++) { |
||||
|
String[] coords = coordPairs[i].split(","); |
||||
|
if (coords.length >= 2) { |
||||
|
wkt.append(coords[0]).append(" ").append(coords[1]); |
||||
|
if (i < coordPairs.length - 1) { |
||||
|
wkt.append(", "); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
wkt.append("))"); |
||||
|
|
||||
|
StringBuffer polygonSb = new StringBuffer("GEOMETRYCOLLECTION("); |
||||
|
polygonSb.append(wkt); |
||||
|
polygonSb.append(")"); |
||||
|
|
||||
|
return polygonSb.toString(); |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* 解析KML文件的主方法 |
||||
|
* |
||||
|
* @param inputStream KML文件的输入流 |
||||
|
* @return 包含name和coordinates的Map列表 |
||||
|
* @throws IOException 如果文件读取或处理过程中发生错误 |
||||
|
*/ |
||||
|
public static List<Map<String, String>> parseKml(InputStream inputStream) throws IOException { |
||||
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { |
||||
|
StringBuilder kmlContent = new StringBuilder(); |
||||
|
String line; |
||||
|
while ((line = reader.readLine()) != null) { |
||||
|
kmlContent.append(line).append("\n"); |
||||
|
} |
||||
|
return extractPlacemarks(kmlContent.toString()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
Loading…
Reference in new issue