2011-11-01 108 views
1

我有一個城市名稱數據庫(芝加哥,紐約,納什維爾等)。只有少數人有座標。無論是在移動設備上還是在桌面上,以我的方式將我的數據庫中最接近的城市/區域與其當前位置匹配的最簡單方法是什麼?地理位置查找最近的城市

我在共享服務器上,所以我不能安裝任何apache模塊。

更新

比方說座標是沒有問題的。如果我的數據庫中的座標不是問題,那麼執行此操作的最佳方法是什麼?使用HTML 5來獲取當前用戶的座標,並運行一個簡單的查詢來確定最近的位置?

回答

2

使用像GeoIP這樣的服務,你可以下載免費的數據庫或使用他們的API。

*編輯*

這裏是他們的城市特定的頁面 - http://www.maxmind.com/app/geolitecity

+0

這太棒了,但它需要一個Apache模塊,我沒有權限安裝在我的共享服務器上。 – Webnet

+3

不確定你真正需要什麼,但是你可以通過將文件「GeoIP.dat」和「geoip.inc」複製到目錄中來使用GeoIP。無需安裝任何東西,我以這種方式使用它,並且效果很好。 – martinstoeckli

+0

真的嗎?太棒了,我會給它一個鏡頭 – Webnet

0

我想說獲得更好的數據庫。在線查看美國人口普查郵政編碼數據庫。它擁有美國各地郵政編碼的座標。從那裏,地理位置的用戶,並找到最接近的郵政編碼,城市,或任何使用圓距公式。

get fancypants。 Geohash整個郵政編碼數據庫(請參閱:http://en.wikipedia.org/wiki/Geohash)。然後geohash用戶的座標。比較geohashes找到最接近的郵政編碼,城市,無論如何。關於geohash的最好的事情是它不需要任何瘋狂的圓距公式。

這可能不是最新的和最偉大的,但你明白了一點:http://www.census.gov/tiger/tms/gazetteer/zips.txt

0

您可以使用它,你可以得到的慾望輸出美國郵政編碼數據庫。

從IPinfo DB下載Zipcode數據庫。請參考下面的URL http://ipinfodb.com/zipcode_database.php

現在使用低於MYSQL函數查找距離currunt地理位置(經度和緯度)的距離。

DELIMITER $$  
DROP FUNCTION IF EXISTS `great_circle_distance`$$ 
    CREATE DEFINER=`root`@`localhost` FUNCTION `great_circle_distance`(
    lat1 DOUBLE(10,6), 
    lon1 DOUBLE(10,6), 
    lat2 DOUBLE(10,6), 
    lon2 DOUBLE(10,6) 
    ) RETURNS double(10,2) 
     DETERMINISTIC 
    BEGIN 
        DECLARE delta_lat DOUBLE(10,6); 
        DECLARE delta_lon DOUBLE(10,6); 
        DECLARE temp1 DOUBLE(10,6); 
        DECLARE EARTH_RADIUS DOUBLE(10,2); 
        DECLARE distance DOUBLE(10,2); 
        SET lat1 = RADIANS(lat1); 
        SET lon1 = RADIANS(lon1); 
        SET lat2 = RADIANS(lat2); 
        SET lon2 = RADIANS(lon2); 
        SET delta_lat = lat2 - lat1; 
        SET delta_lon = lon2 - lon1; 

        SET temp1 = pow(sin(delta_lat/2.0),2) + cos(lat1) * cos(lat2) * pow(sin(delta_lon/2.0),2); 
        SET EARTH_RADIUS = 3956.0; 
        SET distance = EARTH_RADIUS * 2 * atan2(sqrt(temp1),sqrt(1-temp1)); 
        RETURN distance; 
     END$$ 

    DELIMITER ; 

以下查詢將幫助您獲得結果,或者您可以根據需要修改查詢。

Select TA.city, great_circle_distance(TA.lat,TA.log, 32.2342,-72.42342) AS Distance FROM zipcodes AS TA Order BY Distance Limit 1;