Как показано на рисунке, у меня есть фигурная 3D-линия (line
) и точка (point
).
Я пытаюсь рассчитать расстояние между ними с помощью команды line.distance(point)
. Но я получаю 0.0
в качестве вывода. Он не должен быть равен нулю, как показано на рисунке.
line='LINESTRING Z (7760.332870937675 -2204.1529076701922 13310.4921875, 5275.867565893014 -2204.1529076701922 13421.5302734375)'
point='POINT Z (6677.34068980373 -2204.1529076701922 12820.9072265625)'
Как это решить? Что я здесь делаю неправильно? Помоги пожалуйста.
Shapely — это библиотека двухмерной геометрии. Третье измерение «прикручено болтами», иногда его называют «2,5-мерным». В основном вы можете предположить, что методы работают только во 2-м смысле.
В вашем случае ваша строка состоит всего из 2 точек. Поэтому я дам вам решение, которое работает только для строки длины 2.
import numpy as np
from numpy.linalg import norm
from shapely import LineString, Point
p1 = 7760.332870937675, -2204.1529076701922, 13310.4921875
p2 = 5275.867565893014, -2204.1529076701922, 13421.5302734375
point = 6677.34068980373, -2204.1529076701922, 12820.9072265625
# line = LineString([p1, p2])
p1 = np.array(p1) # or np.array(line.coords[0])
p2 = np.array(p2) # or np.array(line.coords[1])
point = np.array(point)
d = norm(np.cross(p2-p1, p1-point) / norm(p2-p1))
print(d)
Что печатает:
537.4505771322102
это не зависит от CRS. В общем, вы можете предположить, что все, что вы делаете в numpy и shapely, предполагает плоскую поверхность. Например. для стройности см. документы - стройность
Отличается ли эта формула в зависимости от CRS системы координат?