একটি নির্দিষ্ট ল্যান্ডমার্কের সীমার মধ্যে আমি কীভাবে দক্ষতার সাথে সমস্ত ল্যান্ডমার্ক অনুসন্ধান করব?


14

আমি একটি ভূ-অনুসন্ধান প্রকল্পের সাথে শুরু করার চেষ্টা করছি যা একটি নির্দিষ্ট ল্যান্ডমার্কের 10 কিলোমিটার / মাইল (এই গল্পের জন্য গুরুত্বপূর্ণ নয়) সমস্ত সন্ধান করবে।

সুতরাং উদাহরণস্বরূপ, যাক বলে দিন যে আমার কাছে একটি 1,000,000 ল্যান্ডমার্কের একটি ডাটাবেস রয়েছে। নির্দিষ্ট স্থানাঙ্ক সহ একটি ল্যান্ডমার্কের 10 মাইল পরিসরে সমস্ত ল্যান্ডমার্কগুলি সন্ধান করতে, আমাকে আমার অনুসন্ধান থেকে এক লক্ষ লক্ষ ল্যান্ডমার্কের মধ্যে একটি দূরত্ব গণনা করতে হবে।

এটি করার আরও ভাল উপায় আছে কি?

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

গুগল ম্যাপস এপিআই সাহায্য করতে পারে?


5
10 মাইল বর্গক্ষেত্রের মধ্যে 10 কিলোমিটার ব্যাসার্ধের ল্যান্ডমার্কগুলি বাদ দেওয়ার জন্য আপনি দ্রুত ম্যানহাটনের দূরত্ব গণনা করে এবং তারপরে একটি দ্বিতীয় ফিল্টার সম্পাদন করে খুব সহজেই অনেকগুলি দূর করতে পারেন।
নীল

3
আপনি কোন ডাটাবেস প্রযুক্তি ব্যবহার করছেন? উত্তরটি ডাটাবেস অজ্ঞেয় নয়।
jpmc26

1
@ নীল দ্বিতীয় পাস হিসাবে আপনি যে কোনও ল্যান্ডমার্ক অন্তর্ভুক্ত করতে পারেন যেখানে x এবং y উভয়ই আসল দূরত্ব গণনা ছাড়াই মূলের 7 কিলোমিটারে পড়ে।
জিমি জেমস

উত্তর:


10

এসকিউএল সার্ভার ২০০৮ সাল থেকে এমন একটি ভৌগলিক ডেটা টাইপ রয়েছে যা অবস্থানগুলি (ল্যাট / লম্বা জোড়া) সঞ্চয় করে এবং আপনার জন্য অবস্থান সম্পর্কিত প্রশ্নগুলি লেখার পক্ষে সহজ করে তোলে।

এখানে বিদ্যমান স্ট্যাকওভারফ্লো উত্তর রয়েছে যা এটি গভীরভাবে আলোচনা করে।

নিকটতম 7 টি আইটেম সন্ধানের জন্য একটি প্রাথমিক জিজ্ঞাসা :

USE AdventureWorks2012  
GO  
DECLARE @g geography = 'POINT(-121.626 47.8315)';  
SELECT TOP(7) SpatialLocation.ToString(), City FROM Person.Address  
WHERE SpatialLocation.STDistance(@g) IS NOT NULL  
ORDER BY SpatialLocation.STDistance(@g);  

100 মিটারের মধ্যে সমস্ত কিছু খুঁজে পাওয়ার জন্য একটি প্রাথমিক জিজ্ঞাসা (প্রশ্নের দ্বিতীয় উত্তর)

-- Get the center point
DECLARE @g geography
SELECT @g = geo FROM yourTable WHERE PointId = something

-- Get the results, radius 100m
SELECT * FROM yourTable WHERE @g.STDistance(geo) <= 100

11
@ কনরাডরুডল্ফ: যে কোনও এসকিউএল কলামের ক্ষেত্রে এটি একইসাথে একটি বিশাল সার্বিক গণনা সহ কোনও টেবিলে অনুসন্ধানের জন্য ব্যবহৃত হয়। আপনি সঠিক, তবে সেই মন্তব্যটি উত্তর হিসাবে পোস্ট করা কার্যত কোনও এসকিউএল কোয়েরিতে প্রযোজ্য।
তোলা

2
প্রশ্নটিতে আপনি কোথায় "এমএস এসকিউএল সার্ভার" পড়েছেন?
ডক ব্রাউন

3
@ ফ্লাটার আমি সম্মত হই যে এটি স্বাভাবিকভাবে স্পষ্ট এবং অপ্রয়োজনীয় হবে তবে ওপি'র শব্দাবলীর দ্বারা মনে হয় যে তারা এ জাতীয় প্রক্রিয়া সম্পর্কে অবগত নন।
কনরাড রুডল্ফ

2
@ jpmc26: আপনি হতাহত হয়েছেন যে আমি একটি বৈধ বিকল্প তালিকাভুক্ত করেছি এবং অন্য কোনও বিকল্প অন্তর্ভুক্ত করি নি? কি? আপনি যদি পোস্টজিআইএস যুক্ত করার জন্য প্রাসঙ্গিক বলে মনে করেন তবে উত্তরটি নিজেরাই যুক্ত করুন (যা আপনি করেছেন) এবং আপনার মত ধারণাটি না পেয়ে অন্যের সমালোচনা করার উপায় নেই।
22 এ ফ্ল্যাটার

3
আপনার উত্তরটি আমার কাছে মূলত একটি এমএস এসকিউএল বিক্রয় পিচ হিসাবে উপস্থিত হয়। আপনার মন্তব্যগুলির দ্বারা তারা ডেটাবেসগুলিকে এমন কিছুতে স্যুইচ করে যা তাদের পরিস্থিতি কেবল এটিকে আরও প্রদর্শিত হতে পারে তা সম্পর্কে অনুসন্ধান না করে 10 হাজার হাজার ডলার খরচ করতে পারে। এমনকি ওপি কীভাবে তাদের ক্যোয়ারি বাস্তবায়িত করতে পারে বা স্থানিক সূচককে বোঝায় যে অন্য ডিবিগুলির মতো এমএস এসকিউএল তেমন সরল নয় এটি কীভাবে বাস্তবায়ন করতে পারে তাও বর্ণনা করে না। বা এটি অন্তর্নিহিত ধারণাগুলি সম্পর্কে কোনও আলোচনা করে না। এটি "বৈধ" হোক না কেন এটি একটি খারাপ উত্তর। এ কারণেই এটি আমাকে বিরক্ত করে।
jpmc26

29

জিআইএস (ভৌগলিক তথ্য সিস্টেম) প্রশ্নের জন্য সমর্থন সহ একটি ডাটাবেস ব্যবহার করুন । বেশিরভাগ ডাটাবেসগুলি এটিকে পুরোপুরি সমর্থন করে বা এক্সটেনশান দেয় তবে বিশদটি ডাটাবেস-নির্দিষ্ট হবে ( তাদের উত্তরে , ফ্ল্যাটার এসকিউএল সার্ভারের সিনট্যাক্সটি দেখায়)।

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



8
পোস্টজিআইএস একটি প্রিমিয়ার ফ্রি বিকল্প। এটি এসকিউএল সার্ভারের খুব বেসিক জিআইএস প্রকার এবং ফাংশনগুলির চেয়ে অনেক বেশি সমর্থন করে। তবে এটি মৌলিক কার্যকারিতা।
jpmc26

@amon আমি jpmc26 এর মন্তব্যটিকে একটি ভাল সংযোজন হিসাবে পেয়েছি এবং এটি আপনার উদাহরণের সমালোচনা করার মতো নয়। "আপনি যদি স্ক্র্যাচ থেকে শুরু করতে চান, আপনাকে লাইসেন্সবিহীন ডিবির জন্য অর্থ প্রদানের প্রয়োজন হবে না - এই নিখরচায়, মুক্ত-উত্সটিও কৌশলটি সত্যই কার্যকর করবে"।
mgarciaisaia

11

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

আপনি যে বিষয়টি দেখতে চান তা হ'ল "দূরত্বের মধ্যে" ক্যোয়ারী (অন্য কোনও জ্যামিতির নির্দিষ্ট দূরত্বে জ্যামিতির জন্য ক্যোয়ারী)। এগুলি খুব স্ট্যান্ডার্ড এবং খুব বেশি সমস্যার সমাধান এবং উপরের সমস্ত ডাটাবেসে (এবং কয়েকটিতে নির্মিত) এটি সম্ভব:

  • PostGIS: ST_DWithin
  • এসকিউএল সার্ভার: STDistance(এই ফাংশনের 3 ডি জিওগ্রাফিক সংস্করণে সূচক ব্যবহার সমর্থিত নয়)
  • ওরাকল: SDO_WITHIN_DISTANCE(এটি সুস্পষ্টভাবে বলে না যে এটি সূচক ব্যবহারের সূত্রপাত করবে SDO_FILTERthe
  • মাইএসকিউএল: এখনও এটি খুঁজে বের করছি।

সূচকের ব্যবহার ট্রিগার করার জন্য কার্যক্ষম

সবচেয়ে খারাপ ক্ষেত্রে যেখানে আপনার এই প্রশ্নের সাথে স্থানিক সূচকটি ব্যবহার করতে সিস্টেমকে পেতে সমস্যা হয়, আপনি একটি অতিরিক্ত ফিল্টার যুক্ত করতে পারেন। আপনি দৈর্ঘ্য 2 * (সার্চ দূরত্ব) এর পক্ষের সঙ্গে একটি বর্গক্ষেত্র সীমান্ত বক্স তৈরি চাই আপনার অনুসন্ধানের সময়ে কেন্দ্রিক এবং টেবিল জ্যামিতি 'বিরুদ্ধে বক্স সীমান্ত তুলনা যে প্রকৃত দূরত্ব পরীক্ষণ আগে। ST_DWithinউপরের পোস্টজিআইএস এটি অভ্যন্তরীণভাবেই করে।


জিআইএস-এ দূরত্ব

যদিও স্থানিক সূচকগুলি দুর্দান্ত এবং আপনার সমস্যার একদম সঠিক সমাধান, দূরত্ব গণনাটি যৌক্তিকভাবে জটিল হয়ে উঠতে পারে। বিশেষত, আপনার ডেটা সঞ্চিত কী প্রক্ষেপণ (মূলত স্থানাঙ্ক সিস্টেমের জন্য সমস্ত প্যারামিটার) নিয়ে চিন্তা করতে হবে Most বেশিরভাগ 2 ডি প্রজেকশন (বিভিন্ন ল্যাট / লম্বা অনুমানের মতো কৌণিক স্থানাংক সিস্টেম ছাড়া অন্যান্য জিনিস) দৈর্ঘ্যটি উল্লেখযোগ্যভাবে বিকৃত করে। উদাহরণস্বরূপ, ওয়েব মার্কেটর প্রজেকশন (গুগল, বিং এবং প্রতিটি অন্যান্য প্রধান বেস মানচিত্র সরবরাহকারী ব্যবহার করেন) ক্ষেত্রটি নিরক্ষীয় স্থান থেকে আরও বাড়ার সাথে সাথে অঞ্চলগুলি এবং দূরত্বগুলি ক্রমশ প্রসারিত করে । আমি ভুল হতে পারি যেহেতু আমি জিআইএসে আনুষ্ঠানিকভাবে শিক্ষিত নই, তবে 2 ডি অনুমানের জন্য আমি যে সেরাটি দেখেছি তা হ'ল নির্দিষ্ট কিছু যা একটি থেকে সঠিক দূরত্বের প্রতিশ্রুতি দেয়সমগ্র বিশ্বের একক, ধ্রুবক পয়েন্ট । (না, প্রতিটি প্রশ্নের জন্য আলাদা প্রক্ষেপণ ব্যবহার করা ব্যবহারিক নয়; এটি আপনার সূচিগুলি অকেজো করে দেবে))

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

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


3

আমি সম্মত হব যদি সম্ভব হয় তবে একটি ডাটাবেসে নির্দিষ্ট সমর্থন ব্যবহার করা এটি করার সবচেয়ে বুদ্ধিমান উপায়।

তবে যদি আমাকে নির্দিষ্ট সমর্থন ব্যতীত কোনও ডাটাবেসে এটি করতে হয় তবে আমি এমন বৃত্তের জন্য জিজ্ঞাসা শুরু করবো যা বৃত্তটি বন্ধ করে দেয় যেমন (y> (y1 - রেড)) এবং (y <(y1 + রেড)) এবং (x> ( x1 - রেড)) এবং (x <(x1 + রেড))। আপনার পয়েন্টগুলি মোটামুটি এমনকী বন্টনের জন্য একটি বর্গের অনুসন্ধানের বিষয়টি ধরে নিলে আপনি আপনার সত্যিকারের মিলগুলি এবং প্রায় 30% অতিরিক্ত মিথ্যা ম্যাচগুলি পাবেন। এরপরে আপনি মিথ্যা ম্যাচগুলি সরিয়ে ফেলতে পারেন।


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

@ জ্যাকারন আমি বিশ্বাস করি যে এই ক্যোয়ারীটি সাধারণ বি-ট্রি ইনডেক্স xএবং এর সাথে অনুকূল করা যেতে পারে y। (সম্ভবত সংযুক্ত, সম্ভবত আলাদা আমি চিত্রে একটু দূরে নিয়ে যা বাস্তবে ভাল কাজ করে প্রোফাইলে চাই।।)
jpmc26

@ jpmc26 না, এটি পারে না। এটি মাধ্যমে চিন্তা করুন, আপনি দেখতে পাবেন।
jcaron

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

2
@ জ্যাকারন আসলে আপনি যেমন সূচকটি ব্যবহার করতে পারেন y between -68 and -69 and x between 10 and 11তবে অবশ্যই স্থানিক সূচকগুলি সেই কাজের জন্য আরও ভাল কাজ করে
জুয়ান কার্লোস অরোপেজা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.