我目前正在制作一个带有两个表的模拟数据库模式:Booking
和Waypoint
。
如何在Excel中计算每次行程中不同站点之间的距离(使用lat / lon数据)?
有没有办法在Excel中以编程方式定义它,即可以将公式放入mileage
列(Booking
表),在bookingId
表中查找匹配序列(通过Waypoint
)并返回结果?
例1:
2站的旅程:
1 1 1 MK4 4FL, 2, Levens Hall Drive, Westcroft, Milton Keynes 52.002529 -0.797623
2 1 2 MK2 2RD, 55, Westfield Road, Bletchley, Milton Keynes 51.992571 -0.72753
根据谷歌4.1英里,mileage
表格中的Booking
列中的条目id = 1
例2:
3站的旅程:
6 3 1 MK7 7DT, 2, Spearmint Close, Walnut Tree, Milton Keynes 52.017486 -0.690113
7 3 2 MK18 1JL, H S B C, Market Hill, Buckingham 52.000674 -0.987062
8 3 1 MK17 0FE, 1, Maids Close, Mursley, Milton Keynes 52.040622 -0.759417
根据谷歌27.7英里,在mileage
表格的Booking
列中输入id = 3
直到最近,通过三角测量构建了精确的地图,这实际上是毕达哥拉斯定理的应用。对于任何一对坐标之间的距离,取x坐标差的平方和与y坐标的差的平方之和的平方根。然而,x和y坐标必须处于相同的单位(例如英里),其涉及分析纬度和经度值。这可能很复杂,因为经度的因素取决于纬度(在北极周围行走的距离比在赤道附近行走的要少)但在你的情况下,应该为52o North提供一个因子。由此结果(可能检查here)与您给出的示例大约相差20%(在第二种情况下,配对ID为6和7,并将结果添加到配对ID 7和8的结果)。
如果你想找到两点之间的距离,只需使用这个公式,你将得到Km的结果,如果需要,只需转换为里程。
A点:LAT1,LONG1 B点:LAT2,LONG2
ACOS(COS(RADIANS(90-Lat1))* COS(RADIANS(90-Lat2))+ SIN(RADIANS(90-Lat1))* SIN(RADIANS(90-lat2))* COS(RADIANS(long1-long2) ))* 6371
问候
既然你说准确性并不重要,并且假设距离很小(比如小于1000英里),你可以使用loxodromic距离。
为此,计算出不同(dlat)和经度差(dlon)的差异。如果有任何机会(不太可能)你正在经过180度经线,请采用模数360º以确保经度的差异在-180º和180º之间。还计算平均纬度(alat)。
然后计算:
distance= 60*sqrt(dlat^2 + (dlon*cos(alat))^2)
这个距离是海里。根据需要应用转化。
说明:这利用了这样一个事实,即根据定义,一个海里总是等于一分钟的纬度弧。余弦对应于经线在接近极点时彼此靠近的事实。其余的只是应用毕达哥拉斯定理 - 它要求地球的相关部分是平坦的,这当然只是小距离的良好近似。
这一切都取决于您需要的距离和准确度。基于“地球局部平坦”模型的计算不会为长距离提供很好的结果,但短距离可能没问题。假设地球是完美球体(例如,Haversine公式)的模型不会产生测地线等级结果。有关详细信息,请参阅https://en.wikipedia.org/wiki/Geodesics_on_an_ellipsoid。其中一种高精度(几毫米)解决方案被称为Vincenty的公式。对于我的Excel实现,请在这里查看https://github.com/tdjastrzebski/Vincenty-Excel