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

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 サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。