package com.chinaweal.aiccs.aiccs.market.ai.util;

import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKBReader;
import com.vividsolutions.jts.io.WKTReader;

/**
 * @author <a href="https://blog.lroyia.top">lroyia</a>
 * @since 2021/11/27 16:37
 **/
public abstract class GeometryUtil {

    private final static GeometryFactory FACTORY = new GeometryFactory();

    /**
     * 通过WKB格式的16进制传转换成几何
     * WEB格式序列，如0101000000000000000000F03F000000000000F0BF（共21byte）
     * 该序列依序表示为一下成分
     * 01（1byte）：构成，大小，值，字节顺序
     * 01000000（4byte）：WKB类型
     * 000000000000F03F（8byte）：X轴坐标
     * 000000000000F0BF（8byte）：Y轴坐标
     * @param wkb   wkb字串
     * @return  转换结果
     * @author lroyia
     * @since  2021年11月27日 15:58:00
     */
    public static Geometry readWKBHex(String wkb) throws ParseException {
        return readWKB(WKBReader.hexToBytes(wkb));
    }

    /**
     * 通过WKB格式传转换成几何
     * WEB格式序列，如0101000000000000000000F03F000000000000F0BF（共21byte）
     * 该序列依序表示为一下成分
     * 01（1byte）：构成，大小，值，字节顺序
     * 01000000（4byte）：WKB类型
     * 000000000000F03F（8byte）：X轴坐标
     * 000000000000F0BF（8byte）：Y轴坐标
     * @param wkb   wkb字串
     * @return  转换结果
     * @author lroyia
     * @since  2021年11月27日 15:58:00
     */
    public static Geometry readWKB(byte[] wkb) throws ParseException {
        WKBReader wkbReader = new WKBReader(FACTORY);
        return wkbReader.read(wkb);
    }

    /**
     * 创建一个点
     * @param x 点X轴坐标
     * @param y 点Y轴坐标
     * @return  点对象
     * @author lroyia
     * @since  2021年11月27日 20:33:58
     */
    public static Point createPoint(double x, double y){
        Coordinate coordinate = new Coordinate(x, y);
        return FACTORY.createPoint(coordinate);
    }

    /**
     * 根据wkt创建一个多边形
     * @param wkt   wkt
     * @return  创建结果
     * @throws ParseException   转换异常
     * @author lroyia
     * @since  2021年11月28日 10:57:35
     */
    public static Polygon createPolygonByWKT(String wkt) throws ParseException{
        WKTReader wktReader = new WKTReader(FACTORY);
        return (Polygon) wktReader.read(wkt.trim());
    }

    /**
     * 创建一个多边形
     * @param coordinates   多边形
     * @return  创建结果
     * @author lroyia
     * @since  2021年11月28日 16:58:47
     */
    public static Polygon createPolygon(Coordinate[] coordinates){
        return FACTORY.createPolygon(coordinates);
    }

    /**
     * 根据给出的两个点坐标创建连线
     * @param startPoint    开始点坐标
     * @param endPoint      结束点坐标
     * @return  连线对象
     * @author lroyia
     * @since  2021年11月28日 15:05:36
     */
    public static LineString createLine(Coordinate startPoint, Coordinate endPoint){
        Coordinate[] coordinates = new Coordinate[]{startPoint, endPoint};
        return FACTORY.createLineString(coordinates);
    }

    /**
     * 根据wkt字串转换LineString连线
     * @param wkt   连线wkt
     * @return  LineString对象
     * @throws ParseException   转化你一场
     * @author lroyia
     * @since  2021年11月28日 15:15:39
     */
    public static LineString createLineByWKT(String wkt) throws ParseException{
        WKTReader wktReader = new WKTReader(FACTORY);
        return (LineString) wktReader.read(wkt);
    }

}
