PostGIS:住所範囲から家の番号を概算する


8

カナダ向けの逆ジオコーダーを開発しています。これまでのところ、緯度/経度を指定すると、最寄りの道路(ラインセグメント)を見つけることができます。これには、ラインセグメントの方向と、ストリートの両側の住所範囲が含まれます。私は現在、プログラムで最も近い家の番号を指定された緯度/経度のポイントに概算するための最良の方法を見つけようとしています。

以下は、ストリートデータを含む行の例です。

-[ RECORD 1 ]-
[...]
l_adddirfg | Same Direction
l_hnumf    | 3219
l_hnuml    | 3235
l_stname_c | Breen Road North-west
r_adddirfg | Same Direction
r_hnumf    | 3224
r_hnuml    | 3236
r_stname_c | Breen Road North-west
the_geom   | 0105000020E610000001000000010200000002000000B0F6990E78885CC088DF2B5F3C8C49400875B39A89885CC0A0BCA6AC4B8C4940

したがって、「the_geom」ラインセグメントの近くにある緯度/経度の座標が与えられた場合、人は、ポイントが道路のどちら側にあるか(左側または右側)と、セグメントに沿った距離を視覚的に確認できます。家番号を概算します。たとえば、ポイントが通りの4分の3右側にある場合、フィールドr_hnumf(右側、最初の番号)とr_hnuml(右側、最後の番号)を使用します...住所はおそらく近いですに:

3232 Breen Road North-west

私が探しているのは、これをPostGIS(これは初めてです)で計算/近似するか、または行がフェッチされた後のアプリケーションレイヤーでのベストプラクティスです。

ありがとう!

回答:


11

ソリューションは完全にPostGISで構築できます。

ポイント(家の場所、それをPOINTとしてモデル化しました)とストリートセグメント(このポイントに最も近いストリートのセグメント、LINESTRINGとしてモデル化)を指定すると、次のようになります。

  • ポイントがストリートセグメントの左側にあるかどうかを確認する方法

可能な解決策は、家に最も近い道路セグメント上のポイントを決定し、このポイントが家の左側または右側にあるかどうかを決定することです(&<最初のジオメトリ引数が重複するか左側にある場合、演算子はtrueを返します) 2番目のジオメトリ引数)。&<実際にはバウンディングボックスで動作しますが、ポイントを使用しているため、これは問題になりません。

osm=# select 'POINT(4 1)'::geometry &< st_closestpoint('LINESTRING(1 1,2 3,6 6)'::geometry, 'POINT(4 1)'::geometry) as houseIsOnLeft;
 houseisonleft 
---------------
 f
(1 row)
  • 通りのセグメントにある家はどれくらい遠いですか

繰り返しますが、これは、ストリートセグメントのどこに沿って(0と1の間の値)が家に最も近いストリート上のポイントであるかを意味します。そのための組み込み関数st_line_locate_pointがあります:

osm=# select st_line_locate_point('LINESTRING(1 1,2 3,6 6)'::geometry, 'POINT(2 1)'::geometry);
 st_line_locate_point 
----------------------
   0.0618033988749895
(1 row)

osm=# select st_line_locate_point('LINESTRING(1 1,2 3,6 6)'::geometry, 'POINT(5 6)'::geometry);
 st_line_locate_point 
----------------------
    0.889442719099992
(1 row)

上記で使用した折れ線と点の図


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.