পোস্টজিআইএস ব্যবহার করে নিকটতম প্রতিবেশী গণনার অনুকূলকরণ


13

বহুভুজগুলির নিকটতম প্রতিবেশীদের গণনা করতে আমি পোস্টজিআইএস ব্যবহার করছি। আমি যা গণনা করতে চাই তা হ'ল প্রতিটি বহুভুজ থেকে নিকটতম বহুভুজের সর্বনিম্ন দূরত্ব।

এখন পর্যন্ত আমি এখানে মাইক টুউজের জবাব (যা আমি একটি ছোটখাটো পরিবর্তনের সাথে উদ্ধৃত করছি) থেকে দুর্দান্ত সহায়তা পেয়েছি :

SELECT 
  a.hgt AS a_hgt,
  b.hgt AS b_hgt,
  ST_Distance(a.the_geom, b.the_geom) AS distance_between_a_and_b
FROM 
  public."TestArea" AS a, public."TestArea" AS b
WHERE
  a.hgt !=  b.hgt AND ST_Distance(a.the_geom, b.the_geom) < 400

তারপরে আমি সর্বনিম্ন গণনা করেছি:

SELECT a_hgt, MIN(distance_between_a_and_b)
FROM public."lon_TestArea"
GROUP BY a_hgt

যাইহোক, আমার চ্যালেঞ্জটি হ'ল বহুগুণ (1000,000) এর জন্য এটি গণনা করা। উপরের গণনাটি প্রতিটি বহুভুজের সাথে প্রতিটি বহুভুজের তুলনা করার সাথে সাথে আমি ভাবছিলাম কীভাবে আমি গণনাটি উন্নত করতে পারি যাতে আমাকে 10 ^ 12 গণনা করতে না হয়।

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


সম্পাদনা: নিক্লাসের একটি পরামর্শ ব্যবহার করে, আমি এটি ব্যবহার করছি ST_Dwithin():

CREATE TABLE mytable_withinRange AS SELECT 
  a.hgt AS a_hgt,
  b.hgt AS b_hgt,
  ST_DWithin(a.the_geom, b.the_geom, 400)
FROM 
  public."lon_TestArea" AS a, public."lon_TestArea" AS b

এখানে চিত্র বর্ণনা লিখুন

এটি প্রতিটি বহুভুজের আইডির একটি টেবিল ফেরত দেয় এবং এটি নির্দিষ্ট দূরত্বের মধ্যে রয়েছে কিনা। IF/ELSEএসকিউএল ব্যবহার করে কি কোনও টাইপ স্টেটমেন্ট তৈরি করা সম্ভব ? (আমি CASEশর্তটি ব্যবহার করার বিষয়ে পড়ি ) অথবা আমার নিজের তৈরি টেবিলটি মূল টেবিলটিতে যোগ দেওয়ার চেষ্টা করা উচিত এবং তারপরে ST_Distance ব্যবহার করে আবার কোয়েরিটি চালানো উচিত?


আমার উত্তরে বোস্টন গিস লিঙ্কের দ্বিতীয় উদাহরণটি দেখুন। কোয়েরির অংশে আপনার st_dwithin ব্যবহার করা উচিত।
নিক্লাস আভেন

উত্তর:


7

বোস্টনজিআইএস পৃষ্ঠায় একটি বড় "নিকটবর্তী নিকটবর্তী" বিভাগ রয়েছে


সম্পাদনা করুন:

কেমন

CREATE TABLE mytable_withinRange AS SELECT 
 a.hgt AS a_hgt,
 b.hgt AS b_hgt
FROM 
 public."lon_TestArea" AS a, public."lon_TestArea" AS b
WHERE 
 ST_DWithin(a.the_geom, b.the_geom, 400)

বিষয়ে মামলার বিবরণে :

SELECT a,
   CASE WHEN a=1 THEN 'one'
        WHEN a=2 THEN 'two'
        ELSE 'other'
   END
FROM test;

আপনি কি জানেন যে লাইনটি WHERE ST_DWithin(a.the_geom, b.the_geom, 400)আরও বেশি দূরত্ব বাধা দেবে যদি 400গণনা করা বা কেবল রেকর্ড করা যায়? এছাড়াও, সংখ্যার গণনার জন্য কোনও কেস স্টেটমেন্ট ব্যবহার করা যেতে পারে? উদাহরণস্বরূপ:CASE WHEN ST_DWithin(a.the_geom, b.the_geom, 400) == TRUE THEN ST_DWithin(a.the_geom, b.the_geom)
djq

1
@ সেলেনিয়াস দূরত্ব যদি 400 মিটারের বেশি হয় তবে নির্বাচিত অংশের কিছুই গণনা করা হবে না। আপনি কেন মিশ্রণে মামলা রাখতে চান তা আমি পাই না।
নিক্লাস আভেন

@ নিক্লাস ঠিক আছে - আমি বুঝতে পারি আমি ভেবেছিলাম এর অর্থ হতে পারে যে কেবলমাত্র 400 টিরও কম দূরত্ব সঞ্চয় করা হয়েছিল; এটি যদিও আমার চেয়ে অনেক সহজ করে তোলে। ধন্যবাদ!
djq

3

আরে

জিনিসগুলিকে দ্রুত স্থানান্তরিত করার জন্য কিছু বিষয় বিবেচনা করা হয়, এবং এমন কিছু জিনিস যা ভবিষ্যতে সম্ভব হতে পারে।

প্রথমত , আপনি উল্লেখ করেছেন যে আপনি সমস্ত সংমিশ্রণের গণনা এড়াতে কিছু ন্যূনতম পরিসরে বহুভুজগুলি খুঁজে পেতে বাফার ব্যবহারের কথা বিবেচনা করছেন।

হিসাবে থেকে অন্য লিঙ্ক আলোচনা বস্টন GIS যে PostGIS ইন ব্যবহার করছে না করার সঠিক উপায় ST_Dwithin । ST_Dwithin নির্দিষ্ট সীমার মধ্যে প্রতিবেশীদের সন্ধান করতে সূচকটি ব্যবহার করে।

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

দ্বিতীয় জিনিসটি এখানে পোস্টজিআইএস 1.5+ ব্যবহার করা। এর কারণ হল যে বহুভুজ থেকে বহুভুজ গণনাগুলি 1.5 এর পরে অনেক দ্রুত, যদি তাদের সীমানা বাক্সগুলি ছেদ না করে। আপনি এখানে সে সম্পর্কে আরও পড়তে পারেন

তৃতীয় বিষয়টি উল্লেখ করা হ'ল ভবিষ্যত।

পোস্টগ্রিসকিউএল 9.1 এ নট-জিস্ট বলে কিছু থাকবে। এটি এমন একটি সূচক যা কেবল হ্যাঁ বা না উত্তর দিতে পারে না তবে সরাসরি সূচক থেকে অর্ডার করা ফলাফলও ফিরিয়ে দেয়। আপনি এখানে যে সম্পর্কে পড়তে পারেন ।

নিট গিস্ট এই জাতীয় জিনিসগুলির জন্য সহায়তা করবে তার আগে পোস্টজিআইএসের পক্ষ থেকে এখনও অনেক কাজ করার দরকার আছে। এখানে তার জন্য একটি টিকিট আছে।

শুভেচ্ছা সহ

Nicklas


নিক্লাস পরামর্শের জন্য ধন্যবাদ; যেহেতু আমি পিজএডমিন / পোস্টজিআইএস পেতে এবং এটি চালানো কঠিন বলে মনে করি আমি মনে করি আমি এই মুহুর্তে 1.5 ব্যবহার করা এড়াব। দেখে মনে হচ্ছে ST_Dwithin () এটি সমাধানের একটি উপায়।
ডিজেকিউ

2
1.5 ইনস্টল করার ফলে পোস্টগ্রেস্কল এবং পিগাডমিনের সম্পর্কের উপর কোনও প্রভাব পড়বে না। আপনার ডাটাবেস সার্ভারে পোস্টগিসের একাধিক সংস্করণ থাকতে পারে এবং তারপরে আপনি সেগুলির একটিটি ডাটাবেসে লোড করুন। যাতে আপনার একটি 1.4 এবং একটি 1.5 ডাটাবেস একই ডেটাবেস সার্ভার থাকতে পারে।
নিক্লাস আভেন

1

নাথন কেরের মাস্টার্স সম্পর্কিত সম্পর্কিত নিম্নলিখিত পৃষ্ঠাগুলি এই প্রত্যক্ষ ইস্যুতে কিছুটা ভাল অন্তর্দৃষ্টি সরবরাহ করে। আমার সহকর্মী বোস্টংগিস পদ্ধতিটি এখানে এবং এখানে চেষ্টা করেছিলেন তবে এটি সঠিকভাবে কাজ করতে কিছু সমস্যা হয়েছিল।

এটি বাফারের অনুরূপ সম্পর্কে চিন্তা করার আরেকটি পন্থা হ'ল একটি প্রসারিত / চুক্তিবদ্ধ আয়তক্ষেত্রটি করা। মূলত 1 টি একটি বাউন্ডিং বাক্সটি পাস করুন (এটি আপনার মূল বহুভুতের বাক্সে একটি সোজা + এক্স ইউনিট) ছেদ করুন যা আপনি ভাবেন যে কমপক্ষে একটি ছেদ করবে। যে ছেদটি পেয়েছে এমন ডেটার জন্য একটি উপ-কোয়েরি সম্পাদন করে যা নিকটতমদের জন্য এই ম্যাচগুলির পরীক্ষা করে। ডেটাগুলির জন্য সীমানা বাক্সটি প্রসারিত করতে এবং পুনরাবৃত্তি করতে ব্যর্থ হয়েছে।

এটি স্পষ্টত একটি পুনরাবৃত্ত প্রোগ্রামিং সমস্যা, এবং পোস্টগ্রিসে সরাসরি 100% এর চেয়ে ভাল পাইথন দিয়ে আরও ভাল করা যেতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.