9

背景:

我正在使用运输路线,Google 提供的路线点相距足够远以创建“形状”。这些是您在 Google 地图中看到的公共汽车/火车路线。

我的要求:

谷歌的点足以创建直线。但是,我希望每隔 5 米得到一个点。

问题:

所以,假设我有两点 [lat,long]:

[-33.8824219918503,151.206686052582] 和 [-33.8815434600467,151.206556440037]

鉴于这两点,我可以计算它们之间的距离。为了争论,说它是1公里。

所以我们可以想象在这两点之间有一条假想的直线。

如何为每条假想线生成坐标,例如 5 米?

4

3 回答 3

14

目的地点给定的距离和从起点应用到您的问题的方位角:

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}"

每 2,000 公里生成一个谷歌静态地图链接,其中包含从瓦尔帕莱索到上海的航路点:

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

于 2014-02-27T12:02:16.890 回答
3

第 1 步 - 获取总距离

综合答案可以在这里找到:http ://www.movable-type.co.uk/scripts/latlong.html

TL;博士:

这使用“haversine”公式来计算两点之间的大圆距离 - 即地球表面上的最短距离 - 给出两点之间的“如乌鸦一样”的距离(忽略任何山丘,课程!)。

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 步 - 将旅行百分比应用于纬度和经度之间的差异

找出起始纬度和最终纬度之间的差异。用这个数字,乘以旅行的百分比(作为小数)。然后可以将其添加回起始纬度以找到该点的当前纬度。重复经度。

于 2014-02-27T11:20:52.700 回答
1

以下解决方案不完全符合您的要求,但可能足以满足您的目的......

检查该方法的官方文档(https://developers.google.com/maps/documentation/javascript/referenceinterpolate。来自文档:'返回位于原始 LatLng 和目标 LatLng 之间的给定部分的 LatLng。

因此,如果您知道原始点相距 100m,并且指定 0.05 作为分数,则该方法将沿该线每 5m 返回 lat/lng。

于 2014-02-27T13:57:55.453 回答