2011-11-09 10 views
14

Quiero utilizar Google Maps API para dibujar un área alrededor de un punto particular en el mapa donde una persona puede caminar en un tiempo de X minutos. En otras palabras, ¿cómo puede encontrar todos los lugares que puede viajar desde un punto determinado dentro de un período de tiempo definido por el usuario?Viajar desde un punto

+3

Esta es una pregunta realmente interesante, aunque espero que sea difícil. ¡Veremos qué surge! –

Respuesta

4

Aquí está lista para su copia solución: http://maps.forum.nu/gm_driving_radius.html#. Una solución alternativa casi perfecta es usar una curva de relleno de espacio o un índice espacial. Un sfc reduce la complejidad 2d a una complejidad 1d y es un algoritmo de aproximación, no una heurística. Con un sfc debería ser una garantía de 1/4 para encontrar todos los puntos en el espacio euklidian.
enter image description here

+0

¡Ejemplo interesante! – ScottE

1

Actualización: tener un juego con esto:

<!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> 

Sólo un vistazo rápido y algunos entrantes, si alguien puede ser capaz de proporcionar algunas soluciones mejores.

Parece que no hay una manera de obtener todas las carreteras que salen de un cierto punto con la API de Maps.

Distancia: El tiempo empleado es difícil, lo intentaría y lo calcularía en metros. De acuerdo con http://answers.yahoo.com/question/index?qid=1006021202308 (científico lo sé ...) 5 km/ho 500 m en 6 minutos.

Mi método sería:

Esto también podría ser útil:

How to move a marker 100 meters with coordinates

un poco más! Google Maps: Given a point, how to find all points at a given road distance?

Esto muestra cómo encontrar todos los puntos y luego ajustar a la calle más cercana

Cuestiones relacionadas