Postgres / postgisカーソル


8

各セグメントのStreetNameと最小/最大のアドレス範囲を持つ道路ネットワークがあります(つまり、StreetName = 'Main St'、最小= 100、最大= 199)。同様の情報を持つ個々の住所ポイントもあります(例:StreetName = 'Main St'、HouseNumber = 115)。

道路セグメントのfeatureid(gid)を、StreetNameが一致し、道路セグメントの最小/最大範囲内にある各住所ポイントに割り当てたいのですが。ArcGISでは、おそらく道路の検索カーソルを記述し、それが各道路セグメントを循環し、gid、name、min、&maxの値を取得してから、クエリステートメントを実行して、HouseNumbers内にあるすべての住所ポイントを検索します与えられたセグメント範囲(つまり、StreetName = 'Main St'で最小> = 100および最大<= 199であるAddressPointsを選択)、道路セグメントのgidを計算して、Address Pointレイヤーで選択されたポイントのフィールドに移動し、次に進みます。次の道路セグメントに移動して繰り返します。

  1. postgres / postgisまたは
  2. これを行うより効率的な方法はありますか?

回答:


8

あなたの質問を理解しているので、カーソルは必要ありません。これは、単純なSQLで行う非常に一般的で単純なタスクです。次のようなフィールドを持つ2つのテーブルを道路セグメントと住所ポイントと呼びます。

roadsegments
GID
the_geom
min_address
max_address

adresspoints
streetname
housenumber

次に、最初に次のようにaddresspointsテーブルにロードIDの列を作成できます。

ALTER TABLE adresspoints ADD COLUMN roadid integer;

次に、このフィールドを次のように更新できます。

UPDATE adresspoints SET roadid = roadsegmants.gid FROM 
roadsegments WHERE roadsegments.streetname=adresspoints.streetnames
AND addresspoints.housenumber >= roadsegments.min_address
AND addresspoints.housenumber <= roadsegments.max_address;

巨大なテーブルである場合は、次のようにアドレスポイントテーブルを再作成する方が効率的です。

CREATE TABLE new_addresspoints as
SELECT a.*, b.gid as roadid  
FROM addresspoints a inner join roadsegments b
on a.streetname=b.streetnames
AND a.housenumber >= b.min_address
AND a.housenumber <= b.max_addres;

高速に実行するには、テーブルとmin_address、max_address、housenumberの両方でstreetnameにインデックスを配置する必要があります。

HTH
ニクラス

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