Làm thế nào để tạo liên kết cho tất cả các thiết bị di động mở google maps với một tuyến đường bắt đầu từ vị trí hiện tại, đến một địa điểm nhất định?


88

Tôi nghĩ rằng điều này sẽ không quá khó để tìm ra nhưng bề ngoài không dễ để tìm thấy một bài báo tuyệt vời về thiết bị chéo, như bạn mong đợi.

Tôi muốn tạo một liên kết mở trình duyệt của thiết bị di động và lướt tới bản đồ google HOẶC mở ứng dụng bản đồ (Apple Maps hoặc Google Maps) và trực tiếp bắt đầu một tuyến đường, tức là: bắt đầu tại vị trí hiện tại, kết thúc tại một điểm nhất định ( vĩ độ / dài).

Tôi có thể thử nghiệm trên hai thiết bị (bên cạnh browserstack), một Android và một iPhone.

Liên kết sau chỉ hoạt động trên Android:

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

Nhấp vào liên kết này trong Chrome của iPhone, điều kỳ lạ này sẽ mở ra Google Maps trong phiên bản máy tính để bàn với quảng cáo trên ứng dụng di động ...

Cái này chỉ hoạt động trên iOS, mở Apple Maps yêu cầu tôi nhập vị trí bắt đầu (tôi có thể chọn "Vị trí hiện tại") và bắt đầu tuyến đường = hành vi mong muốn. Nhấp vào liên kết này hoàn toàn không thành công trên Android:

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

Lưu ý các bản đồ: // giao thức.

Có cách thiết bị chéo thanh lịch nào để tạo liên kết như vậy không? Một liên kết hoạt động trên tất cả các điện thoại di động chính?

Cảm ơn

CẬP NHẬT: Giải pháp được tìm thấy (kinda)

Đây là những gì tôi đã nghĩ ra. Nó không hoàn toàn như những gì tôi tưởng tượng, mặc dù nó đang hoạt động.

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)

các maps://giao thức là giao thức url cho táo bản đồ ứng dụng, mà sẽ chỉ bắt đầu làm việc trên ios 6 hoặc cao hơn. Có nhiều cách để kiểm tra xem gmap có được cài đặt hay không và sau đó chọn những gì sẽ làm với url, nhưng điều đó hơi quá so với những gì tôi dự định. Vì vậy, tôi vừa tạo liên kết maps: // HOẶC maps.google.com/, sử dụng các thông số trên.

** CẬP NHẬT **

thật đáng buồn, $ .browser.device không hoạt động kể từ jquery 1.9 (nguồn - http://api.jquery.com/jquery.browser )


1
Bạn sử dụng ngôn ngữ phía máy chủ nào? Bạn có thể giải quyết vấn đề này bằng cách đánh hơi tác nhân người dùng.
Uooo

Tôi biết rằng tôi có thể, nhưng tôi muốn tạo trình duyệt chéo đó. Tôi có PHP và JS
Alex.

@Alex - Bạn sẽ dịch nó như thế nào để hoạt động trên máy tính để bàn? Vì vậy, nó maps.google.comhoạt động trên Android và Máy tính để bàn và maps:// trên iOS.
kaoscify

@Alex - Tôi tiếp tục gặp lỗi nói rằng a(dòng cuối cùng) là không xác định. Tôi có một URL bên trong một infoWindow mà tôi cần nó thay đổi tùy thuộc vào thiết bị được sử dụng.
kaoscify

1
Tôi thấy rằng không có câu trả lời nào thực sự thành công trong việc phát hiện nền tảng (không phải trình duyệt), vì vậy tôi đã tìm thấy PgwBrowser , một plugin jQuery phát hiện nền tảng (ví dụ: máy tính để bàn, thiết bị di động), trình duyệt và thậm chí cả hệ điều hành. Nó cũng> 2 KB, khi nén và giải nén. Với nó, tôi có thể chỉ cần kiểm tra os.group trong một switchcâu lệnh và định tuyến trình duyệt cho phù hợp.
filoxo

Câu trả lời:


92

Uhmm, tôi chưa làm việc nhiều với điện thoại nên tôi không biết điều này có hiệu quả không nhưng chỉ từ quan điểm html / javascript, bạn có thể mở một url khác tùy thuộc vào thiết bị của người dùng không?

<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]");
}

Câu trả lời của bạn và Alex Pretzlav là câu trả lời gần nhất phù hợp với tôi, nhưng câu trả lời của bạn đi sâu hơn vào hướng nó có thể trông như thế nào khi sử dụng javascript, cảm ơn bạn. tôi sẽ cập nhật bài đăng của mình để đưa ra giải pháp cuối cùng
Alex

1
Tôi đã nghiên cứu điều này rất nhiều khoảng một năm trước và có thể cho bạn biết rằng việc sử dụng maps.apple.com/?q=Mexican+Restaurant sẽ chuyển hướng đến trang google (hãy thử!) Và trong trường hợp ngoại lệ đó là một thiết bị có ứng dụng bản đồ apple, nó sẽ mở ứng dụng đó. Đối với mọi thứ khác, nó sẽ mở ứng dụng / trang google maps. tiền thưởng xin vui lòng.
Worthy7

Cụ thể những gì bạn đang tìm kiếm là cái này: maps.apple.com/?daddr=San+Francisco&dirflg=d&t=h Và tài liệu ở đây: developer.apple.com/library/content/featuredarticles/…
Worthy7

@ Worthy7 rõ ràng là, tôi chưa thử nghiệm, nhưng trên Android, maps.apple.com/* sẽ chuyển hướng đến trang web google maps, trong khi maps.google.com/* sẽ cho phép bạn chọn một ứng dụng bản đồ gốc.
James

Tôi thực sự khuyên bạn nên sử dụng câu trả lời này để mở ứng dụng bản đồ người dùng trên Android thay vì một trang trình duyệt mới!
PaulCo

23

Điều thú vị là http://maps.apple.comcác liên kết sẽ mở trực tiếp trong Apple Maps trên thiết bị iOS hoặc chuyển hướng đến Google Maps nếu không (sau đó sẽ bị chặn trên thiết bị Android), vì vậy bạn có thể tạo một URL cẩn thận sẽ thực hiện đúng trong cả hai trường hợp bằng cách sử dụng " Apple Maps "URL như:

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

Ngoài ra, bạn có thể sử dụng trực tiếp url của Google Maps (không có /mapsthành phần URL) để mở trực tiếp trong Google Maps trên thiết bị Android hoặc mở trong Web di động của Google Maps trên thiết bị iOS:

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


1
Vì vậy, tôi lấy điện thoại Android của mình, mở trình duyệt web Google Chrome và nhập URL http://maps.google.com/. Nó vừa mở URL này trong URL đó trong trình duyệt web. Tôi mong đợi nó sẽ mở ứng dụng Google Maps . Tôi đã hiểu sai những gì bạn viết ở đây, Alex Pretzlav? ;-)
Leo

3
@Leo Android xử lý URL khác khi được nhập trực tiếp vào trình duyệt so với khi nhấp vào liên kết. Hãy thử gửi email cho chính bạn một URL google maps như maps.google.com/?daddr=1600+Amphitheatre+Pkwy,+Mountain+View+CA và sau đó nhấn vào URL đó từ ứng dụng email của bạn.
Alex Pretzlav

Cảm ơn @AlexPretzlav. Có, họ có một số công việc phải làm ở đó để làm cho mọi thứ cùng nhau. Có bất kỳ tiêu chuẩn mới nổi nào không?
Leo

1
Đăng cái này dưới dạng URL để tôi có thể kiểm tra trên bản đồ android maps.apple.com/?daddr=1600+Amphitheatre+Pkwy,+Mountain+View+CA URL ở trên chuyển hướng đến google maps (trang web) trên android của tôi, trong khi maps.google.comcho phép tôi mở một số ứng dụng chỉ đường khác nhau trên điện thoại Android của mình.
raphael

14

chỉ cần gặp câu hỏi này và tìm thấy ở đây tất cả các câu trả lời Tôi đã lấy một số mã ở trên và tạo hàm js đơn giản hoạt động trên Android và iphone (nó hỗ trợ hầu hết mọi Android và iphones).

  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

Điều này phù hợp với tôi trên tất cả các thiết bị [iOS, Android và Window Mobile 8.1].

Không giống như cách tốt nhất bằng bất kỳ phương tiện nào ... nhưng không thể đơn giản hơn :)

<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


Rất sạch sẽ và dễ dàng. Thử nghiệm trên nhiều thiết bị. Hoạt động trơn tru! Cảm ơn bạn rất nhiều: D
lzoesch

Nhưng nó chỉ mở bản đồ táo. Không quá tuyệt nếu bạn có điện thoại Android.
siêu thường

1
@Kristopher - Và nó mở ứng dụng bản đồ Google?
siêu thường

@superluminary thực sự là nó kỳ lạ.
Kristopher

Làm thế nào bạn sẽ sử dụng điều này để chuyển một địa chỉ thay vì tọa độ?
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);
   }
 });
 });
 }

1
đó là một cách thực sự tuyệt vời để làm điều đó, nhưng không hoàn toàn như những gì tôi yêu cầu. id thay vì chỉ muốn thêm một thẻ neo, không có gì hơn. nếu không thể mà không tạo bản đồ google với chính lộ trình, điều đó thật tuyệt khi biết. cảm ơn bạn dù sao, bạn nhận được một ủng hộ!
Alex,

Ok cho tôi biết nếu bạn nhận được một giải pháp
Sudharsun


2

À không, từ một nhà phát triển iOS tiềm năng, có hai liên kết mà tôi biết sẽ mở ứng dụng Bản đồ trên iPhone

Trên iOS 5 trở xuống: http://maps.apple.com?q=xxxx

Trên iOS 6 trở lên: http://maps.google.com?q=xxxx

Và đó chỉ là trên Safari. Chrome sẽ đưa bạn đến trang web Google Maps.

Ngoài ra, bạn sẽ cần sử dụng lược đồ URL về cơ bản đáp ứng được mục đích vì không có android nào biết giao thức đó.

Bạn có thể muốn biết, Tại sao Safari mở ứng dụng Bản đồ và Chrome hướng tôi đến một trang web?

Vì safari là bản dựng trong trình duyệt do apple tạo ra và có thể phát hiện URL ở trên. Chrome "chỉ là một ứng dụng khác" và phải tuân thủ Hệ sinh thái iOS. Vì vậy, cách duy nhất để nó giao tiếp với các ứng dụng khác là sử dụng lược đồ URL.


3
Vâng, như tôi đã nói, iOS phát hiện các bản đồ: // giao thức và Android không mở Maps trực tiếp thông qua vị trí bây giờ nhưng sử dụng một chung URL Google Maps, vì vậy những gì bạn đã nói không phải là hoàn toàn đúng ..
Alex

1

Dựa trên tài liệu , origintham số là tùy chọn và nó được đặt mặc định cho vị trí của người dùng.

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

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

Đối với tôi, điều này hoạt động trên Máy tính để bàn, IOS và Android.


1

Cú pháp URL giống nhau bất kể nền tảng đang sử dụng

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

Trong Android hoặc iOS, URL khởi chạy Google Maps trong ứng dụng Maps, Nếu ứng dụng Google Maps chưa được cài đặt, URL sẽ khởi chạy Google Maps trong trình duyệt và thực hiện hành động được yêu cầu.

Trên bất kỳ thiết bị nào khác, URL khởi chạy Google Maps trong trình duyệt và thực hiện tác vụ được yêu cầu.

đây là liên kết cho tài liệu chính thức https://developers.google.com/maps/documentation/urls/guide


0

Tôi thấy rằng điều này hoạt động trên toàn diện:

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

Đối với máy tính để bàn / máy tính xách tay, người dùng phải nhấp vào Chỉ đường khi bản đồ đó tải, nhưng từ thử nghiệm của tôi, tất cả các thiết bị di động sẽ tải liên kết đó trong ứng dụng Google Maps mà không gặp khó khăn.


1
nhưng đó không phải là câu hỏi :)
Alex
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.