Путешествие с точки

Я хочу использовать API Карт Google для рисования области вокруг определенной точки на карте, где человек может ходить в течение X минут. Другими словами, как вы можете найти все места, которые можно перемещать из заданной точки за определенный пользователем период времени?

Ответы

Ответ 1

Здесь готовое решение: http://maps.forum.nu/gm_driving_radius.html#. Альтернативным идеальным решением является использование кривой заполнения пространства или пространственного индекса. Sfc уменьшает сложность 2d до сложности 1d и алгоритм аппроксимации не является эвристическим. С помощью sfc это должно быть гарантией 1/4, чтобы найти все точки в эвклидовом пространстве.
enter image description here

Ответ 2

Update: Поиграйте с этим:

<!DOCTYPE html>
<html> 
<head> 
   <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
   <title>Google Maps Geometry</title> 
   <script src="http://maps.google.com/maps/api/js?sensor=false" 
           type="text/javascript"></script>

</head> 
<body> 
   <div id="map" style="width: 1000px; height: 800px"></div> 

   <script type="text/javascript"> 

   function CalculateDistanceBetweenTwoPoint(lat1, lon1, lat2, lon2) {

        var R = 6371; // km
        var dLat = (lat2-lat1).toRad();
        var dLon = (lon2-lon1).toRad();
        var lat1 = lat1.toRad();
        var lat2 = lat2.toRad();

        var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
                Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
        var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
        var d = R * c;      
        return d * 1000;

   }



      Number.prototype.toRad = function() {
         return this * Math.PI / 180;
      }

      Number.prototype.toDeg = function() {
         return this * 180 / Math.PI;
      }

      google.maps.LatLng.prototype.destinationPoint = function(brng, dist) {
         dist = dist / 6371;  
         brng = brng.toRad();  

         var lat1 = this.lat().toRad(), lon1 = this.lng().toRad();

         var lat2 = Math.asin(Math.sin(lat1) * Math.cos(dist) + 
                              Math.cos(lat1) * Math.sin(dist) * Math.cos(brng));

         var lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(dist) *
                                      Math.cos(lat1), 
                                      Math.cos(dist) - Math.sin(lat1) *
                                      Math.sin(lat2));

         if (isNaN(lat2) || isNaN(lon2)) return null;

         return new google.maps.LatLng(lat2.toDeg(), lon2.toDeg());
      }

      var pointA = new google.maps.LatLng(40.80, -74.00);   // Circle center
      var radius = 1;                                      // 10km

      var mapOpt = { 
         mapTypeId: google.maps.MapTypeId.TERRAIN,
         center: pointA,
         zoom: 17
      };

      var map = new google.maps.Map(document.getElementById("map"), mapOpt);

      // Draw the circle
      new google.maps.Circle({
         center: pointA,
         radius: radius * 1000,       // Convert to meters
         fillColor: '#FF0000',
         fillOpacity: 0.2,
         map: map
      });

      // Show marker at circle center
      new google.maps.Marker({
         position: pointA,
         map: map
      });

      var i = 0;
      setTimeout(LoopThroughPoints, 1000);


    var triangleCoords = [];

    function LoopThroughPoints() {


         var directionsService = new google.maps.DirectionsService();

            var destination = pointA.destinationPoint(i, radius);

          var request = {
              origin: pointA,
              destination: destination,
              travelMode: google.maps.TravelMode["WALKING"]
          };
          console.log(request);

          directionsService.route(request, function(response, status) {
        console.log(response);

            if (status == google.maps.DirectionsStatus.OK) {

                var cumulativeDistance = 0;

                new google.maps.Marker({
                            position: destination,
                            map: map
                        });


                loopy: for(var i = 0; i < response.routes[0].overview_path.length; i++)
                {

                    var path = response.routes[0].overview_path[i];
                    var pathNext = response.routes[0].overview_path[i+1];

                    cumulativeDistance += CalculateDistanceBetweenTwoPoint(path.Oa, path.Pa, pathNext.Oa, pathNext.Pa);

                    if(cumulativeDistance >= 500) {
                        triangleCoords.push(new google.maps.LatLng(path.Oa, path.Pa));
                        break loopy;                        
                    }

                }

            }
          });


        i = i + 10;
        if(i!=360) {

            setTimeout(LoopThroughPoints, 10);

        } else {
            bermudaTriangle = new google.maps.Polygon({
                paths: triangleCoords,
                strokeColor: "#FF0000",
                strokeOpacity: 0.8,
                strokeWeight: 2,
                fillColor: "#FF0000",
                fillOpacity: 0.35
            });

            bermudaTriangle.setMap(map);
        }


      }



   </script> 
</body> 
</html>

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

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

Расстояние: Время, потраченное тяжело, я попытаюсь рассчитать его в метрах. Итак, согласно http://answers.yahoo.com/question/index?qid=1006021202308 (научный, я знаю...) 5 км/ч или 500 м за 6 минут.

Мой метод:

  • Выберите свою точку и вычислите Long/Lat
  • Нарисуйте круг, возможно, 1KM
  • Найдите столько мест, сколько вы можете в этой строке. Используйте "Получить маршруты" от апи (http://code.google.com/apis/maps/documentation/javascript/v2/examples/directions-walking.html)
  • Получите результат от направления назад (в правой части этого последний пример)
  • Прокрутите маршруты, пока не нажмете 500 м и не опустите штырь

Это также может быть полезно:

Как переместить маркер на 100 метров с координатами

Еще несколько! Карты Google: с учетом точки, как найти все точки на заданной дистанции?

Это показывает, как найти все точки, а затем привязать к ближайшей улице.