現在の場所から始まり、特定の場所に向かうルートでGoogleマップを開くすべてのモバイルデバイスのリンクを作成するにはどうすればよいですか?


88

私はむしろこれを見つけるのはそれほど難しいことではないと思いましたが、あなたが期待するように、素晴らしいクロスデバイスの記事を見つけるのは簡単ではないようです。

モバイルデバイスのブラウザを開いてGoogleマップに移動するか、マップアプリ(AppleMapsまたはGoogleMaps)を開いてルートを直接開始するリンクを作成したい。つまり、現在の場所から開始し、特定のポイントで終了する(緯度/経度)。

AndroidとiPhoneの2つのデバイス(browserstack以外)でテストできます。

次のリンクはAndroidでのみ機能します。

<a href="http://maps.google.com/maps?daddr=lat,long&amp;ll=">Take me there!</a>

iPhoneのChromeでこのリンクをクリックすると、モバイルアプリに広告が表示されたデスクトップバージョンのGoogleマップが奇妙に開きます...

これはiOSでのみ機能し、Apple Mapsを開いて、開始場所を入力するように求められ(「現在の場所」を選択できます)、ルートを開始します=目的の動作。このリンクをクリックすると、Androidでは完全に失敗します。

<a href="maps://maps.google.com/maps?daddr=lat,long&amp;ll=">Take me there!</a>

maps://プロトコルに注意してください。

そのようなリンクを作成するエレガントなクロスデバイスの方法はありますか?すべての主要な携帯電話で機能する1つのリンク?

ありがとう

更新:解決策が見つかりました(ちょっと)

これが私が思いついたものです。それは機能していますが、私が想像したものとはまったく異なります。

var ua = navigator.userAgent.toLowerCase(),
    plat = navigator.platform,
    protocol = '',
    a,
    href;

$.browser.device = ua.match(/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera/i) ? ua.match(/android|webos|iphone|ipad|ipod|blackberry|iemobile|opera/i)[0] : false;


if ($.browser.device) {
    switch($.browser.device) {
        case 'iphone':
        case 'ipad':
        case 'ipod':
            function iOSversion() {
              if (/iP(hone|od|ad)/.test(navigator.platform)) {
                // supports iOS 2.0 and later: <http://bit. ly/TJjs1V>
                var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
                return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
              }
            }

            var ver = iOSversion() || [0];

            if (ver[0] >= 6) {
              protocol = 'maps://';
            }
            else {
                protocol = 'http://maps.google.com/maps';
            }
        break;

        case 'android':
        default:
            protocol = 'http://maps.google.com/maps';
        break;
    }

a.attr('href', protocol + href)

maps://プロトコルは、リンゴのURLスキームのみ、IOS 6以上で作業を開始しますアプリを、マッピングしています。gmapsがインストールされているかどうかをテストしてから、URLをどう処理するかを選択する方法はいくつかありますが、それは私が意図したものには多すぎました。したがって、上記のパラメータを使用して、maps:// ORmaps.google.com/リンクを作成することになりました。

**更新**

悲しいことに、$ .browser.device jqueryの1.9以降は動作しません(ソース- http://api.jquery.com/jquery.browser


1
どのサーバーサイド言語を使用していますか?この問題は、ユーザーエージェントスニッフィングで解決できます。
uooo 2013

できることはわかっていますが、クロスブラウザを作りたいと思っています。私はPHPとJSを持っています
Alex

@ Alex-これをデスクトップで機能するようにどのように翻訳しますか?つまり、maps.google.comAndroidとデスクトップ、そしてmaps:// iOSで機能します。
kaoscify 2015

@ Alex- a(最後の行)が未定義であるというエラーが表示され続けます。infoWindow内にURLがあり、使用するデバイスに応じて変更する必要があります。
kaoscify 2015

1
プラットフォーム(ブラウザーではなく)を検出するのに実際に優れた仕事をした答えはなかったので、プラットフォーム(デスクトップ、モバイルなど)、ブラウザー、さらにはOSを検出するjQueryプラグインであるPgwBrowserを見つけました。また、圧縮してgzip圧縮すると、2KBを超えます。これを使用すると、switchステートメントでos.groupを確認し、それに応じてブラウザーをルーティングできます。
filoxo 2015

回答:


92

うーん、私は電話であまり仕事をしていないので、これがうまくいくかどうかはわかりませんが、html / javascriptの観点から、ユーザーのデバイスに応じて別のURLを開くことができますか?

<a style="cursor: pointer;" onclick="myNavFunc()">Take me there!</a>

function myNavFunc(){
    // If it's an iPhone..
    if( (navigator.platform.indexOf("iPhone") != -1) 
        || (navigator.platform.indexOf("iPod") != -1)
        || (navigator.platform.indexOf("iPad") != -1))
         window.open("maps://www.google.com/maps/dir/?api=1&travelmode=driving&layer=traffic&destination=[YOUR_LAT],[YOUR_LNG]");
    else
         window.open("https://www.google.com/maps/dir/?api=1&travelmode=driving&layer=traffic&destination=[YOUR_LAT],[YOUR_LNG]");
}

あなたとAlexPretzlavの答えは私にとって最も近いものですが、あなたの答えは、JavaScriptを使用したときにどのように見えるかという方向に進んでいます。ありがとうございます。最終的な解決策を提供するために投稿を更新します
Alex

1
私はこれを約1年前によく調べましたが、maps.apple.com /?q = Mexican + Restaurantを使用すると、Googleページにリダイレクトされる(試してみてください!)ことがわかります。アップルマップアプリは、代わりにそのアプリを開きます。他のすべてのためにそれはグーグルマップアプリ/ページを開きます。報奨金pls。
Worthy7 2016年

具体的にどのようなあなたが探していることはこれです:maps.apple.com/?daddr=San+Francisco&dirflg=d&t=h とドキュメントはこちらです:developer.apple.com/library/content/featuredarticles/...
Worthy7

@ Worthy7どうやら、私はテストしていませんが、Androidではmaps.apple.com/ *がGoogleマップのWebサイトにリダイレクトされますが、maps.google.com / *ではネイティブマップアプリを選択できます。
ジェームズ

新しいブラウザページではなく、この回答を使用してAndroidでユーザーマップアプリケーションを開くことを強くお勧めします。
PaulCo 2018年

23

興味深いことに、http://maps.apple.comリンクはiOSデバイスのApple Mapsで直接開くか、そうでない場合はGoogle Mapsにリダイレクトされます(Androidデバイスでは傍受されます)。そのため、「 Apple Maps "URL like:

http://maps.apple.com/?daddr=1600+Amphitheatre+Pkwy,+Mountain+View+CA

または、GoogleマップのURLを直接(/mapsURLコンポーネントなしで)使用して、AndroidデバイスのGoogleマップで直接開くか、iOSデバイスのGoogleマップのモバイルWebで開くことができます。

http://maps.google.com/?daddr=1+Infinite+Loop,+Cupertino+CA


1
そこで、Androidスマートフォンを持って、Google Chrome Webブラウザーを開き、URLを入力しましたhttp://maps.google.com/。WebブラウザのそのURLでこのURLを開いたところです。グーグルマップアプリが開くと思っていました。アレックス・プレツラフ、あなたがここに書いたことを私は誤解しましたか?;-)
レオ

3
@Leo Androidは、ブラウザに直接入力した場合とリンクをクリックした場合で、URLの処理方法が異なります。maps.google.com/?daddr=1600+Amphitheatre+Pkwy,+Mountain+View+CAのようなグーグルマップのURLを自分宛てにメールで送信し、メールクライアントからタップしてみてください。
Alex Pretzlav 2014

@AlexPretzlavに感謝します。はい、彼らは物事をまとめるためにそこでやるべき仕事があります。新たな基準はありますか?
レオ

1
これをURLとして投稿して、Androidでテストできる ようにしますmaps.apple.com/?daddr=1600+Amphitheatre+Pkwy,+Mountain+View+CA上記のURLは、AndroidのGoogleマップ(Webサイト)にリダイレクトされますが、maps.google.com私のAndroid携帯電話でさまざまな方向のアプリを開くことができます。
ラファエル2016年

14

この質問にぶつかって、ここですべての答えを見つけました。上記のコードのいくつかを取り、AndroidとiPhoneで動作する単純なjs関数を作成しました(ほぼすべてのAndroidとiPhoneをサポートしています)。

  function navigate(lat, lng) {
    // If it's an iPhone..
    if ((navigator.platform.indexOf("iPhone") !== -1) || (navigator.platform.indexOf("iPod") !== -1)) {
      function iOSversion() {
        if (/iP(hone|od|ad)/.test(navigator.platform)) {
          // supports iOS 2.0 and later
          var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/);
          return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)];
        }
      }
      var ver = iOSversion() || [0];

      var protocol = 'http://';
      if (ver[0] >= 6) {
        protocol = 'maps://';
      }
      window.location = protocol + 'maps.apple.com/maps?daddr=' + lat + ',' + lng + '&amp;ll=';
    }
    else {
      window.open('http://maps.google.com?daddr=' + lat + ',' + lng + '&amp;ll=');
    }
  }

html:

 <a onclick="navigate(31.046051,34.85161199999993)" >Israel</a>

10

これは、すべてのデバイス[iOS、Android、およびWindow Mobile8.1]で機能します。

決して最善の方法のようには見えません...しかし、これ以上簡単にすることはできません:)

<a href="bingmaps:?cp=18.551464~73.951399">
 <a href="http://maps.apple.com/maps?q=18.551464, 73.951399"> 
   Open Maps
 </a>
</a>

http://jsbin.com/dibeq


とても清潔で簡単です。複数のデバイスでテストします。スムーズに動作します!どうもありがとうございました:D
lzoesch 2016

しかし、それはアップルマップを開くだけです。あなたがAndroid携帯を持っているならそれほどクールではありません。
超高輝度2016

1
@ Kristopher-そしてそれはGoogleマップアプリを開きますか?
超高輝度2016年

@superluminary確かにそれは奇妙なことになります。
クリストファー2016年

これを使用して、座標の代わりに住所を渡すにはどうすればよいですか?
ヴィンセント

6
if (navigator.geolocation) { //Checks if browser supports geolocation
navigator.geolocation.getCurrentPosition(function (position) {                                                                                            
 var latitude = position.coords.latitude;                    //users current
 var longitude = position.coords.longitude;                 //location
 var coords = new google.maps.LatLng(latitude, longitude); //Creates variable for map coordinates
 var directionsService = new google.maps.DirectionsService();
 var directionsDisplay = new google.maps.DirectionsRenderer();
 var mapOptions = //Sets map options
 {
   zoom: 15,  //Sets zoom level (0-21)
   center: coords, //zoom in on users location
   mapTypeControl: true, //allows you to select map type eg. map or satellite
   navigationControlOptions:
   {
     style: google.maps.NavigationControlStyle.SMALL //sets map controls size eg. zoom
   },
   mapTypeId: google.maps.MapTypeId.ROADMAP //sets type of map Options:ROADMAP, SATELLITE, HYBRID, TERRIAN
 };
 map = new google.maps.Map( /*creates Map variable*/ document.getElementById("map"),    mapOptions /*Creates a new map using the passed optional parameters in the mapOptions parameter.*/);
 directionsDisplay.setMap(map);
 directionsDisplay.setPanel(document.getElementById('panel'));
 var request = {
   origin: coords,
   destination: 'BT42 1FL',
   travelMode: google.maps.DirectionsTravelMode.DRIVING
 };

 directionsService.route(request, function (response, status) {
   if (status == google.maps.DirectionsStatus.OK) {
     directionsDisplay.setDirections(response);
   }
 });
 });
 }

1
それは本当にクールな方法ですが、私が求めていたものではありません。idは、アンカータグを追加したいだけで、それ以上のものはありません。ルート自体でグーグルマップを作成せずにそれが不可能な場合は、それを知っておくといいでしょう。とにかくありがとう、あなたは賛成票を獲得します!
アレックス

解決策があれば教えてください
Sudharsun 2013


2

いいえ、iOS開発者の見通しからすると、iPhoneでマップアプリを開くことがわかっているリンクが2つあります。

iOS 5以下の場合: http://maps.apple.com?q=xxxx

iOS 6以降の場合: http://maps.google.com?q=xxxx

そしてそれはSafariだけです。ChromeはGoogleマップのウェブページに移動します。

それ以外は、Androidがそのプロトコルを知らないため、基本的に目的を超えるURLスキームを使用する必要があります。

Safariがマップアプリを開き、ChromeがWebページに移動する理由を知りたいと思うかもしれません。

さて、サファリはアップル製の組み込みブラウザであり、上記のURLを検出できるためです。Chromeは「単なる別のアプリ」であり、iOSエコシステムに準拠する必要があります。そのため、他のアプリと通信する唯一の方法は、URLスキームを使用することです。


3
私が言ったようにまあ、iOSのは、マップを検出://プロトコルと現在の地域を経由して直接のAndroidんオープン地図が、共通のGoogleマップのURLを使用するには、そうあなたが言ったことは非常に適切ではありません...
アレックス・

1

基づいて文書originのパラメータはオプションで、ユーザの位置がデフォルト。

... Defaults to most relevant starting location, such as user location, if available. If none, the resulting map may provide a blank form to allow a user to enter the origin....

例: https://www.google.com/maps/dir/?api=1&destination=Pike+Place+Market+Seattle+WA&travelmode=bicycling

私にとって、これはデスクトップ、IOS、Androidで動作します。


1

URL構文は、使用しているプラ​​ットフォームに関係なく同じです

String url = "https://www.google.com/maps/search/?api=1&query=" + latitude + ","+ 
longitude;

AndroidまたはiOSでは、URLはマップアプリでGoogleマップを起動します。Googleマップアプリがインストールされていない場合、URLはブラウザでGoogleマップを起動し、要求されたアクションを実行します。

その他のデバイスでは、URLはブラウザでGoogleマップを起動し、要求されたアクションを実行します。

こちらが公式ドキュメントへのリンクです https://developers.google.com/maps/documentation/urls/guide


0

私はこれが全面的に機能することを発見しました:

<a href="https://www.google.com/maps/place/1+Fake+Street,+City+Province/State>Get Directions</a>

デスクトップ/ラップトップの場合、ユーザーはその地図が読み込まれるときに[ルート案内]をクリックする必要がありますが、私のテストでは、すべてのモバイルデバイスがそのリンクをGoogleマップアプリに問題なく読み込むことができます。


1
しかし、それは問題ではありませんでした:)
Alex
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.