実現したいこと
コロナで行くことができない海外に思いを馳せ、欧州の有名な巡礼路をGoogle Maps上で歩く自分用のアプリを作っています。
歩いた距離は、活動量トラッカーFitbitのAPIを使ってタイムリーに取得します。
##これまでできたこと
起点から終点までのルートを取得し、下記のarrでそのルート上の座標配列を取得。隣り合った座標の距離を次々足していき、指定した距離に最近接の座標にマーカーを立てることができました。
javascript
1var arr = response.routes[0].overview_path; 2var between = gMaps.geometry.spherical.computeDistanceBetween; 3var difference = Infinity; 4var total = 0; 5 for (var i = 0, l = arr.length - 1; i < l; i++) { 6 var current = arr[i]; 7 var distance = between(current, arr[i + 1]); 8 var dif = Math.abs(mark - (total + distance)); 9 if (difference > dif) { 10 difference = dif; 11 total += distance; 12 } 13 else { 14 new gMaps.Marker({ 15 position: current, 16 map: map, 17 title: total + 'm' 18 }); 19 break; 20 } 21
##改善したこと、試みたこと
より誤差を小さくするため、ルート上のより多くの座標を取得できないか調べたところ、routesの下の、overview_pathプロパティ以外に、legs > steps > pathと辿って行ったところに、より詳細な座標が格納されていることが分かりました。これをfor文で回して取得し、全てをまとめてwhole_pathという座標配列にして見ました。座標の数(length)をみると、overview_pathの座標の数と比べて7倍くらい多く、精度が高いことが確認できました。
これをもとに、同じように隣り合った座標間の距離を次々足していき、指定した距離に最近接の座標にマーカーを立てようと以下のようなコードにしてみましたが、うまくいきませんでした。
javascript
1var whole_path = []; 2var legs = response.routes[0].legs; 3 for (i = 0; i < legs.length; i++) { 4 var steps = legs[i].steps; 5 for (j = 0; j < steps.length; j++) { 6 var nextSegment = steps[j].path; 7 for (k = 0; k < nextSegment.length; k++) { 8 whole_path.push(nextSegment[k]); 9 } 10 } 11 } 12var between = gMaps.geometry.spherical.computeDistanceBetween; 13var difference = Infinity; 14var total = 0; 15 for (var i = 0, l = whole_path.length - 1; i < l; i++) { 16 var current = whole_path[i]; 17 var distance = between(current, whole_path[i + 1]); 18 var dif = Math.abs(mark - (total + distance)); 19 if (difference > dif) { 20 difference = dif; 21 total += distance; 22 } 23 else { 24 new gMaps.Marker({ 25 position: current, 26 map: map, 27 title: total + 'm' 28 }); 29 break; 30 } 31
途中までは、上と同じようにうまく行っているようなのですが、最後にcurrentの座標を調べてみると、起点と同じ位置から動いていません。
どうしたら良いのか(そもそも、この考え方で良いのかどうか)ご教示頂けると、とてもとてもありがたく思います。どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。