gpt4 book ai didi

java - 垂直点放置

转载 作者:行者123 更新时间:2023-12-02 01:01:15 26 4
gpt4 key购买 nike

我有一条线,它在地球上有起点和终点坐标。
我试图将垂直点放置在距起点 length 距离的每一侧。 enter image description here

本来我以为可以

  • 获取直线的斜率
  • 确定起点处垂线的斜率
  • 求解 x 和 y
Coordinate p1 = Ppoint(start, end, length); 
Coordinate p2 = Ppoint(start, end, -(length));

public static Coordinate Ppoint(Coordinate start, Coordinate end, double length){
double slope = getSlope(start, end);
double pSlope;
if(slope != 0)
{
pSlope = -(1/slope);
}
else
{
pSlope = 0;
}

double b = start.y + (-(pSlope * start.x));

double x = (start.x + length);
double y = (pSlope * x) + b;

Return new Coordinate(x,y);
}

我认为对纬度/经度进行数学计算并考虑其范围
存在问题,并且这并不能解释地球不平坦的情况。
有更好的方法来解决这个问题吗?

最佳答案

您可能不应该尝试在球体上进行此类数学计算(虽然可以使其工作,但它既困难又缓慢)。

假设长度约为数十到数百公里,您应该将问题重新投影到以起点为中心的“平坦”表面,并在平面上使用欧几里得数学。

幸运的是,GeoTools为这个问题提供了方便的自动投影。这里xy是起点的坐标(lon==x,lat==y):

String code = "AUTO:42001," + y + "," + x;
// System.out.println(code);
CoordinateReferenceSystem auto = CRS.decode(code);
// System.out.println(auto);
MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84,
auto);
MathTransform rTransform = CRS.findMathTransform(auto, DefaultGeographicCRS.WGS84);

然后您可以使用 transform 对象将您的点转换为新的投影:

Geometry g3 = JTS.transform(g1, transform);

做任何你需要的数学运算,然后使用rTransform转换回纬度、经度

因此,请根据您的问题进行调整。

Coordinate start = new Coordinate(1.0, 51.0);
Coordinate end = new Coordinate(2.0, 52.0);
double length = 10000;
GeometryFactory gf = new GeometryFactory();

double x = start.getX();
double y = start.getY();
String code;
if(CRS.getAxisOrder(DefaultGeographicCRS.WGS84).equals(AxisOrder.EAST_NORTH)) {
code = "AUTO:42001," + x + "," + y;
} else {
code = "AUTO:42001," + y + "," + x;
}
CoordinateReferenceSystem auto = CRS.decode(code);
MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto);
MathTransform rTransform = CRS.findMathTransform(auto, DefaultGeographicCRS.WGS84);

Point pStart = gf.createPoint(start);
Point pEnd = gf.createPoint(end);

Point ptStart = (Point) JTS.transform(pStart, transform);
Point ptEnd = (Point) JTS.transform(pEnd, transform);

Coordinate p1 = pPoint(ptStart.getCoordinate(), ptEnd.getCoordinate(), length);

Point tPoint = gf.createPoint(p1);
Point p = (Point) JTS.transform(tPoint, rTransform);
System.out.println(p);

这给了我POINT (1.2643 47.6531),这对我来说看起来是错误的!您可能需要检查 pPoint 方法中的数学。

关于java - 垂直点放置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60603769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com