質問

背景:

私はトランスポートルートを操作し、Googleは「図形」を作成するのに十分な時間を離れて配線ポイントを提供します。これらはあなたがGoogleマップで見るバス/列車の経路です。

私の要求:

Googleのポイントは直線を作成するのに十分です。しかし、私は、5メートル、あらゆる点を望んでいます。

問題:

だから、私は2点があると言う[LAT、LONG]:

[ - 33.88242192582]および[-33.8815434600467,151.206556440037]

これらの2つの点を考えると、私はそれらの間の距離を計算することができます。議論のために1kmだと言います。

だから私たちはそれらの2つの点の間に想像上の直線を想像することができます。

あらゆる想像上の行の座標を生成するには、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}"
.

2,000 kmごとにValparaísoから上海へのウェイポイントとGoogle静的マップを生成する:

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

tl; DR:

これは 'Haversine'の式を使って大円を計算します 2点間の距離 - それは上の最短距離 地球の表面 - の間の「カラスのようなハエ」の距離を与える ポイント(もちろん丘を無視してください!)

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 - 緯度と経度

の違いに移動した割合を適用する

始動緯度と最終的な緯度の違いを見つけます。この数字で、それを移動率(10進数として)逓倍します。これは、この点の現在の緯度を見つけるために開始緯度に追加されます。経度を繰り返す。

次の解決策はあなたが要求したものではなく、あなたの目的で十分であるかもしれません...

公式文書(href="https://developers.google.com/maps/documentation/javascript/Reference/Documentation/Javascript/Refering/Documentation/Javascript/Refering/Documentation/Javascript/Reference/Developers.google.com/maps/documentationinterpolateメソッドの/ JavaScript / reference )。docsから: 'Origin Latlngと宛先Latlngの間の方法の特定の割合にあるLATLNGを返します。'

だからあなたがあなたの元のポイントが、100m離れて、分数として0.05を指定したことを知っていれば、その方法は5m毎にそのラインに沿ってLAT / LNGを返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top