Jak stworzyć link dla wszystkich urządzeń mobilnych, który otwiera mapy google z trasą rozpoczynającą się w aktualnej lokalizacji, prowadzącą w dane miejsce?

88

Raczej myślałem, że nie będzie to takie trudne do znalezienia, ale pozornie nie jest łatwo znaleźć niesamowity artykuł na temat różnych urządzeń, tak jak można się spodziewać.

Chcę utworzyć link, który otwiera przeglądarkę urządzenia mobilnego i przegląda mapy google LUB otwiera aplikację map (Apple Maps lub Google Maps) i bezpośrednio rozpoczyna trasę, tj .: zacznij w aktualnej lokalizacji, zakończ w danym punkcie ( lat / long).

Mogę testować na dwóch urządzeniach (poza stosem przeglądarki), Androidem i iPhonie.

Poniższy link działa tylko na Androidzie:

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

Kliknięcie tego linku w przeglądarce Chrome iPhone'a powoduje dziwne otwarcie Map Google w wersji na komputery z reklamami w aplikacji mobilnej ...

Ten działa tylko na iOS, otwierając Apple Maps z prośbą o podanie lokalizacji początkowej (mogę wybrać „Aktualna lokalizacja”) i rozpocząć trasę = pożądane zachowanie. Kliknięcie tego linku całkowicie kończy się niepowodzeniem w systemie Android:

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

Zwróć uwagę na protokół maps: //.

Czy istnieje elegancki sposób tworzenia takiego łącza na różnych urządzeniach? Jedno łącze, które działa na wszystkich głównych telefonach komórkowych?

Dzięki

AKTUALIZACJA: znaleziono rozwiązanie (trochę)

Oto, co wymyśliłem. Nie do końca to sobie wyobrażałem, chociaż działa.

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://protokół jest schemat URL jabłka odwzorowuje aplikację, która będzie tylko rozpocząć pracę na iOS 6 lub wyższym. Istnieją sposoby, aby sprawdzić, czy gmaps jest zainstalowana, a następnie wybrać, co zrobić z adresem URL, ale to było trochę za dużo w stosunku do tego, co zamierzałem. Skończyło się więc na utworzeniu linku maps: // OR maps.google.com/, używając powyższych parametrów.

** AKTUALIZACJA **

niestety, $ .browser.device nie działa od wersji 1.9 jquery (źródło - http://api.jquery.com/jquery.browser )

Alex
źródło
1
Jakiego języka po stronie serwera używasz? Możesz rozwiązać ten problem za pomocą podsłuchiwania klienta użytkownika.
Uooo,
Wiem, że mógłbym, ale chcę zrobić tę przeglądarkę krzyżową. Mam PHP i JS
Alex,
@Alex - Jak przetłumaczyłbyś to do pracy na komputerach stacjonarnych? Więc to maps.google.comdziała na Androidzie i na komputerze stacjonarnym oraz maps:// na iOS.
kaoscify
@Alex - Ciągle otrzymuję błąd informujący, że a(ostatnia linia) jest niezdefiniowana. Mam adres URL w oknie infoWindow i muszę go zmienić w zależności od używanego urządzenia.
kaoscify
1
Okazało się, że żadna z odpowiedzi naprawdę nie wypadła dobrze przy wykrywaniu platformy (nie przeglądarki), więc znalazłem PgwBrowser , wtyczkę jQuery, która wykrywa platformę (np. Komputer stacjonarny, telefon komórkowy), przeglądarkę, a nawet system operacyjny. Po skompresowaniu i spakowaniu gzipem jest również> 2 KB. Dzięki niemu mogę po prostu sprawdzić grupę os.group w switchwyciągu i odpowiednio skierować przeglądarkę.
filoxo

Odpowiedzi:

92

Uhmm, nie pracowałem zbyt wiele z telefonami, więc nie wiem, czy to zadziała, ale z punktu widzenia html / javascript możesz po prostu otworzyć inny adres URL w zależności od urządzenia użytkownika?

<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]");
}
James
źródło
Odpowiedzi Twoje i Alexa Pretzlav są najbliższe, które mi pomogły, ale Twoja idzie bardziej w kierunku tego, jak mogłoby to wyglądać podczas korzystania z javascript, dziękuję. Zaktualizuję swój post, aby zapewnić ostateczne rozwiązanie
Alex,
1
Dużo badałem to około rok temu i mogę powiedzieć, że korzystanie z maps.apple.com/?q=Mexican+Restaurant przekieruje na stronę Google (spróbuj!) I w wyjątkowych przypadkach, gdy jest to urządzenie, które ma aplikacja Apple Maps, zamiast tego otworzy tę aplikację. W przypadku wszystkiego innego otworzy aplikację / stronę Google Maps. bounty pls.
Worthy 7
W szczególności szukasz tego: maps.apple.com/?daddr=San+Francisco&dirflg=d&t=h A dokumentacja jest tutaj: developer.apple.com/library/content/featuredarticles/…
Worthy7
@ Worthy7 najwyraźniej nie testowałem, ale na Androidzie maps.apple.com/* przekieruje do witryny Google Maps, podczas gdy maps.google.com/* pozwoli ci wybrać natywną aplikację map.
James
Gorąco polecam skorzystanie z tej odpowiedzi, aby otworzyć aplikację mapy użytkownika na Androida zamiast nowej strony przeglądarki!
PaulCo
23

Co ciekawe, http://maps.apple.comlinki otwierają się bezpośrednio w Mapach Apple na urządzeniu z iOS lub w inny sposób przekierowują do Map Google (które są następnie przechwytywane na urządzeniu z Androidem), więc możesz stworzyć dokładny adres URL, który zadziała prawidłowo w obu przypadkach, używając znaku „ Apple Maps ”, na przykład:

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

Alternatywnie możesz użyć /mapsadresu URL Map Google bezpośrednio (bez komponentu URL), aby otworzyć bezpośrednio w Mapach Google na urządzeniu z Androidem lub w przeglądarce mobilnej Map Google na urządzeniu z iOS:

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

Alex Pretzlav
źródło
1
Wziąłem więc telefon z Androidem, otworzyłem przeglądarkę internetową Google Chrome i wprowadziłem adres URL http://maps.google.com/. Właśnie otworzył ten adres URL w tym adresie URL w przeglądarce internetowej. Spodziewałem się, że otworzy aplikację Mapy Google . Czy źle zrozumiałem, co tu napisałeś, Alex Pretzlav? ;-)
Leo
3
@Leo Android inaczej obsługuje adresy URL, gdy są wprowadzane bezpośrednio w przeglądarce, niż po kliknięciu łącza. Spróbuj wysłać sobie e-mailem adres URL map Google, na przykład maps.google.com/?daddr=1600+Amphitheatre+Pkwy,+Mountain+View+CA, a następnie dotknij go w swoim kliencie poczty e-mail.
Alex Pretzlav
Dzięki @AlexPretzlav. Tak, mają tam do wykonania jakąś pracę, żeby wszystko połączyć. Czy są jakieś nowe standardy?
Leo
1
Publikowanie tego jako adresu URL, abym mógł przetestować na moim android maps.apple.com/?daddr=1600+Amphitheatre+Pkwy,+Mountain+View+CA Powyższy adres URL przekierowuje do map Google (strony internetowej) na moim Androidzie, podczas gdy maps.google.compozwala mi otwierać wiele różnych aplikacji kierunkowych na moim telefonie z Androidem.
raphael
15

właśnie natknąłem się na to pytanie i znalazłem tutaj wszystkie odpowiedzi. Wziąłem niektóre z powyższych kodów i wykonałem prostą funkcję js, która działa na Androidzie i iPhonie (obsługuje prawie każdy Android i 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>
talsibony
źródło
10

Działa to na wszystkich urządzeniach [iOS, Android i Windows Mobile 8.1].

W żadnym wypadku nie wygląda na najlepszy ... ale nie może być prostszy :)

<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

deepakssn
źródło
Bardzo czysty i łatwy. Testuj na wielu urządzeniach. Działa płynnie! Dziękuję bardzo: D
lzoesch
Ale otwiera tylko mapy Apple. Nie tak fajnie, jeśli masz telefon z Androidem.
superluminary
1
@Kristopher - I otwiera aplikację Mapy Google?
superluminium
@ superluminary rzeczywiście dziwnie to robi.
Kristopher,
Jak użyłbyś tego do przekazania adresu zamiast współrzędnych?
Vincent
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);
   }
 });
 });
 }
Sudharsun
źródło
1
to naprawdę fajny sposób na zrobienie tego, ale nie do końca to, o co prosiłem. id raczej po prostu chcę dodać tag-kotwicy, nic więcej. jeśli nie jest to możliwe bez stworzenia mapy google z samą trasą, dobrze to wiedzieć. mimo wszystko dziękuję, otrzymujesz głos za!
Alex,
Ok, daj mi znać, jeśli znajdziesz rozwiązanie
Sudharsun
2

Cóż, nie, od potencjalnego programisty iOS są dwa linki, o których wiem, że otworzą aplikację Mapy na iPhone'a

W systemie iOS 5 i starszym: http://maps.apple.com?q=xxxx

W iOS 6 i nowszych: http://maps.google.com?q=xxxx

I to tylko w Safari. Chrome przekieruje Cię na stronę internetową Google Maps.

Poza tym musisz użyć schematu adresu URL, który w zasadzie jest lepszy od celu, ponieważ żaden android nie zna tego protokołu.

Możesz chcieć wiedzieć, dlaczego Safari otwiera aplikację Mapy, a Chrome kieruje mnie na stronę internetową?

Cóż, ponieważ safari to wbudowana przeglądarka stworzona przez Apple i może wykryć powyższy adres URL. Chrome to „tylko kolejna aplikacja” i musi być zgodna z ekosystemem iOS. Dlatego jedynym sposobem komunikacji z innymi aplikacjami jest użycie schematów adresów URL.

Segev
źródło
3
Cóż, jak powiedziałem, iOS wykrywa protokół maps: //, a Android otwiera Mapy bezpośrednio przez Bieżącą lokalizację, ale używa wspólnego adresu URL Map Google, więc to, co powiedziałeś, nie jest do końca w porządku ...
Alex
1

W oparciu o dokumentacjęorigin parametr jest opcjonalny i jest domyślnie lokalizacji użytkownika.

... 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....

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

U mnie działa to na komputerach stacjonarnych, iOS i Android.

Koni
źródło
1

Składnia adresu URL jest taka sama, niezależnie od używanej platformy

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

W systemie Android lub iOS adres URL uruchamia Mapy Google w aplikacji Mapy. Jeśli aplikacja Mapy Google nie jest zainstalowana, adres URL uruchamia Mapy Google w przeglądarce i wykonuje żądaną czynność.

Na każdym innym urządzeniu adres URL uruchamia Mapy Google w przeglądarce i wykonuje żądaną czynność.

tutaj jest link do oficjalnej dokumentacji https://developers.google.com/maps/documentation/urls/guide

Akshay Więcej
źródło
0

Odkryłem, że to działa na wszystkich tablicach:

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

W przypadku komputerów stacjonarnych / laptopów użytkownik musi kliknąć opcję Wskazówki dojazdu po załadowaniu mapy, ale z moich testów wszystkie urządzenia mobilne bez problemu załadują ten link w aplikacji Mapy Google.

noakelstein
źródło
1
ale to nie było pytanie :)
Alex