吉安感知网项目-后端
xiebin
2026-01-06 d207a86cdf1ab52ef8cb7cd83bad8fceab8038cf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package org.sxkj.common.geo.utils;
 
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.LinearRing;
import org.locationtech.jts.geom.MultiPolygon;
import org.locationtech.jts.geom.Polygon;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.operation.valid.IsValidOp;
 
public class GeometryCheck {
 
    // 新增 polygonCheck 方法,返回 boolean 值表示几何体是否正常
    public static boolean polygonCheck(String polygonData) {
        try {
            WKTReader reader = new WKTReader();
            Geometry geometry = reader.read(polygonData); // 解析 WKT 数据
 
            // 检查是否是 Polygon 或 MultiPolygon
            if (geometry instanceof Polygon) {
                Polygon polygon = (Polygon) geometry;
                return checkPolygon(polygon);
            } else if (geometry instanceof MultiPolygon) {
                MultiPolygon multiPolygon = (MultiPolygon) geometry;
                boolean allValid = true;
                for (int i = 0; i < multiPolygon.getNumGeometries(); i++) {
                    Polygon polygon = (Polygon) multiPolygon.getGeometryN(i);
                    if (!checkPolygon(polygon)) {
                        allValid = false; // 只要有一个多边形不正常,返回 false
                        break;
                    }
                }
                return allValid;
            } else {
                return false; // 如果几何类型不匹配,返回 false
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false; // 解析异常时返回 false
        }
    }
 
    // 检查 Polygon 是否完整且无异常,返回 boolean 表示是否正常
    private static boolean checkPolygon(Polygon polygon) {
        // 检查外环是否闭合
        boolean outerRingClosed = isRingClosed(polygon.getExteriorRing());
        // 检查每个内环(孔)是否闭合
        boolean innerRingsClosed = true;
        for (int i = 0; i < polygon.getNumInteriorRing(); i++) {
            if (!isRingClosed(polygon.getInteriorRingN(i))) {
                innerRingsClosed = false;
                break;
            }
        }
        // 使用 IsValidOp 检查几何体是否有效(例如,是否有自相交等问题)
        IsValidOp isValidOp = new IsValidOp(polygon);
        boolean isValid = isValidOp.isValid();
 
 
        // 返回该 Polygon 是否正常,即闭合且无自相交等问题
        return isValid && outerRingClosed && innerRingsClosed;
    }
 
    // 检查 LinearRing 是否闭合(首尾点是否相同)
    private static boolean isRingClosed(LinearRing ring) {
        return ring.isClosed();
    }
 
 
 
}