Javascript 使用Google maps API的多个板条之间的距离

Javascript 使用Google maps API的多个板条之间的距离,javascript,python,django,postgresql,google-maps-api-3,Javascript,Python,Django,Postgresql,Google Maps Api 3,如果我在数据库中存储了几个latlng点,并且我想将这些点与我的实际latlng位置进行比较(给出每个latlng点与我的实际latlng之间的距离),那么google maps API将如何实现这一点?或者使用我的数据库会更容易 计算球体上两点之间的距离需要使用,这需要对三角学有相当扎实的理解 更简单的方法是利用,它在google.maps.geometry.spheremic命名空间中具有方便的函数computeDistanceBetween 下面是一些使用computeDistanceBe

如果我在数据库中存储了几个latlng点,并且我想将这些点与我的实际latlng位置进行比较(给出每个latlng点与我的实际latlng之间的距离),那么google maps API将如何实现这一点?或者使用我的数据库会更容易

计算球体上两点之间的距离需要使用,这需要对三角学有相当扎实的理解

更简单的方法是利用,它在
google.maps.geometry.spheremic
命名空间中具有方便的函数
computeDistanceBetween

下面是一些使用
computeDistanceBetween
的示例代码:

var home = ['London', new google.maps.LatLng(51.5, -0.1167)];

var pts = [
        ['Prague', new google.maps.LatLng(50.08, 14.43)],
        ['Paris', new google.maps.LatLng(48.856614, 2.3522219000000177)],
        ['Berlin', new google.maps.LatLng(52.5200065999, 13.404953999999975)]
];

// provide a shortcut for the distance function
var dist = google.maps.geometry.spherical.computeDistanceBetween;

pts.forEach(function(pt){
    var d = dist(home[1], pt[1])/1000;
    // d is now the distance (in km) between the home coordinate and the point
});

请参见此处的工作示例:

如果您打算使用数据库进行此类工作,您可能需要考虑使用PostGIS进行此工作。安装PostGIS后:

CREATE EXTENSION postgis;

SELECT ST_Distance( 
    ST_GeographyFromText('POINT(115.764286 -31.746416)'), 
    ST_GeographyFromText('POINT(151.036606 -33.906896)')
);
产生:

   st_distance    
------------------
 3295294.42439749
(1 row)
与谷歌地图输出相比

从距离上看,这似乎是正确的

请注意,这是球体距离,即在地球表面上,而不是通过它的点对点距离

注意PostGIS和谷歌地图的坐标顺序

要了解有关PostGIS的更多信息,请执行以下操作:


谢谢@ethan brown,我想这会对我有所帮助,我正在尝试做的是,例如,我是一个用户,我正在使用google maps API保存一条从我家到我大学的路线,因此住在起点或路线任何航路点附近的另一个用户可以收到该现有路线的推荐,这就是为什么我想将我的实际latlng与数据库中存储的所有其他latlng进行比较,但也许我需要定义一个半径以加快速度?是的,性能将是一个问题…确定球体上两点之间的距离在计算上很昂贵。一种方法是使用正方形而不是半径进行粗略过滤,然后只在正方形内的点上进行球形计算。是的,这就是我所想的,非常感谢:)我现在有一个困惑,我如何使用正方形?你有代码示例吗?这是一个相当大的问题。基本上,您只需将纬度和经度视为笛卡尔坐标(而不是球面坐标),并使用1°~=111 km的近似值。例如,如果你想找到给定点50公里范围内的所有坐标,你只需要做一个数值比较,看看它是否在任何方向的四分之一度范围内。试一试,如果你不能让它工作,再问一个SO问题。非常感谢你,我会查出来的。