如何生成两个已知点之间的坐标
-
23-12-2019 - |
题
背景:
我正在研究交通路线,Google 提供了足够远的路线点来创建“形状”。这些是您在 Google 地图中看到的巴士/火车路线。
我的要求:
谷歌的点足够远来创建直线。然而我想要每 5 米一个点。
问题:
所以,假设我有两点 [lat,long]:
[-33.8824219918503,151.206686052582]和[-33.8815434600467,151.206556440037]
给定这两点,我可以计算它们之间的距离。为了便于讨论,假设为 1 公里。
所以我们可以想象这两点之间有一条假想的直线。
如何为每 5 米生成该假想线的坐标?
解决方案
目的点给出距离和轴承从起点 应用于您的问题:
class Numeric
def to_rad
self * Math::PI / 180
end
def to_deg
self * 180 / Math::PI
end
end
include Math
R = 6371.0
def waypoint(φ1, λ1, θ, d)
φ2 = asin( sin(φ1) * cos(d/R) + cos(φ1) * sin(d/R) * cos(θ) )
λ2 = λ1 + atan2( sin(θ) * sin(d/R) * cos(φ1), cos(d/R) - sin(φ1) * sin(φ2) )
λ2 = (λ2 + 3 * Math::PI) % (2 * Math::PI) - Math::PI # normalise to -180..+180°
[φ2, λ2]
end
φ1, λ1 = -33.to_rad, -71.6.to_rad # Valparaíso
φ2, λ2 = 31.4.to_rad, 121.8.to_rad # Shanghai
d = R * acos( sin(φ1) * sin(φ2) + cos(φ1) * cos(φ2) * cos(λ2 - λ1) )
θ = atan2( sin(λ2 - λ1) * cos(φ2), cos(φ1) * sin(φ2) - sin(φ1) * cos(φ2) * cos(λ2 - λ1) )
waypoints = (0..d).step(2000).map { |d| waypoint(φ1, λ1, θ, d) }
markers = waypoints.map { |φ, λ| "#{φ.to_deg},#{λ.to_deg}" }.join("|")
puts "http://maps.googleapis.com/maps/api/staticmap?size=640x320&sensor=false&markers=#{markers}"
.
生成Google静态地图链接与Valparaíso每2,000公里的valparaíso到上海的航点:
http://maps.googleapis.com/maps/api/staticmap?size=640x320&sensor=false&markers=-33.0,-71.60000000000002|-32.54414813683714,-93.02142653011552|-28.59922979115139,-113.43958859125276|-21.877555679819015,-131.91586675556778|-13.305784544363858,-148.5297601858932|-3.7370081151180683,-163.94988578467394|6.094273692291354,-179.03345538133888|15.493534924596633,165.33401731030006|23.70233917422386,148.3186618914762|29.83806632244171,129.34766276764626
.
其他提示
第 1 步 - 获取总距离
综合答案可以在这里找到: http://www.movable-type.co.uk/scripts/latlong.html
长话短说:
这使用“ haversine”公式来计算两个点之间的大圆距离(即,在地球表面上的最短距离 - 给出了点之间的``crow fllies''距离(忽略任何山丘,忽略任何山丘,课程!)。
var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad();
var lat1 = lat1.toRad();
var lat2 = lat2.toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var distance = R * c;
第 2 步 - 获取出行百分比。
现在您已经知道了这条直线的距离,然后可以算出每 5 米占总距离的百分比。
步骤 3 - 将行驶百分比应用于纬度和经度之间的差异
找出起始纬度和最终纬度之间的差异。将这个数字乘以行驶的百分比(以小数表示)。然后可以将其添加回起始纬度以找到该点的当前纬度。重复经度。
以下解决方案不是您所要求的,而是足以满足您的目的...
检查官方文档( https://developers.google.com/maps/documentation/ JavaScript / Reference )for interpolate
方法。来自文档:'返回Latlng,它在Latlng和Destination Latlng之间的原点与目的地之间的方式。'