如何最好地计算两个城市(加拿大)之间的距离?

时间:2011-04-15 12:36:52

标签: php javascript google-maps-api-3

我有一位客户希望我计算城市之间的里程距离。我正在用PHP,javascript做项目,我一直在阅读一些长/ lat数据库,但仍然无法找到从哪里开始和使用它。是否有任何网络服务,我可以通过传递两个城市名称查询,它可以返回我的英里或公里的距离?请帮忙

3 个答案:

答案 0 :(得分:4)

http://code.google.com/apis/maps/documentation/javascript/geometry.html#Distance

  

距离和面积函数   两点之间的距离是它们之间最短路径的长度。这条最短路径称为测地线。在球体上,所有测地线都是大圆的一部分。要计算此距离,请调用computeDistanceBetween(),并将两个LatLng对象传递给它。

     

如果您有多个位置,您可以使用computeLength()来计算给定路径的长度。

     

要计算多边形区域的面积,请调用computeArea(),传递定义闭环的LatLng对象数组。

如果您想要维护一个将纬度/经度保持在某个地方/城市的GEO数据库,那么您还可以使用Google API检索“地址”的坐标: http://code.google.com/apis/maps/documentation/javascript/services.html#GeocodingRequests

另一种选择是使用Javascript中实施的Great Circle Calculator的变体,如果您不是Google粉丝:http://williams.best.vwh.net/gccalc.htm

答案 1 :(得分:1)

非API解决方案。这样做的好处是,您不会依赖任何第三方,这可能会降低成本,或者降低成本,或者受到速率限制,响应速度变慢等等。

首先将您的位置转换为纬度/经度。你需要一个城市和合作的数据库,但我想这很容易找到。在英国,这些数据可以从各个政府机构免费获得。然后使用合作伙伴,您可以计算它们之间的距离。以下是在java中,但应该直接移植到javascript(或php):

public static double R_EARTH_EQUATORIAL = 6378137.0;
public static double R_EARTH_POLAR = 6356752.3;

// The shortest dist between two points on a globe. Lat/lngs are in RADIANS
public static double greatCircleDistance(double lat_1, double lng_1, double lat_2, double lng_2) {

    double d_lat = lat_1 - lat_2;
    double d_lng = lng_1 - lng_2;
    double lat_ave = (lat_1 + lat_2) / 2;

    double h = haversin(d_lat) + Math.cos(lat_1) * Math.cos(lat_2) * haversin(d_lng);
    return 2 * R_EARTH(lat_ave) * Math.asin(Math.pow(h, 0.5));
}

public static double haversin(Double x) {
    return Math.pow(Math.sin(x/2),2);
}

// Returns radius of earth at a given latitude
public static double R_EARTH(double latitude) {

    double a = R_EARTH_EQUATORIAL;
    double b = R_EARTH_POLAR;
    double x = latitude;

    double p = Math.pow((Math.pow(a,2) * Math.cos(x)),2);
    double q = Math.pow((Math.pow(b,2) * Math.sin(x)),2);
    double r = Math.pow(a * Math.cos(x),2);
    double s = Math.pow(b * Math.sin(x),2);

    return Math.pow(((p + q) / (r + s)), 0.5);
}

答案 2 :(得分:0)

由于Google Maps已付款。最好的免费替代方法是在JavaScript或PHP中使用openstreetmap API。您可以使用城市的地理编码Web服务获取城市的纬度和经度。这是使用openstreetmap.org API提供distance between two cities的示例站点。