বহুভুজের মধ্যে থাকা পয়েন্টগুলির সাথে ডাটাবেস সারি আপডেট করুন


10

আমার একটি পোস্টজিআইএস / পোস্টগ্র্যাস্কিল ডিবি রয়েছে যার দুটি টেবিল রয়েছে। একটি পয়েন্ট জ্যামিতি সহ এবং অন্যটি বহুভুজ হিসাবে দেশের সীমানা উপস্থাপন করে। আমি আমার পয়েন্ট টেবিলের প্রতিটি সারির সাথে প্রতিটি পয়েন্ট ছেদ করে এমন দেশের নাম যুক্ত করতে চাই। সম্ভবত একটি বড় আপডেট ক্যোয়ারী হিসাবে। আমি সোজা এসকিউএল ব্যবহার করে এটি করা সম্ভব বলে মনে করি তবে কোথা থেকে শুরু করব তা আমি জানি না। এ সম্পর্কে যে কোনও পরামর্শ প্রশংসিত হবে ...

উত্তর:


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

আমি সন্দেহ করি (যদিও আমি পরীক্ষা করিনি) আপনার উদাহরণের মতো নেস্টেড ফাংশনটি ব্যবহার করার চেয়ে এটি আরও দ্রুত হবে।

চলমান থেকে আমার আউটপুট ব্যাখ্যা (আশা করি আপনার চেহারা অনুরূপ)। আপনি যদি আরও সিক স্ক্যান ফলাফল পেয়ে থাকেন তবে তা দেখার মতো এটি সম্ভবত সূচিগুলি সঠিকভাবে সেট আপ করা হয়নি।

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

অসাধারণ! এটি খুব দ্রুত হতে পারে বলে মনে হয়। ধন্যবাদ!
অ্যাডেমস্ট্রদা

4

ঠিক আছে ... আমি কিছুটা হ্যাকিং করেছি এবং দেখেছি যে কোনও এসকিউএল ফাংশন আমাকে সেখানে বেশিরভাগ পথে নিয়ে যায়। এটিকে সেতুতে নিয়ে যাওয়ার বিষয়ে কারও কি ভাবনা আছে?

 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.