Tôi có một dòng được hình thành bởi 2 cặp lat / lon và lat / lon của một điểm. Tôi muốn tìm ra khoảng cách vuông góc giữa đường thẳng và điểm trên bề mặt Trái đất (có thể giả sử Trái đất là hình cầu lớn) và vectơ vuông góc tối thiểu (nghĩa là "điểm chéo" được chiếu trên đường thẳng).
Tôi đang cố gắng sử dụng Geotools 8.0 và JTS cho việc này. Dưới đây đã bắt được mã thử nghiệm của tôi:
//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}));
}
các phương thức createPoint () và createdLine ():
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;
}
Tuy nhiên, kết quả của "isOnLine ()" trả về sai. Tôi đã tự hỏi nếu có bất cứ điều gì sai.
Có điều gì đó không đúng với phương pháp xác minh của tôi, hoặc thực tế là cách tôi đã sử dụng để tìm ra khoảng cách vuông góc và "điểm chéo" trên bề mặt Trái đất là không chính xác?
PrecisionModel.FIXED
? Tôi không thể nhận xét về phần còn lại của mã của bạn, nhưng độ chính xác kép có thể gây ra lỗi. Xem Độ mạnh & Chính xác trong Câu hỏi thường gặp của JTS.