我對MySQL空間擴展是全新的,請原諒我對這個話題的無知。使用MySQL空間擴展選擇範圍內的項目?
場景:
1)我收集通過經緯度用戶的位置。我將該位置存儲在MySQL表中。
2)然後我顯示該用戶範圍內的任何其他用戶。範圍會很小 - 比方說1000英尺
問題: 存儲位置點的最佳做法是什麼?查詢和選擇離用戶最近的點的最佳做法是什麼?
我對MySQL空間擴展是全新的,請原諒我對這個話題的無知。使用MySQL空間擴展選擇範圍內的項目?
場景:
1)我收集通過經緯度用戶的位置。我將該位置存儲在MySQL表中。
2)然後我顯示該用戶範圍內的任何其他用戶。範圍會很小 - 比方說1000英尺
問題: 存儲位置點的最佳做法是什麼?查詢和選擇離用戶最近的點的最佳做法是什麼?
使用POINT空間數據類型來存儲的座標。
的結構是這樣的:
CREATE TABLE gps name varchar(0), `location` point NOT NULL;
請注意列 '位置' 的類型。
之後,您必須爲'位置'列定義一個SPATIAL索引。
CREATE SPATIAL INDEX sp_index ON gps(`location`);
插入數據(緯度和經度)
INSERT INTO gps (name, location) VALUES ('India' , GeomFromText(' POINT(31.5 42.2) '))
功能GeomFromText採用一個字符串並返回一個幾何對象。這裏31.5和42.2分別是經度和緯度。請注意,它們之間有逗號。它們由空間分隔。
讀數據
SELECT name, AsText(location) FROM gps;
的AsText函數轉換幾何形狀以字符串格式的內部表示。
注意:您必須使用MySQL 5.0或更高版本的空間擴展支持。還可以使用'MyIsam'數據庫引擎加快查詢速度。
不幸的是,MySQL中沒有這樣的函數作爲半徑選擇點。但是,可以很容易地使用這個餘弦定律公式:d = acos(sin(φ1)* sin(φ2)+ cos(φ1)* cos(φ2)* cos(Δλ))* R得到2點之間的距離。你可以在這裏找到細節:http://www.movable-type.co.uk/scripts/latlong-db.html SQL查詢將是這樣的:
SELECT acos(sin(radians(Y(point1)))*sin(radians(Y(point2))) + cos(radians(Y(point1)))*cos(radians(Y(point2)))*cos(radians(X(point2))-radians(X(point1)))) * 6371 AS `distance`
FROM locations
嗨@PotatoFro請讓我知道,如果這有助於。 – OMG 2013-02-23 06:38:48
非常感謝您的回覆!你非常清楚地回答了我的問題的前半部分(如何存儲和插入位置點)。你對第二部分有什麼想法嗎? (如何查詢以找到1000英尺點內的條目)。 – PotatoFro 2013-02-25 13:07:19