重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

JavaScriptでGPSを起動させて現在地を表示することはできるのですが、
その後、一定時間ごとに現在地を観測して
その移動距離を求める方法が分かりません。

方法が分かる方、もしくは専門知識のあるかた
ご意見お願いします。

サンプルコードなどがあるとより助かります。

A 回答 (2件)

ANo1です。


反応がないのでわからないのですが、回転楕円体として扱う場合について少し調べてみました。
とは言ってもググってみただけですが・・・

誤解していたのは、緯度は地表に対する法線角度なので地球の中心との角度ではない(中心からの角度と思っていました)とのこと。
もちろん中心からの角度に換算する方法もあるようですが・・・
https://ja.wikipedia.org/wiki/%E7%B7%AF%E5%BA%A6 …

地表での距離計算の方法なども調べれば式があるようですね。
https://ja.wikipedia.org/wiki/%E5%AD%90%E5%8D%88 …
ただし複雑すぎるので私には無理。(汗)

それなら、私にも扱える方法として、地球を真球として計算したらどうなるかを考えてみました。
ANo1で三平方の定理での計算を考えましたが、これだと極地周辺での誤差が大きくなってしまうので、経緯度から直接に立体座標へ変換して、2点間の直線距離を求める方法のほうが誤差が出にくく良さそうに思われます。
この距離をそのまま利用しても良いのですが、距離が長い場合は地表面(弧長)と求めた距離(弦長)の差を無視できない可能性があるので、弦長から弧長(=地表での距離)への換算はしておいた方が良さそうに思います。

経緯度からの座標変換は、真球を仮定した場合は簡単で、
 x = r・cosψ・cosλ、y = r・cosψ・sinλ、z = r・sinψ
となるので、距離(弦長)も簡単に求めることができます。
これから半径rの円弧長に換算してあげればよいですね。

一方、ANo1にも紹介しましたgoogle mapの距離計算の説明を見てみると、『The default radius is Earth's radius of 6378137 meters.』との表記があるので、もしかするとこちらも真球として計算しているのかもしれません。
https://developers.google.com/maps/documentation …

ということで、上記の計算をoriginalDistance()、googleの計算をgoogleDistance()として、その差を比較してみました。
簡単なテスト方法として、緯度10度おきに、経線に沿って経度1度分の距離および緯度+1度、経度+1度のポイントまでの斜め(?)の距離を求め、それぞれの差分を求めてみました。(単位メートル)
 var lat, d1, d2, p1, p2, p3;
 for(lat = 0; lat<90; lat += 10){
  p1 = new google.maps.LatLng( lat, 0 );
  p2 = new google.maps.LatLng( lat, 1 );
  p3 = new google.maps.LatLng( lat + 1, 1 );

  d1 = originalDistance(p1, p2) - googleDistance(p1, p2);
  d2 = originalDistance(p1, p3) - googleDistance(p1, p3);

  console.log("[ 緯度 " + lat + "度 ]");
  console.log("  (" + lat + ", 0)-(" + lat + ", 1) : " + d1);
  console.log("  (" + lat + ", 0)-(" + (lat+1) + ", 1) : " + d2);
 }

<結果>
[ 緯度 0度 ]
     (0, 0)-(0, 1) : 0
     (0, 0)-(1, 1) : 0
[ 緯度 10度 ]
     (10, 0)-(10, 1) : 0
     (10, 0)-(11, 1) : 0
[ 緯度 20度 ]
     (20, 0)-(20, 1) : -1.4551915228366852e-11
     (20, 0)-(21, 1) : -5.820766091346741e-11
[ 緯度 30度 ]
     (30, 0)-(30, 1) : 0
     (30, 0)-(31, 1) : -2.9103830456733704e-11
[ 緯度 40度 ]
     (40, 0)-(40, 1) : 0
     (40, 0)-(41, 1) : 4.656612873077393e-10
[ 緯度 50度 ]
     (50, 0)-(50, 1) : -1.4551915228366852e-11
     (50, 0)-(51, 1) : 6.402842700481415e-10
[ 緯度 60度 ]
     (60, 0)-(60, 1) : 0
     (60, 0)-(61, 1) : -8.731149137020111e-11
[ 緯度 70度 ]
     (70, 0)-(70, 1) : -7.275957614183426e-12
     (70, 0)-(71, 1) : -1.3096723705530167e-10
[ 緯度 80度 ]
     (80, 0)-(80, 1) : -3.637978807091713e-12
     (80, 0)-(81, 1) : -1.0186340659856796e-10

概ね差分が5E-10メートル以下となっていますので、近似計算の誤差から見れば無いくらいの差と考えられます。
これから、同じ考え方に基づいて計算しているものと推測しました。
(差分が出ているのは、計算手順などによる誤差ではないかと思います)
ということで、真球で近似する場合であれば、直接計算したとしても大した手間ではなさそうですね。


さて、一旦諦めた楕円体での計算ですが、再度調べてみると、立体座標への変換式などもいろいろ考えられているようでした。
(国土地理院のサイトにもありました)
http://vldb.gsi.go.jp/sokuchi/surveycalc/surveyc …
http://catalog.lib.kyushu-u.ac.jp/handle/2324/17 …
http://d.hatena.ne.jp/meronpan2007/20090506

私には読み解くのは無理っぽいですが、質問者様にその方面の素養があれば楕円体近似での計算にもトライなさってみるのもよろしいかと思います。
ついでですが、地理座標系も何種類かのものが用いられているようなので、場合によっては測地系間の換算が必要なケースがでてくるかも知れません。
https://ja.wikipedia.org/wiki/%E6%B8%AC%E5%9C%B0 …
    • good
    • 0

こんにちは



javascriptということは、ブラウザベースと考えて良いのでしょうか?

Geolocationはよく知りませんけれど、APIのスペックを見てみると連続取得用のメソッドも用意されているようです。
https://www.w3.org/TR/geolocation-API/#api_descr …

以下は未検証ですが、方法として考えられるのは、
1)一定時間(setIntervalなど)毎にgetCurrentPosition()で位置情報を取得する
2)watchPosition()で位置情報を監視し、一定時間毎に記録する
などの方法により、一定時間ごとの位置座標を得ることが可能なはずです。

2点の座標(経度、緯度)が得られれば、地表面での距離計算を行えば良いので、経度差、緯度差から距離を求め三平方の定理で、2点間の距離とするなどでよろしいのではないでしょうか?
計算の際に、地球を真球で近似するか回転楕円体で近似するかで計算方法や誤差が違ってきます。
https://ja.wikipedia.org/wiki/%E5%9C%B0%E7%90%83 …

もしも、位置情報などをgoogle mapなどで表示なさっていらっしゃるのであれば、確か、map APIには地点情報から距離や面積を計算してくれるクラスがあったと記憶していますので、それを利用なさるのが一番簡単だと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!