如何计算给定点到最近的道路的距离?

Ric*_*ich 1 google-maps bing-maps google-maps-api-3

目的:

计算给定点到最近道路的距离.我需要确定一个点是否落在道路上.要做到这一点,我想看到从点到最近的道路的距离.因此,距离0意味着该点实际上在道路上.

附加信息:

我不受Google地图的限制.如果Bing地图或其他地图服务提供此功能,那么该服务也是一个考虑因素.

题:

您是否知道使用Google Maps API v3计算从给定点到最近道路的距离?如果不是,您是否知道我可以实现目标的另一种方法或服务?

Ric*_*ich 8

问题解决了.这是演示:http: //jsfiddle.net/63sWv/

var marker = null;
var roadMarker = null;
var geocoder = new google.maps.Geocoder();
var map;
var directionsService = new google.maps.DirectionsService();

$(document).ready(function(){

    var latlng = new google.maps.LatLng(54.97430382488778, -1.611546277999878);

    var mapOptions = {
        zoom: 22,
        center: latlng
    };

    map = new google.maps.Map(document.getElementById('map'), mapOptions);

    google.maps.event.addListener(map, 'click', function(event) {       
        placeMarkers(event);
    });

});

function placeMarkers(e) {

    var markerImage = "https://chart.googleapis.com/chart?chst=d_map_pin_icon&chld=home|FFFF00";    
    var roadMarkerImage ="https://chart.googleapis.com/chart?chst=d_map_xpin_letter&chld=pin||FF0000|000000";

    if(marker !== null){
        marker.setMap(null);
    }

    marker = new google.maps.Marker({
        position: e.latLng,
        map: map,
        icon: markerImage
    });

    var request = {
        origin:e.latLng, 
        destination:e.latLng,
        travelMode: google.maps.DirectionsTravelMode.DRIVING
      };

    directionsService.route(request, function(response, status) {

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

            if(roadMarker !== null){
                roadMarker.setMap(null);    
            }

            roadMarker = new google.maps.Marker({
                position: response.routes[0].legs[0].start_location,
                map: map,
                icon: roadMarkerImage
            });         

            var distance = getDistance(request.origin,            
                            response.routes[0].legs[0].steps[0].end_point);

            $(".output .distance").html(distance);

        }
    });  
}

var rad = function(x) {
  return x * Math.PI / 180;
};

var getDistance = function(p1, p2) {

    //trim up to 5 decimal places because it is at that point where the difference
    p1.lat = parseFloat(p1.lat().toFixed(5));
    p1.lng = parseFloat(p1.lng().toFixed(5));

    p2.lat = parseFloat(p2.lat().toFixed(5));
    p2.lng = parseFloat(p2.lng().toFixed(5));

    var R = 6378137; // Earth’s mean radius in meter
    var dLat = rad(p2.lat - p1.lat);
    var dLong = rad(p2.lng - p1.lng);

    var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(rad(p1.lat)) * Math.cos(rad(p2.lat)) * Math.sin(dLong / 2) * Math.sin(dLong / 2);

    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = R * c;

    return d; // returns the distance in meter

};
Run Code Online (Sandbox Code Playgroud)