求解两个联立方程:一个包含 Python 函数

solve two simultaneous equations: one contains a Python function

在下面的地图上,我有两个已知点(A 和 B)及其坐标(经度,纬度)。我需要推导直线上的一个点C的坐标,距离A100公里。

首先我创建了一个函数来计算两点之间的距离(以公里为单位):

# 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 中的 xysympy.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}

你可以直接计算那个点。我们可以 implement a python version of the intermediate calculation for lat long.

请注意,此计算假设地球是一个球体,并考虑了曲线,即这不是欧几里得近似值,就像您原来的 post。

假设我们有两个(lat,long)点 AB;

import numpy as np

A = (52.234869, 4.961132)
B = (46.491267, 26.994655)

EARTH_RADIUS = 6371.009

我们可以通过取 100/distance-between-a-b-in-km

来计算中间点分数 f
from sklearn.neighbors import DistanceMetric
dist = DistanceMetric.get_metric('haversine')

point_1 = np.array([A])
point_2 = np.array([B])

delta = dist.pairwise(np.radians(point_1), np.radians(point_2) )[0][0] 

f = 100 / (delta * EARTH_RADIUS)

phi_1, lambda_1 = np.radians(point_1)[0]
phi_2, lambda_2 = np.radians(point_2)[0]

a = np.sin((1-f) * delta) / np.sin(delta)
b = np.sin( f * delta) / np.sin(delta)

x = a * np.cos(phi_1) * np.cos(lambda_1) + b * np.cos(phi_2) * np.cos(lambda_2)
y = a * np.cos(phi_1) * np.sin(lambda_1) + b * np.cos(phi_2) * np.sin(lambda_2)

z = a * np.sin(phi_1) + b * np.sin(phi_2)
phi_n = np.arctan2(z, np.sqrt(x**2 + y**2) )
lambda_n = np.arctan2(y,x)

C点,从A点到B点,距离A点100公里,比

C = np.degrees( phi_n ), np.degrees(lambda_n)

在这种情况下

(52.02172458025681, 6.384361456573444)