沒有結果 - 我一直在摔跤約3個月左右,因爲我已經用盡了所有地理鄰近公式,我已經遇到過,我我沒有接近取得正確的結果,我想現在是時候尋求一些幫助。由於幾何鄰近公式(商店定位器)
的AIM
我設置了一個商店定位器的一個相當基本實現。用戶輸入他們的郵政編碼並從預定義的搜索半徑列表中進行選擇。 gmaps API爲該地址生成緯度/經度座標,並將它們傳遞給php腳本。在該腳本的用戶COORDS被查詢針對MySQL數據庫表(下面結構)
post_id int(11)
post_type varchar(20)
lat float(10,6)
lng float(10,6)
此查詢(後IDS)的結果被輸入到其生成包含地圖標記數據的XML一個WordPress查詢。 (WordPress的查詢使用post__in和posts_per_page -1以顯示由查詢
的問題
簡而言之產生的所有ID信息,haversine公式我遇到的每一個執行似乎導致在丟失的標記 - 特別是任何非常接近用戶的標記輸入的座標(不知道確切的,但我認爲它在大約500米以內)。這是一個很大的問題,如果用戶輸入他們的郵政編碼,並有一家商店非常接近到他們的位置它不會顯示出來
我已經嘗試過8個不同的forumla排列,我已經找到了fr在各種教程中獲得相同的結果。下面是我目前使用的提供除了那些非常接近用戶的所有標記的網站上輸入位置的公式:
$center_lat = $_GET["lat"];
$center_lng = $_GET["lng"];
$radius = $_GET["radius"];
// Calculate square radius search
$lat1 = (float) $center_lat - ((int) $radius/69);
$lat2 = (float) $center_lat + ((int) $radius/69);
$lng1 = (float) $center_lng - (int) $radius/abs(cos(deg2rad((float) $center_lat)) * 69);
$lng2 = (float) $center_lng + (int) $radius/abs(cos(deg2rad((float) $center_lat)) * 69);
$sqlsquareradius = "
SELECT
post_id, lat, lng
FROM
wp_geodatastore
WHERE
lat BETWEEN ".$lat1." AND ".$lat2."
AND
lng BETWEEN ".$lng1." AND ".$lng2."
"; // End $sqlsquareradius
// Create sql for circle radius check
$sqlcircleradius = "
SELECT
t.post_id,
3956 * 2 * ASIN(
SQRT(
POWER(
SIN(
(".(float) $center_lat." - abs(t.lat)) * pi()/180/2
), 2
) + COS(
".(float) $center_lat." * pi()/180
) * COS(
abs(t.lat) * pi()/180
) * POWER(
SIN(
(".(float) $center_lng." - t.lng) * pi()/180/2
), 2
)
)
) AS distance
FROM
(".$sqlsquareradius.") AS t
HAVING
distance <= ".(int) $radius."
ORDER BY distance
"; // End $sqlcircleradius
$result = mysql_query($sqlcircleradius);
$row = mysql_fetch_array($result);
while($row = mysql_fetch_array($result)) {
// the contents of each row
$post_ids[] = $row['post_id'];
}
有1次的配方,我試過,被Mike佩利這裏建議:Geolocation SQL query not finding exact location
該公式似乎顯示非常接近用戶輸入位置的標記,但遺漏了應在給定半徑內顯示的其他標記。爲了消除混淆,這是我使用的代碼:
$center_lat = $_GET["lat"];
$center_lng = $_GET["lng"];
$radius = $_GET["radius"];
$sql = "
SELECT post_id, lat, lng,
truncate((degrees(acos(sin(radians(lat))
* sin(radians(".$center_lat."))
+ cos(radians(lat))
* cos(radians(".$center_lat."))
* cos(radians(".$center_lng." - lng))))
* 69.09*1.6),1) as distance
FROM wp_geodatastore HAVING distance <= ".$radius." ORDER BY distance desc
"; // End $sqlcircleradius
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
while($row = mysql_fetch_array($result)) {
// Print out the contents of each row
$post_ids[] = $row['post_id'];
}
的請求
基本上我想知道爲什麼沒有這些代碼塊都顯示正確的標記。如果任何人都可以建議對代碼進行任何改進或可能指向我往一些資源,我可能會錯過這將是巨大
編輯
以爲我psudeo答案工作,但事實證明那仍然有問題。我已經結束了一個非常不同的方式,現在我正在使用一個非常好的jQuery商店定位器,可以在這裏找到:http://www.bjornblog.com/web/jquery-store-locator-plugin
不適用於每個項目,但爲我的需要,它是完美的和工作!)
是否有你沒有使用MySQL內置geospacial功能的原因? http://dev.mysql.com/doc/refman/5.0/en/creating-a-spatially-enabled-mysql-database.html – Kenneth 2012-01-05 17:46:16
我很努力去理解代碼中的一些東西。爲什麼'HAVING'而不是'WHERE'? '(float)$ center_lat - ((int)$ radius/69)中的'int'和''以及另一個查詢中的'truncate'發生了什麼?在應用公式時請牢記這一事實:將赤道的一分經度定義爲海里。整數度是60海里。最後,嘗試擺脫'BETWEEN'並使用'WHERE a> = lat1 AND a <= lat2'來代替。它應該提供相同的查詢複雜性,並闡明瞭您搜索的範圍的包容性/排他性。 – 2012-01-06 01:49:06
@Kenneth - 我沒有使用地理空間查詢有幾個原因。首先,我使用[地理數據存儲插件](http://wordpress.org/extend/plugins/geo-data-store)來創建和維護我的標記數據表。這個插件生成我上面顯示的表結構。其次,我創建商店定位器類型地圖時遇到的絕大多數教程似乎都推薦了一種類似於所列的表結構。也許這些並不是最好的理由,但是我已經用目前的設置走到了這一步,我很確定我想要做的事情應該是可能的。 – FourStacks 2012-01-06 08:51:07