PostGISでスパイダーダイアグラム(ハブライン)を作成する方法


8

PostGISは初心者ですが、たくさん読んでいます。私が探しているのは、PostGISで「スパイダーダイアグラム」(「希望線」または「ハブライン」とも呼ばれる)を作成できる機能です。

例として、食料品店(ポイント)からその食料品店のすべてのジオコーディングされた顧客の住所(ポイント)に線を引きます。もちろん、数百の店舗と数千の顧客がいると想像してください。ソフトウェアが起点と終点の接続を認識できるように、各ストアは各顧客ポイントがフィールド内に埋め込む固有のIDを持っていると想像します。

このタスクを実行する単純なST_関数はありますか、それともタスクを実行するために複数のクエリを組み合わせる必要がありますか?

回答:


9

データベーススキーマが次のようになっているとします。

table customer:                     table shops:
customer_id | shop_id | the_geom    shop_id | the_geom
--------------------------------    ------------------
       1000 |     100 |    ...          100 |    ...
       1001 |     100 |    ...          101 |    ...
       1002 |     101 |    ...

次のステートメントは、ショップ100の「スパイダーダイアグラム」を作成します。

SELECT c.customer_id, c.shop_id, ST_MakeLine(c.the_geom,s.the_geom)
FROM customer as c JOIN shops as s
     ON c.shop_id = s.shop_id
WHERE shop_id = 100

ドキュメント:http : //postgis.net/docs/ST_MakeLine.html


このコードは初めて完全に機能しました。すべての顧客からすべての店舗へのラインを作成したかったため、削除したのはWHEREステートメントだけでした。優秀な!
RyanKDalton 2010年

9

質問は多かれ少なかれ答えられています、私はいくつかのコメントを追加して、空間SQLでこのようなことを行う柔軟性と力を指摘したいと思います

私が質問を読んだとき、それは2つの質問に分けることができます。異なるテーブルの行を組み合わせる方法に関するGISの質問とSQLの質問。

先に述べたように、gis-partは、ラインに接続したいのが2つのポイントである場合、ST_MakeLineで解決するのが最善です。ラインまたはポリゴンの場合は、代わりにST_Shortestlineを使用して、最も近いポイント間のジオメトリからラインを取得できます。これは、ポイント、ライン、ポリゴンの両方で機能します。

もう1つは、適切な店舗ポイントを適切な顧客ポイントに接続する方法です。

それは基本的なデータベースの質問です。それを理解することで、PostGISを使用することに多くの喜びがもたらされます。

最も簡単な状況は、多くの顧客がいる1つの店舗です。次に、1つの顧客テーブルとストアポイントだけが必要で、次のようになります。

Select ST_Makeline(customers.the_geom, yourPoint) from custmers;

テーブルに唯一のストアがある場合、次のようになります。

Select ST_Makeline(customers.the_geom, stores.the_geom) from custmers, stores;

しかし、多くの店舗があり、各顧客が1つの店舗のみを使用している場合は、他の回答のようなソリューションがここに表示されます。次に例を示します。

Select ST_Makeline(customers.the_geom, stores.the_geom) 
 from custmers, stores
   where customers.storeid = stores.id;

PostgreSQLはそのクエリを次のように処理します。

    Select ST_Makeline(customers.the_geom, stores.the_geom) 
     from custmers inner join stores 
      on customers.storeid = stores.id;

しかし、現実の世界では、ほとんどの顧客が多くの店舗を利用しているという状況に陥るでしょう。以前の例では、1つの店舗と多くの顧客との関係がありましたが、今は多対多の状況にあります。多くの店舗を利用する多くのお客様。

次に、時々見られる悪い解決策があります。人々は、彼が使用する店舗ごとに1つの新しい顧客行を追加します。たとえば彼の住所を変更したい場合、多くの場所でそれを行わなければならない場合、それは多くの問題を引き起こします。それを行うためのより正確なデータベースは、「リンクテーブル」を作成することです。それが英語で正しい単語かどうかはわかりませんが、とにかく。これは、顧客が使用する各店舗に関する顧客の特定のデータをすべて保持するテーブルです。したがって、3つのテーブルがあります。店舗と、店舗が開いているときのようなすべての属性、および連絡先の電話番号を備えたもの。次に、顧客の住所と電話番号が記載された顧客テーブルがあります。次に、ストアのIDを含むこの「リンクテーブル」があります。顧客のID、および特定の店舗への訪問頻度、店舗までの距離、または作成しているこのラインなどの追加情報(ただし、距離とラインは必要に応じてオンザフライで作成する方が適切です)。この新しいテーブルでは、クエリは次のようになります。

Select ST_Makeline(customers.the_geom, stores.the_geom) 
  from customers inner join  
     c_s_link_table on customers.id = c_s_link_table.customerid 
     inner join stores 
     on c_s_link_table.storeid = stores.id;

次に、完全な柔軟性があります。たとえば、顧客がその店を月に何回訪問するかをリンクテーブルに追加するとします。次に、次のようなクエリを記述できます。

Select ST_Makeline(customers.the_geom, stores.the_geom), 
c_s_link_table.visits_per_month from
 customers inner join c_s_link_table on customers.id = c_s_link_table.customerid 
  inner join stores on c_s_link_table.storeid = stores.id;

次に、この属性、visits_per_monthを使用して、各店舗の訪問数を示す地図上の線の太さを定義できます。


4

PostGISでスパイダーダイグラムを行う1つの方法は、ST_MakeLine関数を使用することです。以下の例をご覧ください。

SELECT ST_MakeLine(a.the_geom, b.the_geom), a.id as customer_id, a.store_id 
FROM customers a, stores b WHERE a.store_id = b.id

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