8 votos

Encontrar la distancia perpendicular y el vector perpendicular mínimo entre el punto y la línea utilizando GeoTools y JTS?

Tengo una línea formada por 2 pares de lat/lon, y la lat/lon de un punto. Me gustaría averiguar la distancia perpendicular entre la línea y el punto en la superficie de la Tierra (se puede suponer que la Tierra es una gran esfera), y el vector perpendicular mínimo (es decir, el "punto de cruce" proyectado en la línea).

Estoy tratando de usar Geotools 8.0 y JTS para esto. A continuación capturé mi código de prueba:

    //Coordinates in lon, lat
    Coordinate linePt1 = new Coordinate(-5.71472, 50.06639);
    Coordinate linePt2 = new Coordinate(-3.07000, 58.64389);

    //Multiply all longitudes by the cosine of latitude.
    //http://gis.stackexchange.com/a/29713/10772
    linePt1.x = linePt1.x * Math.cos(linePt1.y);
    linePt2.x = linePt2.x * Math.cos(linePt2.y);

    LineString line = createLine(new Coordinate[]{linePt1, linePt2});

    Coordinate pt1 = new Coordinate(-6, 54);
    pt1.x = pt1.x * Math.cos(pt1.y);
    Point point = createPoint(pt1.x, pt1.y);

    double distanceOp = DistanceOp.distance(line, point);
    System.out.println("Distance = " + distanceOp);

    //Find the minimum perpendicular vector using "closestPoints()"
    for (Coordinate c : DistanceOp.closestPoints(line, point)) {
        System.out.println("=== " + c);
        //verify if the point is on the line
        System.out.println(CGAlgorithms.isOnLine(c, new Coordinate[]{linePt1, linePt2}));
    }

los métodos createPoint() y createLine():

public static LineString createLine(Coordinate[] coordinates){
    GeometryFactory factory = new GeometryFactory(new PrecisionModel(
            PrecisionModel.FLOATING), WGS84_SRID);
    LineString line = (LineString) factory.createLineString(coordinates);
    return line;
}

public static Point createPoint(double longitude, double latitude) {
    if (longitude < -180 || longitude > 180) {
        throw new IllegalArgumentException(
                "Longitude should be between -180 and 180");
    }
    if (latitude < -90 || latitude > 90) {
        throw new IllegalArgumentException(
                "latitude should be between -90 and 90");
    }
    GeometryFactory factory = new GeometryFactory(new PrecisionModel(
            PrecisionModel.FLOATING), WGS84_SRID);
    Point point = (Point) factory.createPoint(new Coordinate(longitude,
            latitude));
    return point;
}

Sin embargo, el resultado de "isOnLine()" devuelve false. Me preguntaba si hay algo mal.

¿Hay algún error en mi método de comprobación, o realmente la forma que he utilizado para averiguar la distancia perpendicular y el "punto de cruce" en la superficie de la Tierra no es correcta?

0 votos

¿Has probado a utilizar PrecisionModel.FIXED ? No puedo comentar el resto de tu código, pero una doble precisión puede introducir errores. Ver Robustez y precisión en el FAQ del STC.

0 votos

@hepiladron, Gracias por tu sugerencia. He intentado utilizar PrecisionModel.FIXED pero sigo obteniendo el mismo resultado...

0 votos

Para los futuros lectores, es poco probable que esto funcione, ya que el STC asume un marco cartesiano y no maneja la geometría esférica en absoluto.

3voto

Richard Puntos 113

Finalmente encontré una utilidad java que hace el trabajo de inmediato

http://biodiversityinformatics.amnh.org/open_source/pdc/documentation.php

3voto

AJ01 Puntos 101

También hay una solución utilizando la proyección gonomónica presentada por Charles Karnes en Algorithms for geodesics. Hay una implementación en Java disponible con la biblioteca Barefoot: https://github.com/bmwcarit/barefoot

SpatialOperator spatial = new Geography();

Point reykjavik = new Point(-21.933333, 64.15);
Point moskva = new Point(37.616667, 55.75);
Point berlin = new Point(13.408056, 52.518611);

double f = spatial.intercept(reykjavik, moskva, berlin);
Point interception = spatial.interpolate(reykjavik, moskva, f);

Para más detalles, consulte la respuesta aquí: https://gis.stackexchange.com/a/184695/29490

Funciona para proyecciones de punto a línea de gran distancia, pero también para cálculos de distancia cercana (ver imágenes).

enter link description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X