Delphi рассчитать WGS84 пересечение 2 баллов - PullRequest
4 голосов
/ 05 мая 2011

Привет, может кто-нибудь сказать мне или дать несколько советов о том, как мне рассчитать пересечение 2 точек WGS84 с подшипником -

Точка A + Подшипник, Точка B + Подшипник = Точка C (пересечение2 балла)

большое спасибо Колин

Ответы [ 2 ]

4 голосов
/ 05 мая 2011

Я думаю, что ваша проблема в том, "Как я могу вычислить точку пересечения двух линий?" (L1 и L2 ради простоты)

Вы должны получить уравнение линий y = mx + q, которое вычисляет коэффициент m и q для L1 и L2, чтобы получить два уравнения:

y = m1x + q1
y = m2x + q2

пересечение есть решение этой линейной системы

x = (q1 - q2) / (м2 - м1); у = м2 / (м2-м1) * (q1 - q2) + q2
// Пожалуйста, проверьте уравнения, которые я пишу, вычисляя это на лету

Ваши данные - это две точки на эллипсоиде и два угла (опора):

P1 = [x1; у1], подшипник1 = альфа1
Р2 = [х2; у2], подшипник1 = альфа2

Вы должны спроецировать точки на равнине, чтобы использовать вышеуказанную линейную геометрию. Я полагаю, у вас есть очки WGS84: используйте proj4 api.

Так что теперь проблема состоит в том, чтобы получить классическое линейное уравнение из данных. Но мы можем рассматривать строки в полярной интерпретации:

Для точки P0 = [x0, y0] и угла (альфа) линейное уравнение P (t) равно

L (t) = [x0 + cos (альфа) * ​​t, y0 + cos (альфа) * ​​t], где t находится в диапазоне [-inf, + inf]

Итак

L1 (t) = [y1 + cos (alfa1) * t, y1 + cos (alfa1) * t];
L2 (t) = [y2 + cos (alfa2) * t, y2 + cos (alfa2) * t];

Разрешение вышеуказанной системы у нас:

T = (x1- x2) / (cos (alfa2) - cos (alfa1))
X = x1 + cos (alfa1) * T
Y = y1 + sin (alfa1) * T

ваше решение [X, Y].

После этого вам нужно перепроектировать обратно в wgs84

Вы можете попытаться избежать проецирования данных и напрямую использовать координаты wgs84 для p1 и P2; ошибка может быть небольшой, но вы должны проверить.

(Пожалуйста, проверьте это; я написал это в середине сеанса отладки JavaScript :-)

procedure FindIntersection(x1, y2, alfa1, x2, y2, alfa2: double;
  out x, y: double);
var
  t: double;
begin
  t := (x1 - x2) / (cos(alfa2) - cos(alfa1));
  x := x1 + cos(alfa1) * t;
  y := y1 + sin(alfa1) * t;
end; (* Solution without reprojecting *)
0 голосов
/ 05 мая 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...