ホームページ > Java > &#&チュートリアル > SQLite で緯度と経度を使用して最も近い場所を効率的に見つけるにはどうすればよいですか?

SQLite で緯度と経度を使用して最も近い場所を効率的に見つけるにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-10 22:16:09
オリジナル
972 人が閲覧しました

How to Efficiently Find the Nearest Locations Using Latitude and Longitude in SQLite?

SQLite で緯度と経度を使用して最も近い場所を検索する

地理データを操作する場合、多くの場合、指定した場所に最も近い場所を検索する必要があります。ポイント。 SQLite では、球上の距離を計算するための組み込み関数がないため、このタスクは少し難しい場合があります。

近似とフィルタリング

これを克服するには制限がある場合、一般的なアプローチは近似とフィルタリングを使用することです。最初のステップは、指定された点の周囲の可能な位置の範囲を推定することです。これは、その点の周囲に長方形を形成する 4 つの点を計算することで実行できます。これらのポイントを使用すると、SQLite データをフィルタリングして、この長方形の近似内の位置のみを取得できます。

距離の計算

フィルタリングされた位置のリストを取得したら、次はステップは、各位置と指定された点の間の距離を計算することです。これは、Haversine 公式として知られる公式を使用して行うことができます。ただし、SQLite には Haversine 式の組み込み実装がないため、Java でカスタム関数を定義する必要があります。

カスタム関数

Java でのカスタム関数の定義は、org.sqlite.Function ライブラリを使用して行うことができます。これには org.sqlite.jar 依存関係が必要であり、アプリのサイズが大幅に増加する可能性があります。これを回避するには、カスタム関数を必要とせずに 2 点間の距離を計算する以下のメソッドを使用できます。

public static double getDistanceBetweenTwoPoints(PointF p1, PointF p2) {
    double R = 6371000; // m
    double dLat = Math.toRadians(p2.x - p1.x);
    double dLon = Math.toRadians(p2.y - p1.y);
    double lat1 = Math.toRadians(p1.x);
    double lat2 = Math.toRadians(p2.x);

    double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2)
            * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    double d = R * c;

    return d;
}
ログイン後にコピー

フィルタリングされた位置をループして各点までの距離を計算することで、指定した地点に最も近い場所を特定できます。

並べ替え

結果を並べ替えます。距離は、カスタム並べ替えアルゴリズムまたは Collections.sort() などのライブラリを使用して Java コードで実行できます。これにより、最も近い場所を近い順に表示できます。

もっと良い方法はありますか?

上記のアプローチは効率的で、Android アプリケーションで一般的に使用されています。ただし、組み込みの距離関数を使用せずに SQLite で最も近い場所を見つける真に「より良い」方法はありません。

以上がSQLite で緯度と経度を使用して最も近い場所を効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート