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