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
Respuesta
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.
¡Ejemplo interesante! – ScottE
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:
- Elija su punto y calcular Lat/Long
- dibujar un círculo tal vez 1KM
- encontrar tantos lugares como sea posible en esa línea Uso 'Cómo llegar' a partir la API (http://code.google.com/apis/maps/documentation/javascript/v2/examples/directions-walking.html)
- obtener el resultado de las direcciones hacia atrás (en el lado derecho de ese último ejemplo)
- bucle a través de las direcciones hasta llegar a 500 y soltar un alfiler
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
- 1. Leer desde un punto específico en un archivo C++
- 2. Perpendicular en un segmento de línea desde un punto dado
- 3. punto más cercano en la superficie cóncava desde el punto
- 4. ¿Puedo consultar el punto actual desde un CGContext?
- 5. ExpandoObject vs. Dictionary desde un punto de vista de rendimiento?
- 6. sesión desde un punto de vista en CodeIgniter
- 7. Encuentra ángulo de un punto desde el centro del círculo
- 8. NSpoint desde el punto de inserción NSTextView
- 9. Mostrar progreso punto-punto-punto en un botón WPF
- 10. Punto más cercano a un punto dado
- 11. Usando JTS, ¿cómo encontrar el punto más cercano en el límite de un polígono desde un punto exterior?
- 12. Gire un punto alrededor de un punto con OpenCV
- 13. ¿Cuándo un punto muerto no es un punto muerto?
- 14. Encontrar la distancia desde un punto 3d a un segmento de línea
- 15. Comprobando un segmento de línea está dentro de una distancia desde un punto
- 16. Proyección de un punto 2D desde un marcador a la imagen con homografía computada
- 17. ¿Qué significa un tope o punto o punto (.) En Haskell?
- 18. Girar un punto por otro punto en 2D
- 19. git bundle desde stash divergence punto hasta stash
- 20. convertir metros a latitud longitud desde cualquier punto
- 21. Lectura del punto final desde el archivo de configuración
- 22. limitación dígito desde el punto decimal en C++
- 23. Encontrar un punto en una línea
- 24. Cálculo de un punto en una elipse
- 25. Cómo causar un punto muerto
- 26. ¿Qué es un punto final?
- 27. Expansión para '../' (punto punto barra)
- 28. La mejor manera de encontrar un punto en un círculo más cercano a un punto dado
- 29. Distancia de un punto a un polígono
- 30. ¿Cómo obtener las coordenadas de la pantalla desde un punto 3D? Opengl
Esta es una pregunta realmente interesante, aunque espero que sea difícil. ¡Veremos qué surge! –