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

Google maps 如何计算给定点到最近道路的距离?,google-maps,google-maps-api-3,bing-maps,Google Maps,Google Maps Api 3,Bing Maps,目标: 计算给定点到最近道路的距离。 我需要确定一个点是否落在道路上。为此,我希望查看该点到最近道路的距离。因此,距离为0表示该点实际上位于道路上 其他信息: 我并不局限于谷歌地图。如果Bing地图或其他地图服务提供了此功能,则该服务也值得考虑 问题: 您知道使用Google Maps API v3计算从给定点到最近道路的距离的方法吗?如果没有,您是否知道我可以通过其他方法或服务实现我的目标 我需要确定一个点是否落在道路上 我不相信有一个合法的方法来处理这些API。然而,您可能可以使用Goog

目标:

计算给定点到最近道路的距离。 我需要确定一个点是否落在道路上。为此,我希望查看该点到最近道路的距离。因此,距离为0表示该点实际上位于道路上

其他信息:

我并不局限于谷歌地图。如果Bing地图或其他地图服务提供了此功能,则该服务也值得考虑

问题:

您知道使用Google Maps API v3计算从给定点到最近道路的距离的方法吗?如果没有,您是否知道我可以通过其他方法或服务实现我的目标

我需要确定一个点是否落在道路上


我不相信有一个合法的方法来处理这些API。然而,您可能可以使用Google的,或者使用更细粒度的控件,使用Google的,进行一些黑客式的,未被推荐的把戏

思考如下:如果街景API返回有效结果(即全景街景图像),则您可能在街道上。如果没有,那你就不在街上了

在识别客户的“真实”响应方面可能存在挑战。一个选项是将失败响应的图像文件大小(内容长度为4868)与测试点返回的图像文件大小(例如,内容长度为38701)进行比较。任何“真”响应都会导致图像的内容长度值显著增加,因为图像中存在实际数据。坦率地说,只要您请求相同大小的图像(即宽度和高度),失败的内容长度就应该始终相同。然而,API可能会稍有变化,并打破这一预期。所以这很危险

actual提供的粒度更高的控件将为您提供更干净的处理,因为将返回三个值中的一个,并解决此问题:
OK
UNKNOWN\u ERROR
、以及
ZERO\u RESULTS
,从而消除了使用静态图像API时所需的脆弱猜测工作,如前所述

但这种方法是肮脏的。首先,我认为街景所带来的不仅仅是近街图像。我想到的是公园里的小径,用户上传的全景图等等。其次,街景API似乎使用了缓慢的“捕捉”公差()。换句话说,如果你的观点足够接近,它会给你带来怀疑的好处,并返回附近的街景全景。换句话说,要小心误报

如果您正在考虑采用这种方法,下面是一个有效的端点示例:

还有一个失败了

作为后记,如果应用程序的需求是由铁一般的业务需求定义的,我不建议实际使用这种方法。但如果只是为了娱乐和游戏,也许距离足够近

如果你想认真对待这一点,你真的需要了解PostGRESql及其PostGIS扩展,你需要一套超级详细的街道中心线。可以让你开始,但要注意,数据的质量是可变的。有些地方令人惊讶。比其他地方少

我需要确定一个点是否落在道路上


我不相信有一个合法的方法来处理这些API。然而,您可能可以使用Google的,或者使用更细粒度的控件,使用Google的,进行一些黑客式的,未被推荐的把戏

思考如下:如果街景API返回有效结果(即全景街景图像),则您可能在街道上。如果没有,那你就不在街上了

在识别客户的“真实”响应方面可能存在挑战。一个选项是将失败响应的图像文件大小(内容长度为4868)与测试点返回的图像文件大小(例如,内容长度为38701)进行比较。任何“真”响应都会导致图像的内容长度值显著增加,因为图像中存在实际数据。坦率地说,只要您请求相同大小的图像(即宽度和高度),失败的内容长度就应该始终相同。然而,API可能会稍有变化,并打破这一预期。所以这很危险

actual提供的粒度更高的控件将为您提供更干净的处理,因为将返回三个值中的一个,并解决此问题:
OK
UNKNOWN\u ERROR
、以及
ZERO\u RESULTS
,从而消除了使用静态图像API时所需的脆弱猜测工作,如前所述

但这种方法是肮脏的。首先,我认为街景所带来的不仅仅是近街图像。我想到的是公园里的小径,用户上传的全景图等等。其次,街景API似乎使用了缓慢的“捕捉”公差()。换句话说,如果你的观点足够接近,它会给你带来怀疑的好处,并返回附近的街景全景。换句话说,要小心误报

如果您正在考虑采用这种方法,下面是一个有效的端点示例:

还有一个失败了

作为后记,如果应用程序的需求是由铁一般的业务需求定义的,我不建议实际使用这种方法。但如果只是为了娱乐和游戏,也许距离足够近


如果你想认真对待这一点,你真的需要了解PostGRESql及其PostGIS扩展,你需要一套超级详细的街道中心线。可以让您开始,但请注意,该数据的质量是可变的。在某些地方令人惊讶。比在其他地方少。

如果它是一条直线,您可以选择该直线的中点,并获得到该点的欧几里德距离:。

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 };

{
  "snappedPoints": [
    {
      "location": {
        "latitude": 60.170877918672588,
        "longitude": 24.942699821922421
      },
      "originalIndex": 0,
      "placeId": "ChIJNX9BrM0LkkYRIM-cQg265e8"
    }
  ]
}