Выполнение "точек интереса вдоль маршрута" на картах Google

Мне нужно разрешить путешественникам использовать карты Google для построения маршрута, а затем запросить мою базу данных о достопримечательностях (скажем, местоположения Макдональда), а затем показать все эти местоположения, которые находятся в пределах мили или двух маршрутов они будут принимать. Вопрос заключается в том, как эффективно использовать информацию о "дорожных указаниях", возвращаемую из google (по существу, массив пар lat/long), и превратить это в запрос sql для получения местоположений, которые попадают на определенное расстояние от маршрута

Это не должно быть суперточным, и "как птица летит" расстояния от маршрутов просто прекрасны. Меня больше всего беспокоит, что он достаточно эффективен.

В базе данных все настраивается в основном с каждой записью, имеющей широту и долготу, но я могу изменить схему базы данных по мере необходимости.

В качестве примера, этот сайт делает то, что я хочу сделать (если вы дадите начальную точку и конечную точку, это покажет шевронные станции, которые находятся рядом с шоссе, которое вы будете делать): http://www.chevron.com/products/stations/stationfinder/planyourroute.aspx

http://karmatics.com/docs/locationsalongroute.png

Ответ 2

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Polygon arrays</title>
    <style>
      #map {
        height: 100%;
      }
      html, body {
        height: 100%;
        margin: 0;
        padding: 0;
      }
    </style>
  </head>

  <body>
    <div id="map"></div>
     <script>    
var map;
      function initMap() {
         map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: 19.2570, lng: 72.8712},
          zoom: 10,
        });

        var directionService = new google.maps.DirectionsService();
        var directionsRenderer = new google.maps.DirectionsRenderer({ map: map }); 
        var request = {
           origin: "<?php echo $source;?>",
          destination: "<?php echo $destination;?>", 
          travelMode: google.maps.DirectionsTravelMode.DRIVING
        }


        directionService.route(request, function(result, status) {
        if (status == google.maps.DirectionsStatus.OK) {

            var path = result.routes[0].overview_path;

            var poly = new google.maps.Polyline({
              strokeColor: '#FF0000',
              strokeOpacity: 1.0,
              strokeWeight: 3,
             map: map,
            });
            poly.setPath(path);


            var myTollLocations = [
              <?php

                 isset($hello); //$hello is array which comes from database
              foreach ($hello as $key => $value) {
                ?>
                  new google.maps.LatLng(<?php echo $hello[$key]->latitude;?>, <?php echo $hello[$key]->longitude;?>),
                <?php
              }
              ?>

            ];


            for (var i = 0; i < myTollLocations.length  ; i++) {
              if (google.maps.geometry.poly.isLocationOnEdge(myTollLocations[i], poly,0.005)) {
                  console.log("found");


                }else{
                  console.log("Not Found!");
                }
            };




           <?php
           $markersLocation =  array($source, $destination);
             foreach ($markersLocation as $key => $values) {

             ?>


          //Source Marker( convert address to LatLng for marker)   
           var geocoder = new google.maps.Geocoder();            
            geocoder.geocode( { 'address': '<?php echo $markersLocation[$key]?>'}, function(results, status) {

                if (status == google.maps.GeocoderStatus.OK) {
                    var latitude = results[0].geometry.location.lat();
                    var longitude = results[0].geometry.location.lng();
                }

                console.log(latitude);
                console.log(longitude);

                var myLatLng = {lat: latitude, lng: longitude};



                var marker = new google.maps.Marker({
                    position: myLatLng,
                    map: map,
                    title: 'source',
                    icon: 'http://innowrap.com/clients/digitoll/ic_red_marker.png'

                });

            });


            <?php
           }
            ?>


          } else {
            alert("Directions query failed: " + status);
          }
        });


      }


    </script>
    <script src="https://maps.googleapis.com/maps/api/js?key=ADD YOUR API KEY&libraries=geometry&callback=initMap"
         async defer></script>
  </body>
</html>