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