OK-私はこれに約3か月間オンとオフで取り組んできましたが、出くわしたすべての地理的近接式を使い果たしたので、正しい結果を得るのに近づいていません。助けを求めてください。
狙い
私は店舗検索のかなり基本的な実装を設定しています。ユーザーは郵便番号を入力し、事前定義された検索範囲のリストから選択します。gmaps APIは、このアドレスの緯度/経度座標を生成し、それらをphpスクリプトに渡します。このスクリプトでは、ユーザー座標がmysqlデータベーステーブル(以下の構造)に対して照会されます。
post_id int(11)
post_type varchar(20)
lat float(10,6)
lng float(10,6)
このクエリの結果(投稿ID)は、マップマーカーデータを含むXMLを生成するワードプレスクエリに入力されます。(wordpressクエリはpost__inとposts_per_page -1を使用して、クエリによって生成されたすべてのIDの情報を表示します
問題
一言で言えば、私が遭遇したHaversine式のすべての実装では、マーカーが欠落しているようです。具体的には、ユーザーが入力した座標に非常に近いマーカーです(正確にはわかりませんが、約500m以内だと思います)。これは、ユーザーが郵便番号を入力し、その場所のすぐ近くに店舗が表示されないかのように、大きな問題です。
さまざまなチュートリアルから掘り下げたフォーラムラの約8つの異なる順列を試しましたが、同じ結果が得られました。以下は、ユーザーが入力した位置に非常に近いものを除くすべてのマーカーを提供するサイトで現在使用している式です。
$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'];
}
ここでMikePelleyによって提案された1つの式がありました:ジオロケーションSQLクエリが正確な場所を見つけられません
この数式は、ユーザーが入力した場所に非常に近いマーカーを示しているように見えましたが、指定された半径内に表示されるべき他のマーカーを見逃していました。混乱を解消するために、これは私が使用したコードです。
$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'];
}
リクエスト
基本的に、これらのコードブロックのどちらも正しいマーカーを表示していない理由を知りたいと思います。誰かがコードの改善を提案したり、私が見逃したかもしれないいくつかのリソースに私を向けることができれば、それは素晴らしいことです
編集
私の疑似回答は機能していると思いましたが、それでも問題が解決していませんでした。私は今、非常に異なる方法を採用することになりました。ここで見つけることができる非常に優れたjqueryストアロケーターを使用しています:http ://www.bjornblog.com/web/jquery-store-locator-plugin
そこにあるすべてのプロジェクトで機能するわけではありませんが、私のニーズには完璧です(そして機能します!)