Перпендикулярное расположение точек - PullRequest
0 голосов
/ 09 марта 2020

У меня есть Линия с координатами начала и конца на земле.
Я пытаюсь расположить перпендикулярные точки на каждой стороне начальной точки длина расстояние. enter image description here

Первоначально я думал, что смогу

  • Получить наклон линии
  • Определить наклон для перпендикулярной линии на начальная точка
  • Решите для х и у
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); 
}

Я думаю, что есть проблема с математикой на широте и долготе и учетом их диапазонов
, и это не учитывать, что земля не плоская.
Есть ли лучший способ приблизиться к этому?

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Вы, вероятно, не должны пытаться делать подобные математические операции на сфере (хотя это можно заставить работать, это сложно и медленно).

Предполагая, что length имеет порядок 10 с -100 километров, вы должны перенести вашу проблему на «плоскую» поверхность с центром в начальной точке и использовать евклидову математику на плоскости.

К счастью, GeoTools предоставляет удобные автоматы c проекции только для этой проблемы. Здесь 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.

1 голос
/ 09 марта 2020

Земля не плоская?

Хорошо, есть этот веб-сайт, который лучше меня объяснит, как поступить со сферой. То, что вы ищете, это: Точка назначения с учетом начальной точки, расстояния и направления

Вы также можете изменить свою систему координат на плоскую систему координат, это не стыдно. https://epsg.io/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...