package org.sxkj.common.utils;
|
|
import org.apache.commons.lang3.StringUtils;
|
import org.geotools.geometry.jts.JTSFactoryFinder;
|
import org.locationtech.jts.geom.Coordinate;
|
import org.locationtech.jts.geom.Geometry;
|
import org.locationtech.jts.geom.GeometryFactory;
|
import org.locationtech.jts.geom.Point;
|
import org.locationtech.jts.io.ParseException;
|
import org.locationtech.jts.io.WKTReader;
|
|
public class GeomUtils {
|
|
private static final GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
|
private static final WKTReader wktReader = new WKTReader(geometryFactory);
|
|
public static boolean isGeomInvalid(String geom) {
|
if (StringUtils.isBlank(geom)) {
|
return false;
|
}
|
String upper = geom.trim().toUpperCase();
|
return !upper.contains("POLYGON");
|
}
|
|
/**
|
* 验证并转换几何数据,确保其有效
|
* @param geom WKT格式的几何数据
|
* @return 有效的几何数据,或null如果转换失败
|
*/
|
public static String validateAndFormatGeom(String geom) {
|
if (StringUtils.isBlank(geom)) {
|
return null;
|
}
|
|
try {
|
// 解析WKT字符串
|
Geometry geometry = wktReader.read(geom);
|
|
// 如果几何数据无效,尝试修复
|
if (!geometry.isValid()) {
|
geometry = geometry.buffer(0);
|
}
|
|
// 确保几何数据有效
|
if (geometry.isValid()) {
|
return geometry.toText();
|
} else {
|
return null;
|
}
|
} catch (ParseException e) {
|
// 解析失败
|
return null;
|
}
|
}
|
|
/**
|
* 从几何数据中提取中心点坐标
|
*
|
* @param geom WKT格式的几何数据
|
* @return 中心点坐标数组,格式为 [经度, 纬度],如果提取失败返回null
|
*/
|
public static double[] extractCenterPoint(String geom) {
|
if (StringUtils.isBlank(geom)) {
|
return null;
|
}
|
|
try {
|
// 解析WKT字符串
|
Geometry geometry = wktReader.read(geom);
|
|
// 获取几何对象的中心点
|
Point centroid = geometry.getCentroid();
|
if (centroid == null) {
|
return null;
|
}
|
|
Coordinate coordinate = centroid.getCoordinate();
|
if (coordinate == null) {
|
return null;
|
}
|
|
// 返回 [经度, 纬度]
|
return new double[]{coordinate.x, coordinate.y};
|
} catch (ParseException e) {
|
return null;
|
}
|
}
|
}
|