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