Page 86 - 6430
P. 86

Це  -  приклад  "просторового  об'єднання"  (spatial  join),  в
            якому  об'єднуються  дані  з  двох  таблиць  (join),  але  замість

            звичайного реляційного підходу до об'єднання (по  зовнішньому
            ключу), в якості умови об'єднання використовується просторове
            умова взаімоположенія ("міститься в") :

                     SELECT  m.name,  sum (ST_Length (r.the_geom)) / 1000 as
            roads_km
                     FROM   bc_roads AS r,  bc_municipality AS m

                     WHERE  ST_Contains (m.the_geom, r.the_geom)
                     GROUP BY m.name
                     ORDER BY roads_km;


                     name | roads_km
                     ----------------------------+------------------
                     SURREY | 1539.47553551242

                     VANCOUVER | 1450.33093486576
                     LANGLEY DISTRICT | 833.793392535662
                     BURNABY | 773.769091404338
                     PRINCE GEORGE | 694.37554369147

                     ...
                     Цей запит виконується помітний час, тому що всі дороги в
            таблиці  впливають  на  кінцевий  результат  (для  нашого

            конкретного  прикладу  таблиці  -  це  близько  250K  доріг).  Для
            невеликих покриттів (від кількох сотень до кількох тисяч записів)
            відповідь може бути дуже швидким.

                     5.Створити нову таблицю з усіма вулицями в місті "Prince
            George".
                      Це  -  приклад  "накладання"  (overlay),  яке  використовує

            просторові  дані  з  двох  таблиць  і  заносить  результат  в  нову
            таблицю.  На  відміну  від  показаного  вище  "просторового
            об'єднання",  запит  створює  нові  геометрії.  Оверлей  схожий  на
            просторовий join з турбонаддувом, і корисний для більш точної

            аналітичної роботи:
                     CREATE TABLE pg_roads as
                     SELECT

                       ST_Intersection             (r.the_geom,            m.the_geom)             AS
            intersection_geom,
                       ST_Length (r.the_geom) AS rd_orig_length,
                       r. *

                                                        86
   81   82   83   84   85   86   87   88   89   90   91