Java Geometry LineString/俩点/Coordinates长度计算

Java Geometry LineString/俩点/Coordinates长度计算

    • 源码

纬度,经度,纬度,经度
coordinate.y对应纬度

源码

package com.demo.utils;

import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKTReader;
import com.vividsolutions.jts.util.GeometricShapeFactory;

import java.util.List;

/*************************************
 *Class Name: JtsUtils
 *Description: 
 *@author: Seminar
 *@create: 2023/3/31
 *@since 1.0.0
 *************************************/
public class JtsUtils {
    static GeometryFactory factory = new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING), 4326);

    public static Point createPoint(Coordinate pt) {

        return factory.createPoint(pt);
    }

    public static double distance(Point p1, Point p2) {
        return distance(p1.getCoordinate(), p2.getCoordinate());
    }

    public static double distance(Coordinate p1, Coordinate p2) {
        double lat1 = Math.toRadians(p1.y);
        double lon1 = Math.toRadians(p1.x);
        double lat2 = Math.toRadians(p2.y);
        double lon2 = Math.toRadians(p2.x);
        double vLon = Math.abs(lon1 - lon2);
        double vLat = Math.abs(lat1 - lat2);
        double h = haverSin(vLat) + Math.cos(lat1) * Math.cos(lat2) * haverSin(vLon);
        double distance = 1.2756274E7 * Math.asin(Math.sqrt(h));
        return distance;
    }

    private static double haverSin(double theta) {
        double v = Math.sin(theta / 2.0);
        return v * v;
    }

    public static double distance(LineString line) {
        Coordinate[] coors = line.getCoordinates();
        return distance(coors);
    }

    public static double distance(Coordinate[] coors) {
        double lineDist = 0.0;

        for (int i = 1; i < coors.length; ++i) {
            Coordinate coor1 = coors[i - 1];
            Coordinate coor2 = coors[i];
            if (coor1.x == coor2.x && coor1.y == coor2.y) {
                lineDist += 0.0;
            } else {
                lineDist += distance(coor1, coor2);
            }
        }

        return lineDist;
    }

    public static double distance(List<Coordinate> coors) {
        double lineDist = 0.0;

        for (int i = 1; i < coors.size(); ++i) {
            Coordinate coor1 = (Coordinate) coors.get(i - 1);
            Coordinate coor2 = (Coordinate) coors.get(i);
            if (coor1.x == coor2.x && coor1.y == coor2.y) {
                lineDist += 0.0;
            } else {
                lineDist += distance(coor1, coor2);
            }
        }

        return lineDist;
    }


    public static Geometry createGeometryByWKT(String wkt) throws ParseException {
        WKTReader reader = new WKTReader(factory);
        Geometry geometry = reader.read(wkt);
        return geometry;
    }

    public static LineString createLineStringByWKT(String wkt) throws ParseException {
        WKTReader reader = new WKTReader(factory);
        LineString line = (LineString) reader.read(wkt);
        return line;
    }

    public static Point createPointByWKT(String pointWkt) {
        WKTReader reader = new WKTReader(factory);
        Point point = null;

        try {
            point = (Point) reader.read(pointWkt);
        } catch (ParseException var4) {
            var4.printStackTrace();
        }

        return point;
    }

    public static Polygon createPolygonByWKT(String polygonWkt) {
        WKTReader reader = new WKTReader(factory);
        Polygon polygon = null;

        try {
            polygon = (Polygon) reader.read(polygonWkt);
        } catch (ParseException var4) {
            var4.printStackTrace();
        }

        return polygon;
    }

    public static Geometry createCircle(double x, double y, double radius) {
        GeometricShapeFactory shapeFactory = new GeometricShapeFactory();
        shapeFactory.setNumPoints(128);
        shapeFactory.setCentre(new Coordinate(x, y));
        shapeFactory.setSize(radius * 2.0);
        return shapeFactory.createCircle();
    }

    public static void main(String[] args) throws ParseException {
        String lineString = "LINESTRING(118.810687877626 31.9125455099001,118.809488683078 31.9106356486321)";
        // 纬度lat,经度lng,纬度,经度
        //coordinate.y对应纬度
        System.out.println("dis: " + distance(createLineStringByWKT(lineString)) + "m");
    }
}

你可能感兴趣的:(JAVA,SpringBoot,SpringCloud,算法,java,算法,Geometry,LineString,Coordinate计算长度)