2012-10-21 3 views
1

다음 코드는 방문자의 GPS 위치를 감지하고 Google Maps JavaScript v3지도에 표시합니다. 원하는대로 모든 것이 작동하지만 원하는대로 코드를 중앙에 배치하거나 확대하지 않을 수 있습니다 - 아시아의 표준 위치를 사용하면 간단합니다! 마커를지도에 맞추기를 원합니다.화면의 마커에 맞게지도 및 확대/축소

var rendererOptions = { 
    draggable: false 
}; 

if(navigator.geolocation) { 
    var timeoutVal = 10 * 1000 * 1000; 

    navigator.geolocation.watchPosition(
     displayPosition, 
     displayError, 
     { enableHighAccuracy: true, timeout: timeoutVal, maximumAge: 0 } 
    ); 
} else { 
    alert('Din webbläsare stödjer inte någon geologisk lokalisering med hjälp av HTML5'); 
} 

var directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions); 
var directionsService = new google.maps.DirectionsService(); 
var marker_gps; 
var map_gps; 
var options_gps; 





function displayPosition(position) { 


    /*********************** 
    ** GPS-POSITION ** 
    ************************/ 

    directionsDisplay = new google.maps.DirectionsRenderer(); 
    localStorage.coor = position.coords.latitude.toFixed(6) + ',' + position.coords.longitude.toFixed(6); 

    var gps_coor = new google.maps.LatLng(position.coords.latitude.toFixed(6), position.coords.longitude.toFixed(6)); 

    if(typeof(marker) != 'undefined') marker.setMap(null); 

    localStorage.accuracy = position.coords.accuracy; 
    document.getElementById('accuracy').innerHTML = number_format(localStorage.accuracy) + ' meter'; 

    directionsDisplay.setMap(map_gps); 
    directionsDisplay.setPanel(document.getElementById('directions-panel')); 

    marker_gps = new google.maps.Marker({ 
     position: gps_coor, 
     draggable: false, 
     map: map_gps 
    }); 

    var circle_gps = new google.maps.Circle({ 
     center: gps_coor, 
     radius: position.coords.accuracy, 
     map: map_gps, 
     fillColor: '#3333ff', 
     fillOpacity: 0.2, 
     strokeColor: '#3333ff', 
     strokeOpacity: 0.5, 
     strokeWeight: 1 
    }); 



    /***************************** 
    ** FÄRDSÄTT (DISTANS) ** 
    ******************************/ 

    var start = new google.maps.LatLng(position.coords.latitude.toFixed(6), position.coords.longitude.toFixed(6)); 
    var stop = new google.maps.LatLng(<?php echo $photo['coordinates_latitude'].','.$photo['coordinates_longitude']; ?>); 

    var request = { 
     origin: start, 
     destination: stop, 
     travelMode: google.maps.DirectionsTravelMode.DRIVING 
    }; 

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

    directionsService.route(request, function(response, status) { 
     if(status == google.maps.DirectionsStatus.OK) { 
      var distance = (response.routes[0].legs[0].distance.value/1000).toFixed(0); 
      var duration = secondsToString(response.routes[0].legs[0].duration.value); 

      document.getElementById('distance').innerHTML = 'Cirka ' + distance + ' kilometer'; 
      document.getElementById('duration').innerHTML = 'Cirka ' + duration; 

      directionsDisplay.setDirections(response); 
     } 
    }); 


} 



function initialize_gps() { 
    var coor = new google.maps.LatLng(localStorage.coor); 
    var bounds = new google.maps.LatLngBounds(); 

    options_gps = { 
     zoom: 8, 
     mapTypeId: google.maps.MapTypeId.ROADMAP, 
     center: google.maps.LatLng(localStorage.coor), 
     streetViewControl: false 
    } 

    map_gps = new google.maps.Map(document.getElementById('map-distance'), options_gps); 
    map_gps.fitBounds(bounds); 
} 







function secondsToString(seconds) { 
    var numdays = Math.floor(seconds/86400); 
    var numhours = Math.floor((seconds % 86400)/3600); 
    var numminutes = Math.floor(((seconds % 86400) % 3600)/60); 

    return (numdays != 0 ? (numdays == 1 ? '1 dag' : numdays + ' dagar') + ', ' : '') 
     + (numhours != 0 ? (numhours == 1 ? '1 timme' : numhours + ' timmar') + (numdays != 0 ? ', ' : ' och ') : '') 
     + (numminutes != 0 ? (numminutes == 1 ? '1 minut' : numminutes + ' minuter') : ''); 
} 

function displayError(error) { 
    var errors = { 
     1: 'Permission denied', 
     2: 'Position unavailable', 
     3: 'Request timeout' 
    }; 

    alert('Error: ' + errors[error.code]); 
} 

어떻게 작동하나요?

미리 감사드립니다.

EDIT

여기에 initialize_gps 편집 기능의 일부. 이 부분은 효과가 없었습니다. 새로운 일은 없었습니다. 예전처럼 아시아를 중심으로지도를 그립니다.

function initialize_gps() { 
    var coor = new google.maps.LatLng(localStorage.coor); 
    var bounds = new google.maps.LatLngBounds(); 

    options_gps = { 
     zoom: 8, 
     mapTypeId: google.maps.MapTypeId.ROADMAP, 
     center: google.maps.LatLng(localStorage.coor), 
     streetViewControl: false 
    } 

    map_gps = new google.maps.Map(document.getElementById('map-distance'), options_gps); 
    map_gps.fitBounds(bounds); 
} 

편집 나는 jsFiddle에 복사 붙여 넣기 전체 코드가 있습니다. 링크 : http://jsfiddle.net/edgren/WRxt4/

+0

"지도에 마커를 맞추고 싶습니다." 어떤 표식? 당신의 코드에서 볼 수있는 마커는 marker_gps뿐입니다. 경로가 표시되면지도가 중앙에 위치하게되고 반환 된 경로가 확대되어야합니다. – geocodezip

+0

예. 'marker_gps'는 마커를 표시합니다. 예.하지만 경로를 중앙에 배치하지 않고 마커에 맞 춥니 다. 그것이 도움이 필요한 것입니다. 왜 그것이 경로를 중심에 두지 않고 마커를 맞추지 않는 것입니까? – Erik

+0

그러면 게시 한 코드가 사용중인 코드가 아닙니다. 문제가있는 라이브 링크 또는 jsfiddle이 있습니까? – geocodezip

답변

3

마커 세트에지도 표시 피팅에 대한 일반적인 솔루션은, 그 경계를 가지는 map.fitBounds를 호출 (bounds.extend 호출하여) 빈 google.maps.LatLngBounds object에 추가하는 것입니다.

+0

확인. 내 질문의 편집 된 부분을 참조하십시오. 그 편집은 효과가 없었습니다. 아무 일도 없었습니다. – Erik

+0

bounds.extend (google.maps.LatLng)를 사용하여 경계에 마커를 추가하는 것을 보지 못했거나 놓쳤습니까? 길 찾기 서비스는 반환 된 경로를 확대/축소하고지도를 표시해야합니다 (옵션에 preserveViewport : true를 지정하지 않은 경우). – geocodezip

+0

무엇? 이 코드에서 완전히 잃어버린 느낌입니다! 내 문제에 관한 솔루션에서 본 것은 작동하지만 광산이 아닙니다. **주의 **'initialize_gps'에서'streetViewControl'을'false'에서'true'로 변경하면 스트리트 뷰 아이콘이 나타나 코드가 작동합니다. 경로를 중앙에두고 표식을 맞추기를 원하지 않습니다. – Erik