2つの緯度/経度のペアで構成される線と、ポイントの緯度/経度があります。線と地球表面上の点(地球を大球体と見なすことができる)との間の垂直距離、および最小垂直ベクトル(つまり、線上に投影された「クロスポイント」)を調べたいのですが。
私はこれにGeotools 8.0とJTSを使用しようとしています。以下は私のテストコードをキャプチャしました:
//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}));
}
createPoint()および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;
}
ただし、「isOnLine()」の結果はfalseを返します。何か問題があるのかと思っていました。
私の検証方法に何か問題がありますか、または実際に私が垂直距離と地球表面の「クロスポイント」を見つけるために使用した方法が正しくありませんか?
@hepiladron、ご提案ありがとうございます。PrecisionModel.FIXEDを使用して試したが、同じ結果が得られた...
—
xlogger
将来の読者のために-JTSがデカルトフレームワークを想定しており、球形ジオメトリをまったく処理しないため、これはうまくいかない可能性があります。
—
イアンTurton
PrecisionModel.FIXED
か?残りのコードについてはコメントできませんが、倍精度ではエラーが発生する可能性があります。JTS FAQのRobustness&Precisionを参照してください。