Bagaimana cara membuat diagram laba-laba (garis hub) di PostGIS?


8

Saya agak baru di PostGIS tetapi saya sudah banyak membaca. Satu hal yang saya cari adalah fungsi yang memungkinkan pengguna untuk membuat "diagram laba-laba" (juga disebut "garis keinginan" atau "garis hub") di PostGIS.

Sebagai contoh, gambar garis dari toko kelontong (titik) ke semua alamat pelanggan (titik) geocode toko kelontong itu. Tentu saja, bayangkan, ada ratusan toko dan ribuan pelanggan. Saya akan membayangkan bahwa setiap toko akan memiliki ID unik yang setiap titik pelanggan akan tertanam dalam bidang sehingga perangkat lunak mengetahui koneksi asal-tujuan.

Apakah ada fungsi ST_ sederhana yang akan menyelesaikan tugas ini, atau apakah ini memerlukan menggabungkan beberapa kueri untuk menyelesaikan tugas?

Jawaban:


9

Dengan asumsi bahwa skema database Anda terlihat seperti ini:

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

Pernyataan berikut harus membuat "diagram laba-laba" untuk toko 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

Doc: http://postgis.net/docs/ST_MakeLine.html


Kode ini berfungsi sempurna pertama kali. Satu-satunya hal yang saya hapus adalah pernyataan WHERE, karena saya ingin membuat jalur dari semua pelanggan ke semua toko. Luar biasa!
RyanKDalton

9

Pertanyaannya kurang lebih dijawab, saya hanya ingin menambahkan beberapa komentar untuk menunjukkan fleksibilitas dan kekuatan melakukan hal-hal seperti ini dengan sql spasial

Ketika saya membaca pertanyaan itu dapat dibagi dalam dua pertanyaan. Satu pertanyaan GIS dan satu pertanyaan sql tentang cara menggabungkan baris dalam tabel yang berbeda.

Bagian gis seperti yang disebutkan sebelumnya sebaiknya diselesaikan dengan ST_MakeLine, jika itu dua poin yang ingin Anda sambungkan dengan baris Anda. Jika itu adalah garis atau poligon, Anda dapat menggunakan ST_Shortestline sebagai gantinya untuk mendapatkan garis dari geometri di antara titik terdekatnya. Itu akan bekerja dengan kedua titik, garis dan poligon.

Bagian lainnya adalah tentang bagaimana menghubungkan titik penyimpanan yang tepat dengan titik pelanggan yang tepat.

Itu adalah pertanyaan basis data dasar. Memahami hal itu akan memberi lebih banyak sukacita untuk menggunakan PostGIS.

Situasi paling mudah adalah satu toko dengan banyak pelanggan. Maka Anda hanya perlu satu tabel pelanggan dan titik toko Anda dan itu akan terlihat seperti:

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

Jika Anda memiliki satu-satunya toko di sebuah tabel, tampilannya akan seperti ini:

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

Tetapi jika memiliki banyak toko dan setiap pelanggan hanya menggunakan satu toko, Anda akan mendapatkan solusi yang mirip dengan jawaban lain di sini, misalnya:

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

PostgreSQL akan menangani permintaan itu dengan cara yang sama seperti:

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

Tetapi di dunia nyata Anda mungkin akan mendapatkan situasi bahwa sebagian besar pelanggan menggunakan banyak toko. Dalam contoh sebelumnya kami memiliki hubungan satu toko dengan banyak pelanggan, sekarang kami memiliki banyak situasi. Banyak pelanggan menggunakan banyak toko.

Lalu ada solusi buruk yang terkadang Anda lihat. Orang-orang menambahkan satu baris pelanggan baru untuk setiap toko yang ia gunakan. Itu akan menyebabkan banyak masalah jika Anda ingin mengubah alamatnya, Anda harus melakukannya di banyak tempat. Basis data yang lebih tepat untuk melakukannya adalah membuat "tabel tautan". Saya tidak tahu apakah itu kata yang tepat dalam bahasa Inggris. Itu adalah tabel yang menyimpan semua data spesifik untuk hubungan pelanggan dengan setiap toko yang dia gunakan. Jadi kamu punya tiga tabel. Satu dengan toko dan semua atribut milik toko seperti ketika itu terbuka dan nomor telepon untuk menghubungi. Maka Anda memiliki tabel pelanggan mungkin dengan alamat dan nomor telepon kepada pelanggan. Maka Anda memiliki "tabel tautan" ini yang harus menyertakan id untuk toko, id untuk pelanggan dan mungkin informasi tambahan seperti frekuensi mengunjungi toko tertentu, atau jarak ke toko, atau baris yang Anda buat (tetapi jarak dan garis lebih baik untuk dibuat dengan cepat saat Anda membutuhkannya). Kemudian dengan tabel baru ini, kueri Anda akan terlihat seperti:

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;

Maka Anda memiliki fleksibilitas penuh. Katakanlah misalnya Anda menambahkan ke tautan Anda berapa kali sebulan pelanggan mengunjungi toko itu. Kemudian Anda dapat menulis kueri seperti ini:

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;

maka Anda dapat menggunakan atribut itu, visits_per_month untuk menentukan ketebalan garis Anda di peta yang menggambarkan berapa banyak kunjungan yang didapat setiap toko.


4

Salah satu cara untuk melakukan spider digram di PostGIS adalah dengan menggunakan fungsi ST_MakeLine . Lihat contoh di bawah ini:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.