현재 위치에서 시작하여 주어진 장소를 향하는 경로로 Google지도를 여는 모든 모바일 장치에 대한 링크를 만드는 방법은 무엇입니까?


88

나는 이것이 찾기가 그렇게 어렵지 않을 것이라고 생각했지만 예상했던 것처럼 멋진 크로스 디바이스 기사를 찾는 것은 쉽지 않습니다.

모바일 장치의 브라우저를 열고 Google지도를 검색하거나지도 앱 (Apple지도 또는 Google지도)을 열고 경로를 직접 시작하는 링크를 만들고 싶습니다. 즉, 현재 위치에서 시작하여 지정된 지점에서 끝납니다 ( 위도 / 경도).

두 기기 (브라우저 스택 옆), Android와 iPhone에서 테스트 할 수 있습니다.

다음 링크는 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 : // 프로토콜을 확인하십시오.

그러한 링크를 만드는 우아한 교차 장치 방법이 있습니까? 모든 주요 모바일에서 작동하는 하나의 링크?

감사

업데이트 : 솔루션을 찾았습니다 (일종).

여기 내가 생각 해낸 것입니다. 작동하지만 내가 상상했던 것과는 다릅니다.

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 : // OR maps.google.com/ 링크를 생성했습니다.

** 업데이트 **

슬프게도, $ .browser.device는 이후 일을하지 않는 JQuery와 1.9 (소스 - http://api.jquery.com/jquery.browser )


1
어떤 서버 측 언어를 사용하십니까? 사용자 에이전트 스니핑으로이 문제를 해결할 수 있습니다.
Uooo

할 수 있다는 것을 알고 있지만 크로스 브라우저를 만들고 싶습니다. 나는 PHP와 JS가
알렉스

@Alex-데스크톱에서 작동하도록 어떻게 번역 하시겠습니까? 따라서 maps.google.comAndroid 및 데스크톱 및 maps:// iOS에서 작동합니다.
kaoscify

@Alex- a(마지막 줄)이 정의되지 않았다는 오류가 계속 발생합니다 . 사용하는 장치에 따라 변경해야하는 infoWindow 내에 URL이 있습니다.
kaoscify

1
플랫폼 (브라우저가 아님)을 감지하는 데 실제로 큰 역할을하지 않은 답변이 없다는 것을 알았 으므로 플랫폼 (예 : 데스크톱, 모바일), 브라우저 및 OS까지 감지하는 jQuery 플러그인 인 PgwBrowser를 찾았 습니다 . 또한 압축 및 gzip으로 압축 된 경우> 2KB입니다. 이를 통해 간단히 os.group switch명령문을 확인하고 그에 따라 브라우저를 라우팅 할 수 있습니다 .
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]");
}

귀하와 Alex Pretzlav 답변은 저에게 가장 효과적이지만 귀하의 답변은 자바 스크립트를 사용할 때 어떻게 보일 수 있는지에 대해 더 자세히 설명합니다. 감사합니다. 내가 최종 솔루션을 제공하기 위해 내 게시물 업데이트됩니다
알렉스

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지도 웹 사이트로 리디렉션되는 반면 maps.google.com/*을 사용하면 기본지도 앱을 선택할 수 있습니다.
James

이 답변 을 사용하여 새 브라우저 페이지 대신 Android에서 사용자 맵 응용 프로그램을 여는 것이 좋습니다 !
PaulCo

23

흥미롭게도 http://maps.apple.com링크는 iOS 기기의 Apple지도에서 직접 열리거나 그렇지 않으면 Google지도로 리디렉션됩니다 (그런 다음 Android 기기에서 차단됨). 두 경우 모두에서 올바른 작업을 수행하는 신중한 URL을 만들 수 있습니다. Apple Maps "URL :

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

또는 Google지도 URL을 직접 ( /mapsURL 구성 요소 없이 ) 사용하여 Android 기기의 Google지도에서 직접 열거 나 iOS 기기의 Google지도 모바일 웹에서 열 수 있습니다.

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


1
그래서 저는 안드로이드 폰을 가지고 구글 크롬 웹 브라우저를 열고 URL을 입력했습니다 http://maps.google.com/. 웹 브라우저의 해당 URL에서이 URL을 열었습니다. Google지도 앱 이 열릴 것으로 예상했습니다 . 당신이 여기에 쓴 것을 내가 오해 했나요, Alex Pretzlav? ;-)
Leo

3
@Leo Android는 브라우저에 직접 입력 할 때와 링크를 클릭 할 때 URL을 다르게 처리합니다. maps.google.com/?daddr=1600+Amphitheatre+Pkwy,+Mountain+View+CA 와 같은 Google지도 URL을 자신에게 이메일로 보낸 다음 이메일 클라이언트에서 탭해보세요.
Alex Pretzlav 2014 년

감사합니다 @AlexPretzlav. 예, 그들은 함께 일하기 위해 거기에서 할 일이 있습니다. 새로운 표준이 있습니까?
Leo

1
내 Android에서 테스트 할 수 있도록 URL로 게시하기 maps.apple.com/?daddr=1600+Amphitheatre+Pkwy,+Mountain+View+CA 위의 URL 은 내 Android의 Google지도 (웹 사이트)로 리디렉션되는 반면 maps.google.com내 안드로이드 폰에서 다양한 길 찾기 앱을 열 수 있습니다.
raphael

15

방금이 질문에 부딪 혔고 여기에서 위의 코드 중 일부를 가져 와서 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 Mobile 8.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

그러나 그것은 단지 사과지도를 엽니 다. 안드로이드 폰이 있다면 그리 멋지지 않습니다.
superluminary

1
@Kristopher-그러면 Google지도 앱이 열립니다?
superluminary

@superluminary 실제로 그것은 이상하게 않습니다.
Kristopher

좌표 대신 주소를 전달하기 위해 이것을 어떻게 사용합니까?
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
그것은 정말 멋진 방법이지만 내가 요청한 것은 아닙니다. 이드는 그냥 앵커 태그를 추가하고 싶을뿐 더 이상은 없습니다. 경로 자체가있는 Google지도를 만들지 않고는 불가능하다면 알아두면 좋습니다. 어쨌든 감사합니다.
Alex

Ok 당신이 해결책을 얻으면 알려주세요
Sudharsun 2013-09-20


2

아니요, iOS 개발자의 경우 iPhone에서지도 앱을 여는 링크가 두 개 있습니다.

iOS 5 이하 : http://maps.apple.com?q=xxxx

iOS 6 이상 : http://maps.google.com?q=xxxx

그리고 그것은 사파리에만 있습니다. Chrome이 Google지도 웹 페이지로 이동합니다.

그 외에는 안드로이드가 그 프로토콜을 알지 못하기 때문에 기본적으로 목적을 능가하는 URL 체계를 사용해야합니다.

Safari가지도 앱을 열고 Chrome이 웹 페이지로 연결되는 이유는 무엇입니까?

음, 사파리는 애플이 만든 브라우저의 빌드이고 위의 URL을 감지 할 수 있기 때문입니다. Chrome은 "그저 또 다른 앱"이며 iOS 생태계를 준수해야합니다. 따라서 다른 앱과 통신하는 유일한 방법은 URL 스키마를 사용하는 것입니다.


3
내가 말했듯이 iOS는 maps : // 프로토콜을 감지하고 Android는 현재 위치를 통해 직접지도를 열지 만 일반적인 Google지도 URL을 사용하므로 귀하가 말한 내용이 옳지 않습니다.
Alex

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
하지만 질문 : 아니 었
알렉스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.