Cập nhật hàng cơ sở dữ liệu với các điểm nằm trong đa giác


10

Tôi có một DB PostGIS / Postgresql có hai bảng trong đó. Một với hình học điểm và cái kia đại diện cho ranh giới quốc gia dưới dạng đa giác. Tôi muốn thêm tên quốc gia mà mỗi điểm giao nhau với mỗi hàng trong bảng điểm của tôi. Có thể là một truy vấn cập nhật lớn. Tôi nghĩ rằng điều này có thể thực hiện bằng cách sử dụng SQL thẳng nhưng tôi không biết bắt đầu từ đâu. Bất kỳ lời khuyên nào về điều này sẽ được đánh giá rất cao ...

Câu trả lời:


9

Một tùy chọn khác, không cần chức năng

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

Tôi nghi ngờ (mặc dù tôi chưa thử nghiệm) rằng điều này sẽ nhanh hơn việc sử dụng hàm lồng nhau như trong ví dụ của bạn.

Đầu ra của tôi từ chạy giải thích (hy vọng bạn trông tương tự). Nếu bạn đã có nhiều kết quả Seq Scan hơn, thì đó là điều cần xem xét, có lẽ các chỉ mục không được thiết lập đúng.

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)"

Tuyệt vời! Điều này dường như cũng nhanh hơn rất nhiều. Cảm ơn!
AdamEstrada

4

OK ... Tôi đã thực hiện một chút hack và thấy rằng CHỨC NĂNG SQL đưa tôi đến gần hết. Bất cứ ai có bất kỳ suy nghĩ về việc này để cầu?

 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.