2013-02-22 43 views
1

我對MySQL空間擴展是全新的,請原諒我對這個話題的無知。使用MySQL空間擴展選擇範圍內的項目?

場景:

1)我收集通過經緯度用戶的位置。我將該位置存儲在MySQL表中。

2)然後我顯示該用戶範圍內的任何其他用戶。範圍會很小 - 比方說1000英尺

問題: 存儲位置點的最佳做法是什麼?查詢和選擇離用戶最近的點的最佳做法是什麼?

回答

2
  • 使用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'數據庫引擎加快查詢速度。

+0

嗨@PotatoFro請讓我知道,如果這有助於。 – OMG 2013-02-23 06:38:48

+0

非常感謝您的回覆!你非常清楚地回答了我的問題的前半部分(如何存儲和插入位置點)。你對第二部分有什麼想法嗎? (如何查詢以找到1000英尺點內的條目)。 – PotatoFro 2013-02-25 13:07:19

0

不幸的是,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