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的看法是正确的(它已更新)。坐标正在工作,只需测试世界各地的一些线路:)