垂直点放置
Perpendicular Point Placement
我有一条直线,它在地球上有起点和终点坐标。
我试图在起点的每一侧放置垂直点 length 距离。
本来以为可以
- 获取直线的斜率
- 确定起点处垂线的斜率
- 求解 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);
}
我认为在 lat/lon 上进行数学运算并考虑它们的范围
存在问题,这并不能说明地球不是平坦的。
有没有更好的方法来解决这个问题?
地球不是平的?
好的,this 网站会比我更好地解释如何处理球体。您正在寻找的是:给定起点、距离和方位的目的地点
你也可以把你的坐标系换成平面坐标系,不丢人。
https://epsg.io/
您可能不应该尝试在球体上进行此类数学运算(虽然它可以工作,但既困难又缓慢)。
假设 length
大约为 10s-100s 公里,您应该将问题重新投影到以起点为中心的 "flat" 表面,并在平面上使用欧几里德数学。
幸运的是,GeoTools 为这个问题提供了方便的自动预测。这里x
&y
是起点坐标(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
方法中的数学。
我有一条直线,它在地球上有起点和终点坐标。
我试图在起点的每一侧放置垂直点 length 距离。
本来以为可以
- 获取直线的斜率
- 确定起点处垂线的斜率
- 求解 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);
}
我认为在 lat/lon 上进行数学运算并考虑它们的范围
存在问题,这并不能说明地球不是平坦的。
有没有更好的方法来解决这个问题?
地球不是平的?
好的,this 网站会比我更好地解释如何处理球体。您正在寻找的是:给定起点、距离和方位的目的地点
你也可以把你的坐标系换成平面坐标系,不丢人。 https://epsg.io/
您可能不应该尝试在球体上进行此类数学运算(虽然它可以工作,但既困难又缓慢)。
假设 length
大约为 10s-100s 公里,您应该将问题重新投影到以起点为中心的 "flat" 表面,并在平面上使用欧几里德数学。
幸运的是,GeoTools 为这个问题提供了方便的自动预测。这里x
&y
是起点坐标(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
方法中的数学。