【发布时间】:2022-01-17 09:05:27
【问题描述】:
在下面的地图上,我有两个已知点(A 和 B)及其坐标(经度、纬度)。我需要导出一个点 C 的坐标,该点在线上,距离 A 100 公里。
首先我创建了一个函数来计算两点之间的距离(以公里为单位):
# pip install haversine
from haversine import haversine
def get_distance(lat_from,long_from,lat_to,long_to):
distance_in_km = haversine((lat_from,long_from),
(lat_to, long_to),
unit='km')
return distance_in_km
然后使用斜率和距离,点C的坐标应该是以下方程的解:
# line segment AB and AC share the same slope, so
# (15.6-27.3)/(41.6-34.7) = (y-27.3)/(x-34.7)
# the distance between A and C is 100 km, so
# get_distance(y,x,27.3,34.7) = 100
然后我尝试在 Python 中解决这两个方程:
from sympy import symbols, Eq, solve
slope = (15.6-27.3)/(41.6-34.7)
x, y = symbols('x y')
eq1 = Eq(y-slope*(x-34.7)-27.3)
eq2 = Eq(get_distance(y,x,34.7,27.3)-100)
solve((eq1,eq2), (x, y))
错误是TypeError: can't convert expression to float。我可能理解错误,因为get_distance 函数期望输入为浮点数,而eq2 中的x 和y 是sympy.core.symbol.Symbol。
我尝试添加np.float(x),但同样的错误仍然存在。
有没有办法解决这样的方程?还是您有更好的方法来实现所需的目标?
非常感谢!
# there is a simple example of solving equations:
from sympy import symbols, Eq, solve
x, y = symbols('x y')
eq1 = Eq(2*x-y)
eq2 = Eq(x+2-y)
solve((eq1,eq2), (x, y))
# output: {x: 2, y: 4}
【问题讨论】:
-
我并不感到惊讶。我对
havesine一无所知,但假设它使用某种类型的三角计算,它要么使用math.sin要么使用np.sin。math.sin(x)产生此错误。看到完整的回溯会很有趣,但我认为这不会有帮助。scipy有一些数值求解器可能会更好。 -
数据类型
sympy.core.symbol.Symbol是否包含某种可以从中获取浮点值的字段/属性? -
如果你想要一个符号解决方案,你需要重写你的函数以只使用真正的 sympy 函数。参见例如this post 用于公式,您应该在其中更改所有
sin、cos、asin、sqrt并将弧度转换为等效的弧度。 -
这个是可以计算的,不需要用solver求解。也就是说,如果有解决方案。如果两个点相距小于100KM,则无解
-
stackoverflow.com/questions/38767074/… 是相关的。如果你想要一个 python 示例,请告诉我