Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Po stronie przeglądarki _ Zwrócenie wartości z funkcji

Napisany przez: john_doe 23.05.2020, 08:19:13

Hej, uzywam google do wyznaczenia odleglosci.

  1.  
  2. function calculateDistance(origin, destination) {
  3. var service = new google.maps.DistanceMatrixService();
  4. service.getDistanceMatrix(
  5. {
  6. origins: [origin],
  7. destinations: [destination],
  8. travelMode: google.maps.TravelMode.DRIVING,
  9. unitSystem: google.maps.UnitSystem.METRIC,
  10. avoidHighways: false,
  11. avoidTolls: false
  12. }, callback
  13. );
  14. }
  15.  
  16. function callback(response, status) {
  17. if (status != google.maps.DistanceMatrixStatus.OK) {
  18. console.log(err);
  19. } else {
  20. var origin = response.originAddresses[0];
  21. var destination = response.destinationAddresses[0];
  22. if (response.rows[0].elements[0].status === "ZERO_RESULTS") {
  23. console.log("nie ma drog pomiedzy"
  24. + origin + " and " + destination);
  25. } else {
  26. var distance = response.rows[0].elements[0].distance;
  27. var distance_value = distance.value; // w metrach
  28. var distance_text = distance.text; // np. 2,4 km
  29. var distanceKm = distance_text.substring(0, distance_text.length - 3);
  30. console.log("Odległość: " + distance_text + " lub " + distance_value/1000 + " lub " + distanceKm);
  31. }
  32. }
  33. }
  34.  


Chcialbym z tego zwrocic po prostu wartosc dystansu i uzyc go gdzies indziej.
Call do google jest asynchroniczny, probowalem przypisywac wynik do zmiennej globalnej bez skutku...

Napisany przez: viking 23.05.2020, 08:41:09

Poczytaj o await i promise.

Napisany przez: miccom 23.05.2020, 09:09:14

Ja u mnie wykorzystuję taki kod, wywołuję tak:

  1. <http://december.com/html/4/element/div.html id="inputs">
  2. <http://december.com/html/4/element/form.html action="" onsubmit="initMap(); return false;">
  3. <http://december.com/html/4/element/input.html type="text" id="adres" placeholder="( np. warszawa, puławska 19 ) "/><http://december.com/html/4/element/br.html>
  4. <http://december.com/html/4/element/input.html type="submit" value="Oblicz odległosć" /> <http://december.com/html/4/element/br.html><http://december.com/html/4/element/br.html>
  5. </http://december.com/html/4/element/form.html>
  6. </http://december.com/html/4/element/div.html>
  7. <http://december.com/html/4/element/div.html id="output"></http://december.com/html/4/element/div.html>
  8. </http://december.com/html/4/element/div.html>
  9. <http://december.com/html/4/element/div.html id="map"></http://december.com/html/4/element/div.html>
  10. <http://december.com/html/4/element/script.html>
  11. function initMap() {
  12. var bounds = new google.maps.LatLngBounds;
  13. var markersArray = [];
  14. var origin = 'Główna 31, Tychy';// tutaj musisz podać swój adres jeśli potrzebujesz do wyświetlenia
  15. if(document.getElementById("adres").value == ''){
  16. var destination = 'Główna 31, Tychy';
  17. alert('musisz podać adres docelowy');
  18. exit();
  19. }else{
  20. var destination = document.getElementById("adres").value;
  21. };
  22. var destinationIcon = 'https://www.google.com/intl/en_ALL/mapfiles/dd-end.png';
  23. var destinationTitle = 'A tutaj się zatrzymujemy!';
  24. var originIcon = 'https://www.google.com/intl/en_ALL/mapfiles/dd-start.png';
  25. var originTitle = 'Stąd wyruszamy :)';
  26. $('#map').css('width','400px').css('height', '400px');
  27. var map = new google.maps.Map(document.getElementById('map'), {
  28. center: {lat: 50.108138, lng: 19.0400068}, // tutaj pokazujesz mapkę na której google rozrysuje trasę
  29. zoom: 12
  30. });
  31. var geocoder = new google.maps.Geocoder;
  32. var service = new google.maps.DistanceMatrixService;
  33. service.getDistanceMatrix({
  34. origins: [origin],
  35. destinations: [destination],
  36. travelMode: google.maps.TravelMode.DRIVING,
  37. unitSystem: google.maps.UnitSystem.METRIC,
  38. avoidHighways: true,
  39. avoidTolls: true
  40. }, function(response, status) {
  41. if (status !== google.maps.DistanceMatrixStatus.OK) {
  42. alert('Error was: ' + status);
  43. } else {
  44. var originList = response.originAddresses;
  45. var destinationList = response.destinationAddresses;
  46. var outputDiv = document.getElementById('output');
  47. outputDiv.innerHTML = '';
  48. deleteMarkers(markersArray);
  49.  
  50. var showGeocodedAddressOnMap = function(asDestination) {
  51. var icon = asDestination ? destinationIcon : originIcon;
  52. var title = asDestination ? destinationTitle : originTitle;
  53. return function(results, status) {
  54. if (status === google.maps.GeocoderStatus.OK) {
  55. map.fitBounds(bounds.extend(results[0].geometry.location));
  56. markersArray.push(new google.maps.Marker({
  57. map: map,
  58. position: results[0].geometry.location,
  59. icon: icon,
  60. title : title
  61.  
  62. }));
  63. } else {
  64. if( status === 'ZERO_RESULTS' && document.getElementById("adres").value!= '' ){
  65. alert('Geolokalizator nie potrafi odnaleźć wpisanej miejscowości :( <br> Wpisz poprawną miejscowość');
  66. }
  67. }
  68. };
  69. };
  70.  
  71. for (var i = 0; i < originList.length; i++) {
  72. var results = response.rows[i].elements;
  73. geocoder.geocode({'address': originList[i]},
  74. showGeocodedAddressOnMap(false));
  75. for (var j = 0; j < results.length; j++) {
  76. geocoder.geocode({'address': destinationList[j]},
  77. showGeocodedAddressOnMap(true));
  78. outputDiv.innerHTML += 'odległość: ' + results[j].distance.text;
  79. $('#stronger').remove();
  80. }
  81. }
  82. }
  83. }
  84. });
  85. }
  86.  
  87. function deleteMarkers(markersArray) {
  88. for (var i = 0; i < markersArray.length; i++) {
  89. markersArray[i].setMap(null);
  90. }
  91. markersArray = [];
  92. }
  93. </http://december.com/html/4/element/script.html>
  94. <http://december.com/html/4/element/script.html async defer
  95. src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB3xxTXcVYShuoufkT1tV6L55C0_K0tMzw"><!-- tutaj musisz dać swój klucz API -->
  96. </http://december.com/html/4/element/script.html>

Napisany przez: john_doe 24.05.2020, 11:10:21

@miccom może nie podawaj swojego klucza.

@viking dzięki.

napisałem coś co działa ale ... gdyby ktoś zaproponował inną wersję, inne wywołanie może, brakuje pewnie w sumie try/catch

Kod
function fetchDistance(origin, destination) {
            return new Promise(function(resolve, reject) {
                var service = new google.maps.DistanceMatrixService();
                service.getDistanceMatrix(
                {
                    origins: [origin],
                    destinations: [destination],
                    travelMode: google.maps.TravelMode.DRIVING,
                    unitSystem: google.maps.UnitSystem.METRIC,
                    avoidHighways: false,
                    avoidTolls: false
                },
                function(resp, status) {
                    if (status !== google.maps.DistanceMatrixStatus.OK) {
                        response = reject(status);
                    } else {
                        response = resolve(resp.rows[0].elements[0].distance.value);
                    }
                });
            });
        }
        async function getDistanceInKmAsync(start, end){
            const result = await fetchDistance(start, end);
            return result / 1000;
        }


a używam tak
Kod
getDistanceAsync(ORIGIN_ADDRESS, destinationAddress).then(result => {
            if(result <= <jakis_tam)
            {
                  // ...
            }
        });

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)