半径 5 マイル以内の建物の位置を特定する: 地理空間ソリューション
この記事は、指定された座標から半径 5 マイル以内にあるすべての建物を識別するという共通の課題に取り組みます。 この空間クエリに対する高パフォーマンスのソリューションを紹介します。
シナリオ:
「名前」、「緯度」 (「lat」)、「経度」 (「lng」) の列を持つ「建物」データベース テーブルを想像してください。 各建物の位置は緯度と経度によって定義されます。
問題:
目的は、特定の座標ペアから 5 マイル以内にあるすべての建物を取得することです (例: -84.38653999999998、33.72024)。
非効率なアプローチ:
緯度と経度の値を個別に保存した ST_CONTAINS
のような関数を使用するのは非効率的です。 このアプローチでは、クエリ処理に大幅なオーバーヘッドが追加されます。
最適なソリューション: 空間データ型の活用
最適なパフォーマンスを得るには、座標をジオメトリまたは地理データ型として保存します。これにより、距離の計算が大幅に効率化されます。 PostGIS 関数の使用をデモします。
効率的な方法: ST_DWithin
および ST_Distance
PostGIS は、効率的な距離計算のための強力な空間関数を提供します。 ST_DWithin
と ST_Distance
の使用方法は次のとおりです。
ST_DWithin
の使用 (ブール結果):
ST_DWithin
は、ジオメトリが指定された距離内にあるかどうかを示すブール値を返します。
<code class="language-sql">SELECT name, lng, lat, ST_Distance('POINT(-4.6314 54.0887)'::geography, ST_MakePoint(lng,lat)::geography) * 0.000621371 AS distance FROM building WHERE ST_DWithin('POINT(-4.6314 54.0887)'::geography, ST_MakePoint(lng,lat)::geography, 8046.72); -- 8046.72 meters = 5 miles</code>
ST_Distance
の使用 (マイル単位の距離):
ST_Distance
は距離をメートル単位で返します。換算係数を使用してマイルに換算します。
<code class="language-sql">SELECT name, lng, lat, ST_Distance('POINT(-4.6314 54.0887)'::geography, ST_MakePoint(lng,lat)::geography) * 0.000621371 AS distance FROM building WHERE ST_Distance('POINT(-4.6314 54.0887)'::geography, ST_MakePoint(lng,lat)::geography) * 0.000621371 <= 5;</code>
これらの空間関数を使用し、座標を適切に保存することで、効果的な地理空間アプリケーションに不可欠な、半径 5 マイル以内の建物の正確かつ効率的な検索を実現できます。 (-4.6314, 54.0887)
を実際の座標に置き換えることを忘れないでください。
以上が指定された座標から 5 マイル以内の建物を効率的に検索するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。