0

関連付けられた経度、緯度、半径 (m 単位)、および notificationID 値が格納されているユーザーのデータベースがあります。

ユーザーがアプリにログインすると、経度と緯度を確認し、次の基準に従う通知 ID のリストを取得する必要があります。

ユーザー A は、半径 1000m 以内の人からの通知を受け取りたいと考えています。ユーザー B は、半径 20000m 以内の人からの通知を受け取りたいと考えています。ユーザー C は、半径 5000m 以内の人からの通知を受け取りたいと考えています。

そのため、ユーザー C がプッシュ通知を送信すると、ユーザー A が実際にはユーザー B よりもユーザー C に近い場合でも、ユーザー A ではなくユーザー B が受信する可能性があります。

これが不明確な場合は申し訳ありませんが、説明するのは難しいと思います。

特定の範囲内の座標を返すクエリを以前に実行しました.50m(以下)などですが、私が苦労しているのは、各人の個々の半径の計算と、それが他のユーザーからの通知。

set @orig_lat= mysql_real_escape_string($_POST['Latitude']);
set @orig_lon=mysql_real_escape_string($_POST['Longitude']);
set @dist= mysql_real_escape_string($_POST['Distance']);

$Search_Query= "SELECT *,
3956 * 2 * ASIN(SQRT( POWER(SIN((@orig_lat -
abs( 
dest.lat)) * pi()/180 / 2),2) + COS(@orig_lat * pi()/180 ) * COS( 
abs
(dest.lat) *  pi()/180) * POWER(SIN((@orig_lon – dest.lon) *  pi()/180 / 2), 2) ))
as distance FROM hotels dest having distance < @distORDER BY distance limit 10";
4

1 に答える 1

0

そのクエリでは、毎回フル テーブル スキャンが使用されます。人々が GIS を使用するのはそのためです (TLama が DBMS を切り替える必要があると考える理由は不明です。MySQL には地理空間機能もあります)。

必要な精度のレベルについては言及していません。私だったら、おそらく円や GIS を気にしないでしょう。半径を水平度と垂直度に計算した後、バウンディング ボックスを使用するだけです。これを where 句内に実装すると、インデックスを効果的に使用できます。ボックスには、隅に余分な 22% の領域が含まれますが、HAVING 句でそれらを除外できます。

于 2015-01-09T12:32:17.707 に答える