2012-02-25 34 views
2

我想找到X里程附近的人讓我正確解釋。路線圖執行接近性選擇

我有沒有以下

1) it shows user's current location on a google map with a radius circle of 3 miles. 

2) when ever user uses this application its current location will get stored into MySQL database 
    as follows 

    ID   Name  currLat  currLan  radius (in miles) 
    -------------------------------------------------------------------- 
    34334  John  23.039574  72.56602  3 

而且,當過一個新的用戶將使用相同的應用他的當前位置也將獲得商店在上表中的應用程序。

因此,當任何用戶訪問此應用程序時,服務器端代碼將檢查它與當前位置的距離,以確定其他用戶是否在他身邊。

我谷歌,但我真的don't know what's the approach to match and perform proximity search 我已閱讀了一些公式,但真的不知道執行它的程序。

到目前爲止,我已經使用下面的代碼到PHP中,它返回最大和最小經緯度lan,但我真的不知道如何處理它,因爲m全新的鄰近搜索,所以任何人都可以告訴我the road map to do that

$radius = 600; 

    $longitude = (float) $lan; 
    $latitude = (float) $lat; 


    $lng_min = $longitude - $radius/abs(cos(deg2rad($latitude)) * 69); 
    $lng_max = $longitude + $radius/abs(cos(deg2rad($latitude)) * 69); 
    $lat_min = $latitude - ($radius/69); 
    $lat_max = $latitude + ($radius/69); 

    $data ["lat"] = $lng_min . '/' . $lng_max . PHP_EOL; 
    $data ["lan"] = $lat_min . '/' . $lat_max; 

我真的希望這一次它不是一個虛幻的問題,如果有人想任何進一步的信息,然後隨便問

到目前爲止,我已經做了

有型的創建表POINT欄位大空間索引後,它

CREATE TABLE userstatus (
    id varchar(100) NOT NULL, 
    userid varchar(100) NOT NULL, 
    username varchar(100) NOT NULL, 
    currLoc POINT NOT NULL, 
    radius INT(10), 
    SPATIAL INDEX(currLoc) 

)ENGINE = MYISAM 

後一個過程來計算距離

DELIMITER $$ 
CREATE FUNCTION distance (a POINT, b POINT) RETURNS double DETERMINISTIC 
    BEGIN 
    RETURN 6371 * 2 * ASIN(SQRT(POWER(SIN(RADIANS(ABS(X(a)) - ABS(X(b)))), 2) + COS(RADIANS(ABS(X(a)))) * COS(RADIANS(ABS(X(b)))) * POWER(SIN(RADIANS(Y(a) - Y(b))), 2))); 
    END $$ 
DELIMITER ; 

現在將使用誰我compare my user's lat , lat and radius with above function

我插入我的數據我不知道

$userStatusInsert = "INSERT INTO userstatus (id,userid,username,currLoc,radius) 
        VALUES('".$id."','".$uid."','".$uname."',GeomFromText('POINT(".$lat." ".$lan.")'),'".$radius."')"; 

我發起了查詢in cdist < 10,value 10是一個半徑?

SELECT userid, username, distance(userstatus.currLoc, GeomFromText('POINT(23.039574 72.56602)')) AS cdist FROM userstatus HAVING cdist < 10 ORDER BY cdist LIMIT 10 

結果如下,但我真的不知道包含了什麼cdist列,我的意思是 如何確定一個人是在範圍

id  username   cdist 
----------------------------------- 
1115 John 4.52726116114886 
1111 Hunt 6.2734062677772 
1112 Raul 7.55266860461263 
1113 Nizam 7.55480140608532 
1114 John 7.76912596719722 
+1

你應該用mysql來做,而不是用php代碼。這個問題以前已經解決了很多次。這裏是一個示例教程:http://vinsol.com/blog/2011/08/30/geoproximity-search-with-mysql/您還可以搜索「mysql geo proximity search」來查找其他許多 – 2012-02-25 07:17:17

+0

我同意。使用空間擴展到mysql或postgresql。我實際上更喜歡使用postgresql,因爲它不使用mbr(最小邊界矩形)和像mysql一樣的地理空間函數(至少在v5.6可用之前)。就像查看一個點是否在奇數形狀的多邊形內一樣。 – 2012-02-25 07:25:49

+0

@本·李在你的例子中,他們使用多邊形有沒有一種方法來定義圓? – Hunt 2012-02-25 09:51:04

回答

1

的harvesine公式描述當2圈碰撞。第一個圓圈是您當前的位置,第二個圓圈是任何其他興趣點。您需要定義第一個圓的半徑,並將其與任何其他興趣點進行比較。也可以使用正方形。或者,您可以使用空間索引,如quadkey或mysql空間擴展。

+0

如何使用圓形(因爲我不想要多邊形) – Hunt 2012-02-25 09:50:49

+0

@Hunt:在該示例中,封閉多邊形僅用作空間索引。如果你不想使用空間索引,你可以從WHERE子句中刪除它。用戶Ray Perea使用空間索引和harvesine公式。 – Bytemain 2012-02-25 11:03:26

+0

您的意思是我應該刪除WHERE子句,並將第一個參數作爲所有用戶存儲在數據庫中,並將第二個參數作爲請求此查詢的當前用戶 – Hunt 2012-02-25 11:16:46