Оновіть рядок бази даних з точками, що підпадають під багатокутники


10

У мене є DBG PostGIS / Postgresql, в якій є дві таблиці. Один з точковими геометріями, а другий, який представляє кордони країни як багатокутники. Я хотів би додати назву країни, з якою кожна точка перетинається, до кожного рядка моєї точкової таблиці. Можливо, як один великий запит на оновлення. Я думаю, що це можливо зробити за допомогою прямого SQL, але я не знаю, з чого почати. Будь-яка порада з цього питання буде дуже вдячна ...

Відповіді:


9

Ще один варіант, не потребуючи функції

update points set country = t1.country from 
(
    select points.oid, countries.name as country from
    countries INNER JOIN points on st_contains(countries.wkb_geometry,points.wkb_geometry)
) t1 
where t1.oid = points.oid

Я підозрюю (хоча я не перевіряв), що це буде швидше, ніж використання вкладеної функції, як у вашому прикладі.

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

Update on points  (cost=1.18..29.40 rows=121 width=129)"
  ->  Nested Loop  (cost=1.18..29.40 rows=121 width=129)"
        Join Filter: _st_contains(countries.geometry, public.points.geometry)"
        ->  Hash Join  (cost=1.18..2.37 rows=28 width=220)"
              Hash Cond: (public.points.oid = public.points.oid)"
              ->  Seq Scan on points  (cost=0.00..1.08 rows=28 width=114)"
              ->  Hash  (cost=1.08..1.08 rows=28 width=110)"
                    ->  Seq Scan on points  (cost=0.00..1.08 rows=28 width=110)"
        ->  Index Scan using "countries_Idx" on countries  (cost=0.00..0.91 rows=1 width=414)"
              Index Cond: (geometry && public.points.geometry)"

Дивовижно! Здається, це теж набагато швидше. Дякую!
AdamEstrada

4

Гаразд ... Я трохи зламав і виявив, що функція SQL FUNCTION отримує мене більшу частину шляху. У когось є думки щодо того, щоб взяти це до мосту?

 CREATE OR REPLACE FUNCTION getcountry (
       country_geom geometry
    ) RETURNS TABLE(country text) AS $$
        SELECT b.name as country FROM  
                    geonames d, world_borders b WHERE
                    $1 && b.wkb_geometry 
                    AND intersects($1, b.wkb_geometry) ;
  $$ LANGUAGE SQL;

UPDATE geonames 
    SET country = val
    FROM (SELECT getcountry(point_geom) FROM geonames) AS val
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.