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です。