我需要检查一个lat-lon坐标(A
)是否在两个其他lat-lon坐标(B
和C
之间)。但是,A
点不必位于B->C
行
请参阅此图片,其中A
应计为“B
和C
之间:
我该怎么做这个计算?
PS: 这些位置可以转换为SWEREF99TM,这是一个网格系统,如果更适合计算。我已经有了转换的公式。
答案 0 :(得分:4)
假设我们在飞机而不是球体上,即使你提到了弧度/经度......
如果角度∠ABC和角度∠ACB都小于或等于90度,则A在“B”和“C之间”。
当然,我们甚至不需要三角测量来检测这一点;如果PQ ^ 2 + QR ^ 2 <1,则角度∠PQR大于90度。 QR ^ 2
def lies_between(A,B,C):
a = distance(B,C)
b = distance(C,A)
c = distance(A,B)
return a**2 + b**2 >= c**2 and a**2 + c**2 >= b**2
def distance(A,B):
return math.sqrt((A.x - B.x)**2 + (A.y - B.y)**2)
(其中**
是指数运算符。)
答案 1 :(得分:0)
你想要做的是基本上把A投射到BC上。它是不直观但简单的,是点产品最明显的应用。
你可以在这里阅读数学... http://math.oregonstate.edu/home/programs/undergrad/CalculusQuestStudyGuides/vcalc/dotprod/dotprod.html
让dot(x, y)
成为两个元组的点积,vec(x, y)
是从x到y的向量。那么你的答案就是......
// Dot product
dot = lambda d1,d2: sum(a*b for a,b in zip(d1,d2))
// Vector between two points
vec = lambda d1,d2: tuple(b-a for a,b in zip(d1,d2))
BA=vec(b,a)
BC=vec(b,c)
BA_scalar = dot(BA, BC) / dot(BC, BC) # BA * BC / |BC|
# BA_scalar = 0 means A is co-planar with B
# BA_scalar = 1 means A is co-planar with C
is_between = 0 < BA_scalar and BA_scalar < 1
这适用于3d和2d坐标。它在3d中导致有趣的结果,例如,所有赤道点位于10°N,0°和10°S,0°之间,包括在地球的另一端的那些。但这并不一定是错的。