নৈকট্য অনুসন্ধানের জন্য জিওহ্যাশ ব্যবহার করছেন?


30

আমি পয়েন্ট নৈকট্য জিও অনুসন্ধান সময় অপ্টিমাইজ করতে খুঁজছি।

আমার ইনপুটটি ল্যাট, এলএনজি পয়েন্ট এবং আমি নিকটস্থ পয়েন্টগুলিতে অবস্থানের একটি পূর্বনির্ধারিত সেটটিতে অনুসন্ধান করছি।

লোকেশনগুলির পূর্বনির্ধারিত সূচকের বিল্ডিংয়ে কত সময় / স্পেস লাগবে তা আমি বিবেচনা করি না তবে আমি যত্ন করি যে প্রশ্নগুলি খুব দ্রুত হবে।

আমি জিওহ্যাশটিকে অনুসন্ধান কী হিসাবে ব্যবহার করার বিষয়ে ভাবছি, যেখানে আমি প্রথমে কীটির এক্স অক্ষরের জন্য ফলাফল পেয়েছি কিনা তা পরীক্ষা করে দেখব এবং তারপরে ফলাফলগুলি দেখা শুরু না করা অবধি কীটির শেষে থেকে অক্ষরগুলি ছাঁটাই করা অবিরত করব।

আমার (বর্তমানের জন্য খুব অল্পই) জিও সূচক কৌশলগুলি বোঝার জন্য এই পদ্ধতির সাথে অন্যান্য সমস্ত পরিচিত বাস্তবায়নগুলির (যেমন আর ট্রি এবং কো।) তুলনায় দ্রুততম ফলাফলগুলি (ক্যোয়ারির সময় বিবেচনায়) উত্পাদন করতে সক্ষম হওয়া উচিত


কোনও জিওহ্যাশ ব্যবহার এবং আপনার ল্যাট / দীর্ঘটি পূর্ব / উত্তরভাগে সংরক্ষণ করার মধ্যে কোনও উল্লেখযোগ্য পার্থক্য রয়েছে (উদাহরণস্বরূপ)? সম্ভবত উভয়কেই আপনি অক্ষর / অঙ্কগুলি ছাঁটাই করে আপনার অনুসন্ধানের নির্ভুলতা পরিবর্তন করতে পারেন। (এটি নিখুঁতভাবে কৌতূহলের বাইরে একটি প্রশ্ন - আমি এই বিষয়ের সাথে অপরিচিত)।
djq

এই পয়েন্টগুলি একটি ডাটাবেসে বা মেমোরিতে সংরক্ষণ করা হয়?
মার্ক ফাইস্টার

@ মার্কপিস্টার এই সমস্যাটি 2 বছরের পুরানো (আমার ব্যবহারের ক্ষেত্রে) তবে এটি সম্প্রদায়ে সর্বদা প্রাসঙ্গিক তাই আমি সক্রিয় আলোচনা চালিয়ে যাব। আলোচিত তথ্যটি অবশ্যই একটি এনএসকিএল ডাটাবেসে সংরক্ষণ করা হয়েছিল was
ম্যাক্সিম ভেক্সলার

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

আহ, ঠিক আছে. কাউচডিবিতেও এখন স্থানিক সূচি ছিল, সম্ভবত জিওহ্যাশও ব্যবহার করছে।
মার্ক ফাইস্টার

উত্তর:


25

নিখুঁতভাবে আপনি পারেন। এবং এটি বেশ দ্রুত হতে পারে। (নিবিড় গণনা বিট ALSO বিতরণ করা যেতে পারে)

বেশ কয়েকটি উপায় রয়েছে, তবে একটি উপায় যা নিয়ে আমি কাজ করছি সেটি হল পূর্ণসংখ্যার উপর ভিত্তি করে জিওহ্যাশগুলির একটি আদেশযুক্ত তালিকা ব্যবহার করা এবং নির্দিষ্ট জিওহ্যাশ রেজোলিউশনের জন্য নিকটস্থ সমস্ত প্রতিবেশী জিওহ্যাশ রেঞ্জগুলি অনুসন্ধান করা (রেজোলিউশনটি আপনার distanceমানদণ্ডের সাথে সান্নিধ্যযুক্ত ) এবং তারপরে then নিকটবর্তী পয়েন্টগুলির একটি তালিকা পেতে সেই জিওহ্যাশ রেঞ্জকে জিজ্ঞাসা করা। আমি এর জন্য রেডিস এবং নোডেজ (অর্থাত্ জাভাস্ক্রিপ্ট) ব্যবহার করি। রেডিস অত্যন্ত দ্রুত এবং অর্ডার করা রেঞ্জগুলি খুব দ্রুত পুনরুদ্ধার করতে পারে তবে এসকিউএল ডাটাবেসগুলি করতে পারে এমন সূচীকরণ ক্যোয়ারী ম্যানিপুলেশন স্টাফ এটি অনেক কিছুই করতে পারে না।

পদ্ধতিটি এখানে বর্ণিত হয়েছে: https://github.com/yinqiwen/ardb/wiki/Spatial-Index

তবে এর সংক্ষিপ্তসারটি হল (লিঙ্কটি প্যারাফ্রেস করতে):

  1. আপনি চান এমন সেরা রেজোলিউশনে আপনার সমস্ত জিওহ্যাশড পয়েন্টগুলি সংরক্ষণ করুন (সর্বাধিক সাধারণত if৪ বিট পূর্ণসংখ্য যদি এটি অ্যাক্সেসযোগ্য হয়, বা জাভাস্ক্রিপ্টের ক্ষেত্রে, 52 বিটস) একটি অর্ডারযুক্ত সেট (যেমন। রেডিসে জেটসেট) সংরক্ষণ করুন। আজকাল বেশিরভাগ জিওহ্যাশ লাইব্রেরিতে জিওহ্যাশ পূর্ণসংখ্যা ফাংশনগুলি অন্তর্নির্মিত রয়েছে এবং আপনাকে আরও সাধারণ বেস 32 জিওহ্যাসগুলির পরিবর্তে এগুলি ব্যবহার করতে হবে।
  2. আপনি যে ব্যাসার্ধের মধ্যে অনুসন্ধান করতে চান তার উপর ভিত্তি করে আপনাকে এরপরে একটি সামান্য গভীরতা / রেজোলিউশন সন্ধান করতে হবে যা আপনার অনুসন্ধানের সাথে মেলে এবং এটি আপনার সঞ্চিত জিওহাশ বিট গভীরতার চেয়ে কম বা সমান হতে হবে। লিঙ্কযুক্ত সাইটের একটি সারণী রয়েছে যা জিওহ্যাশের বিট গভীরতার সাথে মিটারে তার সীমানা বাক্স অঞ্চলটি সংযুক্ত করে।
  3. তারপরে আপনি এই নিম্ন রেজোলিউশনে আপনার মূল সমন্বয়টি পুনঃস্থাপন করুন।
  4. নীচের রেজুলেশনে 8 টি প্রতিবেশী (এন, নে, ই, সে, এস, এস, ডাব্লু, এনডাব্লু) জিওহ্যাশ অঞ্চলগুলিও সন্ধান করুন। আপনাকে প্রতিবেশী পদ্ধতিটি করার কারণ, কারণ একে অপরের পাশে প্রায় দু'জন স্থানাঙ্কীর সম্পূর্ণ ভিন্ন জিওহ্যাশ থাকতে পারে, তাই আপনাকে অনুসন্ধানের আচ্ছাদিত অঞ্চলটির কিছুটা গড়পড়তা করতে হবে।
  5. এই নীচের রেজোলিউশনে একবার আপনি সমস্ত প্রতিবেশী জিওহেসগুলি পেয়ে গেলে, পদক্ষেপ 3 থেকে আপনার স্থানাঙ্কের জিওহ্যাশ তালিকায় যুক্ত করুন।
  6. তারপরে এই 9 টি অঞ্চলকে অন্তর্ভুক্ত করার জন্য আপনাকে জিওহ্যাশ মানগুলির একটি ব্যাপ্তি তৈরি করতে হবে । পদক্ষেপ 5 এর মানগুলি হ'ল আপনার নিম্ন সীমার সীমা এবং আপনি যদি সেগুলির প্রতিটিতে 1 টি যোগ করেন তবে আপনি আপনার উপরের পরিসীমা সীমা পেয়ে যাবেন। সুতরাং আপনার 9 টি রেঞ্জের অ্যারে থাকা উচিত, প্রত্যেকের নিম্ন সীমা এবং উপরের জিওহ্যাশ সীমা (মোট 18 জিওহেস)) এই জিওহেসগুলি এখনও দ্বিতীয় পদক্ষেপ থেকে নিম্নতর রেজুলেশনে রয়েছে।
  7. তারপরে আপনি এই সমস্ত 18 জিওহেসকে আপনার ডেটাবেজে আপনার সমস্ত জিওহ্যাশগুলি যে পরিমাণ বিট গভীরতা / রেজোলিউশনে সংরক্ষণ করেছেন তাতে রূপান্তর করুন General
  8. এখন আপনি এই 9 টি ব্যাপ্তির মধ্যে পয়েন্টগুলির জন্য একটি ব্যাপ্তি ক্যোয়ারী করতে পারেন এবং আপনি প্রায় আপনার মূল পয়েন্টের দূরত্বে সমস্ত পয়েন্ট পাবেন। কোনও ওভারল্যাপ থাকবে না যাতে আপনার কোনও ছেদ করার দরকার নেই, কেবল খাঁটি পরিসীমা অনুসন্ধান, খুব দ্রুত। (উদাহরণস্বরূপ: রেডিসে: এই ধাপে উত্পাদিত 9 টি রেঞ্জের উপরে ZRANGEBYSCORE zsetname lowerLimit HigherLimit)

আপনি এটি আরও গতিযুক্ত করতে পারেন (গতি অনুসারে):

  1. 9 ধাপে 6 টি রেঞ্জ নেওয়া এবং তারা একে অপরকে কোথায় নিয়ে যায় তা সন্ধান করে। আপনার স্থানাঙ্ক কোথায় থাকে তার উপর নির্ভর করে আপনি সাধারণত 9 টি আলাদা রেঞ্জকে প্রায় 4 বা 5 এর মধ্যে হ্রাস করতে পারেন। এটি আপনার প্রশ্নের সময় অর্ধেক কমাতে পারে।
  2. আপনার চূড়ান্ত ব্যাপ্তিগুলি একবার হয়ে গেলে আপনার পুনরায় ব্যবহারের জন্য এগুলি রাখা উচিত। এই ব্যাপ্তির গণনা প্রসেসিংয়ের বেশিরভাগ সময় নিতে পারে, সুতরাং যদি আপনার মূল স্থানাঙ্কটি খুব বেশি পরিবর্তন না করে তবে আপনাকে আবার একই দূরত্বের ক্যোয়ারী তৈরি করতে হবে, আপনাকে প্রতিবার এটি গণনা করার পরিবর্তে আপনার প্রস্তুত রাখা উচিত।
  3. আপনি যদি পুনরায় ব্যবহার করছেন তবে কোয়েরিগুলিকে একটি বহু / এক্সেকের সাথে একত্রিত করার চেষ্টা করুন যাতে এটি কিছুটা আরও ভাল পারফরম্যান্সের জন্য তাদের পাইপলাইন করে।
  4. সর্বোত্তম অংশ: আপনি এই গণনাটি এক জায়গায় করে দেওয়ার পরিবর্তে ক্লায়েন্টগুলিতে 2-7 পদক্ষেপ বিতরণ করতে পারেন। এটি লক্ষ লক্ষ অনুরোধগুলি আসবে এমন পরিস্থিতিতে সিপিইউ লোডকে হ্রাস করে।

আপনি যদি যথার্থতার বিষয়ে বেশি যত্ন নিচ্ছেন তবে প্রত্যাবর্তিত ফলাফলগুলিতে বৃত্তের দূরত্ব / হ্যাওয়ারসাইন টাইপ ফাংশনটি ব্যবহার করে আপনি নির্ভুলতার আরও উন্নতি করতে পারবেন।

রেডিসের পরিবর্তে সাধারণ বেস 32 জিওহ্যাশগুলি এবং একটি এসকিউএল কোয়েরি ব্যবহার করে এখানে একই কৌশল রয়েছে: https://github.com/davetroy/geohash-js

আমার নিজের জিনিসটি প্লাগ করা বলতে চাই না, তবে আমি নোডেজ এবং রেডিসের জন্য একটি মডিউল লিখেছি যা এটি বাস্তবায়ন করা সত্যিই সহজ করে তোলে। আপনি চাইলে কোডটি একবার দেখুন: https://github.com/arjunmehta/node-georedis


কয়েকটা ফলোআপ প্রশ্ন - আপনি কীভাবে প্রতিবেশীদের গণনা করবেন? পূর্ণসংখ্যা হ্যাশ ছাঁটাই দেয় (base32 Z-বক্ররেখা ভিত্তিক প্রাক্তন জন্য, না। (7 base32 geohash 8 থেকে খুব দূরে)। কিভাবে পদ্ধতি রূপরেখা হয় geohash-JS github.com/davetroy/geohash-js/blob/ মাস্টার / matrix.txt অনুরূপ এই অ্যালগরিদম অনুমিত নৈকট্য ভূ-পয়েন্ট geohash-JS উত্পাদন করে না হে (1) প্রতিবেশী কোষের হিসাব শুধুমাত্র।
বচন Veksler

বাহ, এটি এত দরকারী ছিল। এই প্রতিক্রিয়া এত দক্ষতা। বেশ চ্যালেঞ্জিং টাস্ক
সাইমন

9

প্রশ্নটি বেশ কয়েকটি উপায়ে পড়া যায়। আমি এটি ব্যাখ্যা করি এর অর্থ আপনার কাছে প্রচুর পরিমাণে পয়েন্ট রয়েছে এবং আপনি সমন্বয়যুক্ত জোড় হিসাবে স্বেচ্ছাচারী পয়েন্টগুলি দিয়ে বারবার তদন্তের পরিকল্পনা করছেন এবং n এর আগেই নির্দিষ্ট করা n দিয়ে তদন্তের নিকটতম পয়েন্টগুলি অর্জন করতে চান। (নীতিগতভাবে, যদি n পৃথক হয়, আপনি প্রতিটি সম্ভাব্য এন এর জন্য একটি ডেটা স্ট্রাকচার সেট আপ করতে এবং প্রতিটি তদন্তের সাথে ও (1) সময়ে এটি নির্বাচন করতে পারেন: এটি খুব দীর্ঘ সেটআপ সময় নিতে পারে এবং প্রচুর র‍্যাম লাগতে পারে, তবে আমরা যেমন উদ্বেগ উপেক্ষা করতে বলা হয়।)

সমস্ত পয়েন্টের অর্ডার-এন ভোরোনাই চিত্রটি তৈরি করুন । এই প্লেনটি সংযুক্ত অঞ্চলে বিভক্ত করে, যার প্রত্যেকেরই একই n প্রতিবেশী রয়েছে। এটি পয়েন্ট-ইন-বহুভুজ সমস্যার ক্ষেত্রে পরিস্থিতি হ্রাস করে, যার অনেকগুলি কার্যকর সমাধান রয়েছে।

ভোরোনাই চিত্রের জন্য একটি ভেক্টর ডেটা কাঠামো ব্যবহার করে, পয়েন্ট-ইন-বহুভুজ অনুসন্ধানে ও (লগ (এন)) সময় লাগবে। ব্যবহারিক উদ্দেশ্যে আপনি খুব সহজেই ডায়াগ্রামের রাস্টার সংস্করণ তৈরি করে একটি খুব ছোট সংক্ষিপ্ত সহগ সহ এই ও (1) তৈরি করতে পারেন। রাস্টারটিতে কোষের মানগুলি হয় (i) নিকটতম পয়েন্টগুলির তালিকার একটি পয়েন্টার বা (ii) একটি ইঙ্গিত যে এই কোষটি ডায়াগ্রামে দুটি বা আরও বেশি অঞ্চলকে বিভক্ত করে। (X, y) এ স্বেচ্ছাসেবী বিন্দুর জন্য পরীক্ষাটি হয়ে যায়:

Fetch the cell value for (x,y).
If the value is a list of points, return it.
Else apply a vector point-in-polygon algorithm to (x,y).

ও (১) কর্মক্ষমতা অর্জনের জন্য, রাস্টার জাল যথেষ্ট পরিমাণে ঠিক করতে হবে যে তুলনামূলকভাবে কয়েকটি প্রোব পয়েন্টগুলি একাধিক ভোরোনাই অঞ্চলগুলিকে বিভক্ত করে এমন কোষগুলিতে পড়বে। গ্রিডগুলির সঞ্চয়স্থানে সম্ভাব্য দুর্দান্ত ব্যয় সহ এটি সর্বদা সম্পন্ন করা যায়।


3

আমি ঠিক এর জন্য জিওহেস ব্যবহার করি। আমার কারণটি হ'ল আমার পিরামিড শৈলীর তথ্য সিস্টেম ব্যবহার করে নৈকট্য অনুসন্ধানগুলি বাস্তবায়নের দরকার ছিল .. যেখানে ৮ ম স্তরের নির্ভুলতার সাথে জিওহ্যাশগুলি 'বেস' ছিল এবং 7th তম নির্ভুলতার জিওহ্যাশগুলির জন্য নতুন মোট সংখ্যা তৈরি হয়েছিল ... এবং আরও অনেক কিছু । এই মোটগুলি ছিল ক্ষেত্রের ক্ষেত্র, জমি ofাকনার প্রকার ইত্যাদি some কিছু অভিনব জিনিস করা খুব অভিনব উপায় ছিল।

সুতরাং অষ্টম স্তরের জিওহেসে এই জাতীয় তথ্য থাকবে:

প্রকার: ঘাস একর: 1.23

এবং 7 ম, 6th ষ্ঠ .. ইত্যাদি .. যেমন তথ্য থাকতে পারে:

ঘাস_প্রকার: 123 একর: 6502

এটি সর্বদা সর্বনিম্ন নির্ভুলতা থেকে তৈরি ছিল। এটি আমাকে খুব দ্রুত সমস্ত ধরণের মজাদার পরিসংখ্যান করার অনুমতি দেয়। আমি জিওজেএসএন ব্যবহার করে প্রতিটি জিওহ্যাশ রেফারেন্সে জ্যামিতি রেফারেন্সও দিতে সক্ষম হয়েছি।

আমি আমার বর্তমান ভিউপোর্টটি তৈরি করে এমন বৃহত্তম জিওহেসগুলি সন্ধান করতে এবং তার পরে ভিউপোর্টের মধ্যে দ্বিতীয় বৃহত্তম নির্ভুলতার জিওহ্যাসগুলি সন্ধান করতে কয়েকটি ফাংশন লিখতে সক্ষম হয়েছি। এটি সহজেই সূচিকৃত রেঞ্জের ক্যোয়ারিতে প্রসারিত হতে পারে যেখানে আমি ন্যূনতম '86ssaaa' এবং আমার যথাযথতা যা চেয়েছিলাম তার জন্য সর্বাধিক '86sszzzz' এর জন্য জিজ্ঞাসা করব।

আমি মঙ্গোডিবি ব্যবহার করে এটি করছি।


3

2018 এর জন্য আপডেট করা হচ্ছে এবং কিছু গাণিতিক তহবিল বা জিওহেশের historicতিহাসিক-প্রবাদ:

  • Geohash অনুপ্রেরণা ছিল বাইনারি ডিজিটের সহজ interlave সাদাসিধা আলগোরিদিম যা দশমিক সংখ্যা দর্শন অন্তর্বর্তীবিরতি, মত একজন অপ্টিমাইজেশান, সম্ভবত এর সি-স্কোয়ার

  • বাইনারি একত্রীকরণের উপয় একটি ফলে জেড-অর্ডার-বক্ররেখা সূচক কৌশল স্বাভাবিকভাবেই, Geohash উদ্ভাবক না শুরু "বেস্ট ফ্র্যাক্টাল বক্ররেখা খুঁজছেন" ... কিন্তু curiosally, এই নকশা অপ্টিমাইজেশান, একটি ভাল ফ্র্যাক্টাল বক্ররেখা, সম্ভব (!)।

এস 2 জ্যামিতি লাইব্রেরি ব্যবহার করুন

আছে S2-জ্যামিতি পদ্ধতির Tham Geohash কারণ এটি গ্লোব এর গোলাকৃতি টপোলজি (ক ঘনক্ষেত্র) ব্যবহার করে, ঐচ্ছিক ব্যবহার উত্তম হয় অভিক্ষেপ (তাই সমস্ত কক্ষ কাছাকাছি একই আকৃতি এবং কাছাকাছি এলাকা আছে), এবং কারণ সঙ্গে ইন্ডেক্স হিলবার্ট-বক্ররেখা ভাল Tham হয় Z- আদেশ-বক্ররেখা :

... আমরা আরও ভাল করতে পারি ... আমাদের উপরের ডান থেকে নীচে বাম চতুষ্কোণে বিচ্ছিন্নতার ফলাফল আমাদের কিছু পরিসীমা বিভক্ত করতে পারে যা আমরা অন্যথায় সংহত করতে পারি। (...) কোয়াডট্রি এবং হিলবার্ট কার্ভের সাথে স্থানিক সূচীতে কোনও বিযুক্তি (...) blog.notdot.net/2009 সম্পূর্ণরূপে আমরা নির্মূল করতে পারি

এখন এটি একটি নিখরচায় এবং দক্ষ লাইব্রেরি, https://s2geometry.io দেখুন

পিএস: নোডজেএস-এরs2-geometry হিসাবে সরকারী (সরল) বেসিক সরলীকৃত সংস্করণ এবং অনেকগুলি "খেলার মাঠ", এস 2.সাইডওয়ালক্লাবস.কম হিসাবে অ্যাড-ইনস এবং ডেমো রয়েছে


2

আমি জিওরিডিয়াস ক্যোয়ারীটি পুনরায় ব্যবহারের পরামর্শ দেব।

জিওএইডিডি কলটি ব্যবহার করে সেরা উপযুক্ত জিওহ্যাশ স্তরের মাধ্যমে ডেটাটি চাপযুক্ত ush

এছাড়াও, এটি দেখুন -> প্রক্সিমিটি হ্যাশ

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

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