2011-04-15 50 views
2

我有一位客戶想要我計算城市之間的英里距離。我正在做項目在PHP中,JavaScript,我一直在閱讀一些長/緯度數據庫,但仍然無法找到從哪裏開始以及使用它。是否有任何Web服務可以通過傳遞兩個城市名稱來查詢,並且它可以以英里或公里返回距離?請幫助如何最好地計算兩個城市之間的距離(加拿大)?

回答

4

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

距離和麪積函數 兩點之間的距離是它們之間的最短路徑的長度。這條最短路徑稱爲測地線。在球體上,所有測地線都是大圓的一部分。要計算這個距離,請調用computeDistanceBetween(),並將其傳遞給兩個LatLng對象。

如果您有多個位置,則可改爲使用computeLength()來計算給定路徑的長度。

要計算多邊形區域的面積,請調用computeArea(),傳遞定義閉環的LatLng對象數組。

如果希望保持GEO數據庫維護緯度/長到一個地方/城市,那麼你也可以使用谷歌API來獲取座標「地址」: http://code.google.com/apis/maps/documentation/javascript/services.html#GeocodingRequests

另一種選擇是使用JavaScript實現大圓計算器的變化,如果你不是一個谷歌的粉絲:http://williams.best.vwh.net/gccalc.htm

+0

我寧願谷歌的服務,也由於這樣的事實,主要的問題是要保持自己的數據庫與LON /緯度值和城市... – strauberry 2011-04-15 12:50:14

+0

你能解釋我怎樣才能使用這些功能,而無需在我的網頁上的地圖我只有皮卡和下拉選擇框與他們的城市名稱 – 2011-04-15 12:54:32

+0

使用谷歌API轉換完整的城市/國家以緯度/經度(以度或DMS格式),然後使用相同的API來計算距離。 – sdolgy 2011-04-15 12:58:24

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); 
} 
+0

結果數字代表什麼?如果它是英寸,它不符合谷歌的建議。 – John 2013-08-10 04:33:02

+0

@John:我相信它是公里(從我寫和使用過這段時間以來)。確保經緯度以弧度表示 – 2013-08-29 11:07:09

相關問題