我有一個城市名稱數據庫(芝加哥,紐約,納什維爾等)。只有少數人有座標。無論是在移動設備上還是在桌面上,以我的方式將我的數據庫中最接近的城市/區域與其當前位置匹配的最簡單方法是什麼?地理位置查找最近的城市
我在共享服務器上,所以我不能安裝任何apache模塊。
更新
比方說座標是沒有問題的。如果我的數據庫中的座標不是問題,那麼執行此操作的最佳方法是什麼?使用HTML 5來獲取當前用戶的座標,並運行一個簡單的查詢來確定最近的位置?
我有一個城市名稱數據庫(芝加哥,紐約,納什維爾等)。只有少數人有座標。無論是在移動設備上還是在桌面上,以我的方式將我的數據庫中最接近的城市/區域與其當前位置匹配的最簡單方法是什麼?地理位置查找最近的城市
我在共享服務器上,所以我不能安裝任何apache模塊。
更新
比方說座標是沒有問題的。如果我的數據庫中的座標不是問題,那麼執行此操作的最佳方法是什麼?使用HTML 5來獲取當前用戶的座標,並運行一個簡單的查詢來確定最近的位置?
我想說獲得更好的數據庫。在線查看美國人口普查郵政編碼數據庫。它擁有美國各地郵政編碼的座標。從那裏,地理位置的用戶,並找到最接近的郵政編碼,城市,或任何使用圓距公式。
或
get fancypants。 Geohash整個郵政編碼數據庫(請參閱:http://en.wikipedia.org/wiki/Geohash)。然後geohash用戶的座標。比較geohashes找到最接近的郵政編碼,城市,無論如何。關於geohash的最好的事情是它不需要任何瘋狂的圓距公式。
這可能不是最新的和最偉大的,但你明白了一點:http://www.census.gov/tiger/tms/gazetteer/zips.txt
您可以使用它,你可以得到的慾望輸出美國郵政編碼數據庫。
從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;
這太棒了,但它需要一個Apache模塊,我沒有權限安裝在我的共享服務器上。 – Webnet
不確定你真正需要什麼,但是你可以通過將文件「GeoIP.dat」和「geoip.inc」複製到目錄中來使用GeoIP。無需安裝任何東西,我以這種方式使用它,並且效果很好。 – martinstoeckli
真的嗎?太棒了,我會給它一個鏡頭 – Webnet