পোস্টজিআইএস ব্যবহার করে 2 পয়েন্ট দেওয়া নিকটতম লাইনটি সন্ধান করছেন?


9

আমার একটি টেবিল টি রয়েছে যাতে একটি কলাম রয়েছে line_positionsযা টাইপ লাইনের। 2 পয়েন্ট দেওয়া আমি নিকটতম লাইনটি খুঁজতে চাই যা যথেষ্ট পরিমাণে (10 কিলোমিটারেরও কম) এবং এটি যে বিন্দুটি আমি এড়াতে চাই তার খুব কাছাকাছি যেতে পারে না (20km সর্বনিম্ন)। বর্তমানে আমি ব্যবহার করি

SELECT t.*
FROM path t
WHERE
  ST_DWithin(ST_GeographyFromText('Point(69.835 22.596)'), t.line_positions, 10000, FALSE)  AND
  ST_DWithin(ST_GeographyFromText('Point(69.856 22.519)'), t.line_positions, 10000, false) AND
  NOT ST_DWithin(ST_GeographyFromText('Point(-79.804 9.141)'), t.line_positions, 20000, false)
ORDER BY
  ST_Distance(ST_GeographyFromText('Point(69.835 22.576)'), t.line_positions, false) +
  ST_Distance(ST_GeographyFromText('Point(69.856 22.519)'), t.line_positions, false)
  ASC
LIMIT 1

ix_path_line_positionsলাইন_পজিশন কলামে একটি গিস্ট সূচক রয়েছে ।

এটি টি কিন্তু 100000 সারিগুলির জন্য 3 থেকে 30 এর মধ্যে কিন্তু ধীর গতিতে কাজ করে।

বিশ্লেষণ দেয় যে ব্যাখ্যা:

Limit  (cost=9.95..9.95 rows=1 width=1432) (actual time=21729.253..21729.254 rows=1 loops=1)
   ->  Sort  (cost=9.95..9.95 rows=1 width=1432) (actual time=21729.251..21729.251 rows=1 loops=1)
         Sort Key: ((_st_distance('0101000020E61000003D0AD7A370755140FA7E6ABC74933640'::geography, line_positions, '0'::double precision, false) + _st_distance('0101000020E6100000105839B4C8765140BE9F1A2FDD843640'::geography, line_positions, '0'::double precision, false)))
         Sort Method: top-N heapsort  Memory: 26kB"
         ->  Index Scan using ix_path_line_positions on path t  (cost=0.28..9.94 rows=1 width=1432) (actual time=93.490..21710.562 rows=690 loops=1)
           Index Cond: ((line_positions && '0101000020E61000003D0AD7A3707551407F6ABC7493983640'::geography) AND (line_positions && '0101000020E6100000105839B4C8765140BE9F1A2FDD843640'::geography))
           Filter: (('0101000020E61000003D0AD7A3707551407F6ABC7493983640'::geography && _st_expand(line_positions, '10000'::double precision)) AND ('0101000020E6100000105839B4C8765140BE9F1A2FDD843640'::geography && _st_expand(line_positions, '10000'::double precision)) AND _st_dwithin('0101000020E61000003D0AD7A3707551407F6ABC7493983640'::geography, line_positions, '10000'::double precision, false) AND _st_dwithin('0101000020E6100000105839B4C8765140BE9F1A2FDD843640'::geography, line_positions, '10000'::double precision, false) AND ((NOT ('0101000020E6100000FA7E6ABC74F353C0D578E92631482240'::geography && _st_expand(line_positions, '20000'::double precision))) OR (NOT (line_positions && '0101000020E6100000FA7E6ABC74F353C0D578E92631482240'::geography)) OR (NOT _st_dwithin('0101000020E6100000FA7E6ABC74F353C0D578E92631482240'::geography, line_positions, '20000'::double precision, false))))
           Rows Removed by Filter: 15365
Planning time: 0.491 ms
Execution time: 21729.321 ms

আমি কীভাবে এটি উন্নতি করতে পারি? পরিবর্তে জ্যামিতি গণনা ব্যবহার করে (তবে আমার ট্র্যাকটি কয়েক হাজার কিলোমিটার বিস্তৃত হতে পারে, গণনা করা দূরত্বগুলি কি সঠিক হবে)? <-> কেএনএন অপারেটরটি ব্যবহার করছেন (তবে যেহেতু আমি 2 টি দূরত্বের জোড়ে অর্ডার দিচ্ছি, তবে কি এটি কোনও সূচক সূচকটি ব্যবহার করবে বলে মনে হয় না)?


কোডটি কার্যকর করার আগে আপনি work_mem প্যারামিটারটি বাড়ানোর চেষ্টা করতে পারেন । উদাSET work_mem TO '200MB';
ইয়ারোস্লাভ

উত্তর:


1

দুটি প্রদত্ত পয়েন্টগুলি সর্বদা একে অপরের 10 কিলোমিটারের মধ্যে থাকে। যদি তাই হয় তবে আপনি দুটি পয়েন্টকে একটি লাইন তৈরি করতে এবং দুটিটির পরিবর্তে একটি ST_DWithin সম্পাদন করতে পারেন। এটি কিছুটা উন্নতি করতে পারে।

SELECT t.*
FROM path t
WHERE
  ST_DWithin(ST_GeomFromText('LINESTRING(69.835 22.596,69.856 22.519)'), t.line_positions, 10000, FALSE)  
  NOT ST_DWithin(ST_GeographyFromText('Point(-79.804 9.141)'), t.line_positions, 20000, false)
ORDER BY
  ST_Distance(ST_GeographyFromText('Point(69.835 22.576)'), t.line_positions, false) +
  ST_Distance(ST_GeographyFromText('Point(69.856 22.519)'), t.line_positions, false)
  ASC
LIMIT 1

না, 2 পয়েন্টগুলি একে অপরের 10 কিলোমিটারের মধ্যে নয়, তারা হাজার কিলোমিটার দূরে থাকতে পারে। সীমাবদ্ধতাটি হ'ল উভয়ই লাইন থেকে 10 কিলোমিটারেরও কম দূরে, তবে এটি সত্যই অনেক দূরে থাকতে পারে কারণ লাইনগুলি হাজার কিলোমিটার বিস্তৃত ছিল।
Go4It
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.