All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.biz.common.jts.GeometryUtils Maven / Gradle / Ivy

There is a newer version: 1.5.1
Show newest version
package com.biz.common.jts;

import com.biz.common.utils.Common;
import lombok.SneakyThrows;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.Point;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;

import java.util.List;

/**
 * 提供JTS(Java Topology Suite)几何对象的常用操作工具方法。
 *
 * @author francis
 * @create 2023/3/28 18:40
 */
public final class GeometryUtils {

    /**
     * WKTReader实例,用于解析WKT字符串到Geometry对象。
     * 将其实例化为类级变量以避免重复创建,提升性能。
     */
    private static final WKTReader WKT_READER = new WKTReader();

    /**
     * 将给定的几何字符串转换为Geometry对象。
     *
     * @param str WKT(Well-Known Text)格式的几何字符串。
     * @return 对应的Geometry对象,如果输入为空或格式不正确则返回null。
     * @throws ParseException 如果WKT字符串无法解析,则抛出此异常。
     */
    @SneakyThrows(ParseException.class)
    public static Geometry geometryStrToGeometry(final String str) {
        if (Common.isBlank(str)) {
            return null;
        }

        return WKT_READER.read(str);
    }

    /**
     * 将Coordinate列表转换为Geometry对象。
     *
     * @param coordinates Coordinate列表,代表几何对象的点序列。
     * @return 如果输入为空,则返回null;否则返回由这些点构成的Geometry对象。
     */
    public static Geometry coordinatesToGeometry(List coordinates) {
        if (coordinates == null || coordinates.isEmpty()) {
            return null;
        }

        Coordinate[] coordinatesArray = new Coordinate[coordinates.size()];
        return JTSUtils.GEOMETRY_FACTORY.createPolygon(coordinates.toArray(coordinatesArray));
    }

    /**
     * 计算给定Geometry对象的中心点的经纬度。
     *
     * @param geometry 目标Geometry对象。
     * @return 包含中心点经度和纬度的double数组,如果输入为null则返回null。
     */
    public static double[] center(Geometry geometry) {
        if (geometry == null) {
            return null;
        }

        Point centroid = geometry.getCentroid();
        return Common.toDoubles(centroid.getX(), centroid.getY());
    }

    /**
     * 对两个Geometry对象进行并集运算。
     *
     * @param geo1 第一个Geometry对象。
     * @param geo2 第二个Geometry对象。
     * @return 两个Geometry对象的并集,如果任一输入为null则返回null。
     */
    public static Geometry union(Geometry geo1, Geometry geo2) {
        if (geo1 == null || geo2 == null) {
            return null;
        }

        return geo1.union(geo2);
    }

    /**
     * 对给定的Geometry对象进行缓冲区处理。
     *
     * @param geometry 目标Geometry对象。
     * @param radius 缓冲区半径。
     * @return 缓冲后的Geometry对象,如果输入为null则返回null。
     */
    public static Geometry buffer(Geometry geometry, double radius) {
        if (geometry == null) {
            return null;
        }
        return geometry.buffer(radius);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy