首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何计算给定点到最近的道路的距离?

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

Stack Overflow用户
提问于 2014-06-16 14:31:35
回答 4查看 3.2K关注 0票数 1

目标:

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

附加信息:

我不受谷歌地图的限制。如果Bing映射或其他映射服务提供此功能,则该服务也是一个考虑因素。

问题:

您知道如何用Google v3计算从给定点到最近的道路的距离吗?如果没有,你知道有其他方法或服务可以使我达到我的目标吗?

EN

回答 4

Stack Overflow用户

发布于 2014-06-18 10:54:01

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

代码语言:javascript
代码运行次数:0
运行
复制
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

};
票数 8
EN

Stack Overflow用户

发布于 2016-08-08 11:30:56

另一种可能是利用谷歌的“道路管理API”:https://developers.google.com/maps/documentation/roads/snap

很简单,真的。你提供你的定位点,它返回最近的道路点,例如:key&path=60.170880,24.942795

它返回如下:

代码语言:javascript
代码运行次数:0
运行
复制
{
  "snappedPoints": [
    {
      "location": {
        "latitude": 60.170877918672588,
        "longitude": 24.942699821922421
      },
      "originalIndex": 0,
      "placeId": "ChIJNX9BrM0LkkYRIM-cQg265e8"
    }
  ]
}
票数 2
EN

Stack Overflow用户

发布于 2014-06-16 16:17:15

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

我不相信有一种合法的方法可以用这些API来做你想做的事情。但是,您可能会使用Google的街景图像API或使用Google的StreetView对象进行更细粒度的控制,从而完成一些恶意的、不被推荐的技巧。

下面的想法是:--如果Street返回一个有效的结果(即全景街道视图图像),那么可能会将放在街道中。如果没有,那你就不是在街上了。

在用独立街景影像API识别“真”响应方面可能存在挑战。一种选择是比较失败响应就像这个的图像文件大小(内容长度为4868 )和测试点返回的图像文件大小,例如像这样有效的,它的内容长度为38701 ..any“真”响应将导致图像的内容长度值要高得多,因为图像中有实际数据。坦率地说,只要您请求相同大小的图像(即宽度和高度),故障的内容长度应该总是相同的。然而,API可能会稍微改变,并打破这一预期。所以这很危险。

实际Google API的街景对象提供的更高粒度的控件将为您提供更干净的处理,因为google.maps.StreetViewStatus将返回三个值之一并解决此情况:OKUNKNOWN_ERRORZERO_RESULTS,删除了使用前面描述的静态映像API所需的脆弱猜测工作。

但这种做法是肮脏的。首先,我认为街景不仅仅是街景。我在考虑公园里的小径,用户上传的全景图等等。其次,街景API似乎使用了“抓取”允许度(大概,50米)。换句话说,如果你的观点足够接近,它会给你带来的好处,并返回附近的街景全景无论如何。换句话说,要小心假阳性。

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

http://maps.googleapis.com/maps/api/streetview?size=600x300&location=34.055526,-81.008087

这里有一个失败了..。

http://maps.googleapis.com/maps/api/streetview?size=600x300&location=34.05637,-81.00583

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

如果你想认真对待这件事,你真的需要进入PostGRESql和它的PostGIS扩展,你需要一套非常详细的街道中心线。开放街道地图数据可以帮助您入门,但是请注意,数据的质量在某些地方是可变的( ..less ),而在其他地方则是可变的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24246056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档