Java 垂直点布置

Java 垂直点布置,java,coordinates,latitude-longitude,geo,geotools,Java,Coordinates,Latitude Longitude,Geo,Geotools,我有一条在地球上有起点和终点坐标的线 我试着把垂直点放在起点长度距离的两边。 起初我以为我可以 求直线的斜率 确定起点处垂直线的坡度 求解x和y 我认为在纬度/经度上进行数学运算并计算它们的范围是有问题的,这并不能解释地球不是平的。 有没有更好的办法 地球不是平的吗 好的,有一个网站会比我更好地解释如何使用sphere。您要寻找的是:给定起点、距离和方位的目的地 您也可以将坐标系更改为平面坐标系,这并不丢脸。 地球不是平的吗 好的,有一个网站会比我更好地解释如何使用sphere。您要寻找的

我有一条在地球上有起点和终点坐标的线
我试着把垂直点放在起点长度距离的两边。

起初我以为我可以

  • 求直线的斜率
  • 确定起点处垂直线的坡度
  • 求解x和y
我认为在纬度/经度上进行数学运算并计算它们的范围是有问题的,这并不能解释地球不是平的。
有没有更好的办法

地球不是平的吗

好的,有一个网站会比我更好地解释如何使用sphere。您要寻找的是:给定起点、距离和方位的目的地

您也可以将坐标系更改为平面坐标系,这并不丢脸。 地球不是平的吗

好的,有一个网站会比我更好地解释如何使用sphere。您要寻找的是:给定起点、距离和方位的目的地

您也可以将坐标系更改为平面坐标系,这并不丢脸。

您可能不应该尝试在球体上进行这种数学运算(虽然可以让它工作,但它既难又慢)

假设
长度
约为10-100公里,则应将问题重新投影到以起点为中心的“平面”上,并在平面上使用欧几里德数学

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

然后,可以使用
变换
对象将点转换为新投影:

Geometry g3 = JTS.transform(g1, transform);
做任何你需要的数学运算,然后使用
rttransform

为了适应你的问题

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);

这给了我
点(1.2643 47.6531)
在我看来是错的!您可能需要在
pPoint
方法中检查数学。

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

假设
长度
约为10-100公里,则应将问题重新投影到以起点为中心的“平面”上,并在平面上使用欧几里德数学

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

然后,可以使用
变换
对象将点转换为新投影:

Geometry g3 = JTS.transform(g1, transform);
做任何你需要的数学运算,然后使用
rttransform

为了适应你的问题

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);

这给了我
点(1.2643 47.6531)
在我看来是错的!您可能需要在
pPoint
方法中检查数学。

线条和长度是多少?@IanTurton线条是任意长度。长度只是一个设定的选择值(当时使用的是.005)。线条和长度是多长?@IanTurton线条是任意长度。长度只是一个选择的设定值(使用.005)使用start.x()和start.y()作为x&y。在开始和结束时使用转换,然后在转换的点上调用pSlope方法。感谢您的编辑,您对Ppoint的看法是正确的(它已更新)。坐标正在工作,只需要测试世界各地的一些行:)使用start.x()和start.y()作为x&y。在开始和结束时使用转换,然后在转换的点上调用pSlope方法。感谢您的编辑,您对Ppoint的看法是正确的(它已更新)。坐标正在工作,只需测试世界各地的一些线路:)