geo_near
ポイントに近接する地理空間オブジェクトを決定します。
boolean geo_near(any*, any*, double)
1番目と2番目のパラメータany*
には、任意のジオメトリ・オブジェクトを指定できます。
この関数は、1番目のジオメトリが2番目のジオメトリからN mの距離内にあるかどうかを判断します。
2つのパラメータのいずれかが単一の有効なジオメトリ・オブジェクトを返さず、そのことがコンパイル時に検出された場合は、エラーが発生します。
実行時の動作は次のとおりです。
- いずれかのパラメータが0個または複数の項目を返した場合はfalseを返します。
- 最初の2つのパラメータのいずれかがNULLを返した場合はNULLを返します。
- 最初の2つのパラメータのいずれかが有効なジオメトリ・オブジェクトではない項目を返した場合は、falseを返します。
最終的に、最初の2つのパラメータの両方がそれぞれ単一のジオメトリ・オブジェクトを返す場合、1番目のジオメトリが2番目のジオメトリからN m以内の距離にあればtrueを返します。Nは3番目のパラメータで返される数値です。それ以外の場合はfalseを返します。
ノート:
geo_nearは、内部でgeo_within_distanceに変換され、2つのジオメトリ間の距離に(暗黙的な) ORDER BYが指定されます。ただし、問合せに(明示的な) ORDER BYがすでに存在する場合、距離による順序付けは実行されません。geo_near関数はWHERE句にのみ使用できます。この場合、最上位レベルの述語(ORまたはNOT演算子の下にネストされていない)にする必要があります。例1: 指定した場所の3km以内に病院はありますか。
SELECT
t.poi.name AS hospital_name,
t.poi.address.street AS hospital_address
FROM PointsOfInterest t
WHERE t.poi.kind = "hospital"
AND
geo_near(
t.poi.location,
{"type" : "point",
"coordinates" : [-122.03493933105469,37.32949164059004]
},
3000
);
説明:
PointsOfInterest
表を問い合せて、hospitalの行をフィルタします。geo_near
関数を使用して、指定された場所の3000m以内の病院をフィルタします。
結果:
{"hospital_name":"St. Marthas hospital","hospital_address":"18000 West Blvd"}
{"hospital_name":"Memorial hospital","hospital_address":"10500 South St"}
例2: 指定の場所から先の1マイル以内にあるガソリン・スタンドまでどれくらいの距離がありますか。
SELECT
t.poi.address.street AS gas_station_address,
geo_distance(
t.poi.location,
{
"type" : "point",
"coordinates" : [-121.90768646240233,37.292081740702365]
}
) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "gas station" AND
geo_near(
t.poi.location,
{
"type" : "point",
"coordinates" : [-121.90768646240233,37.292081740702365]
},
1600
);
説明:
PointsOfInterest
表を問い合せて、gas stationの行をフィルタします。geo_near
関数を使用して、指定された場所の1マイル(1600m)以内のガソリン・スタンドをフィルタします。- また、
geo_distance
関数を使用して、その場所とガソリン・スタンドの間の実際の距離をフェッチします。
結果:
{"gas_station_address":"33 North Avenue","distance_in_meters":886.7004173859665}
次の1マイル以内にある最も近いガソリン・スタンドまでの実際の距離は886mです。