다각형 내에있는 점으로 데이터베이스 행 업데이트


10

두 개의 테이블이있는 PostGIS / Postgresql DB가 있습니다. 하나는 점 기하학을 가지고 있고 다른 하나는 다각형으로 국가 경계를 나타냅니다. 각 포인트가 교차하는 국가 이름을 포인트 테이블의 각 행에 추가하고 싶습니다. 하나의 큰 업데이트 쿼리 일 수 있습니다. 이것이 직선 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 Scan 결과를 얻는다면 살펴볼 것이 있습니다. 아마도 인덱스가 제대로 설정되지 않았을 것입니다.

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

OK ... 약간 해킹을 해본 결과 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.