আমি কীভাবে জিপিএস পজিশনগুলির সাথে পয়েন্টগুলিতে গ্রুপ করব?


10

আমি একজন আইটি ব্যক্তি তাই প্রজেকশন সম্পর্কে আরও বেশি কিছু জানি না ইত্যাদি, আমি আশা করি আপনি আমাকে সহায়তা করতে পারেন।

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

অক্ষাংশের দশমিক এবং দ্রাঘিমাংশকে দলবদ্ধকরণের জন্য ব্যবহার করার জন্য আমার প্রথম ধারণাটি (সমস্যাটিকে আরও কিছুটা আরও ব্যাখ্যা করার জন্য) ছিল; উদাহরণস্বরূপ, এক গোষ্ঠীটি 35.123 এবং 35.124 এর মধ্যে অক্ষাংশ এবং 60.101 এবং 60.102 এর মধ্যে দ্রাঘিমাংশ সহ অবস্থান করবে। সুতরাং আমি যদি ল্যাট = 35.1235647 এবং দীর্ঘ = 60.1012254598 এর মতো অবস্থান পাই তবে এই পয়েন্টটি সেই গোষ্ঠীতে যাবে।

এই সমাধানটি কার্তেসিয়ান 2 ডি উপস্থাপনের জন্য ঠিক আছে, কারণ আমার আয়তন 0.001 ইউনিট এবং প্রশস্ত হবে; যাইহোক, দ্রাঘিমাংশের 1 ডিগ্রির আকার বিভিন্ন অক্ষাংশে পৃথক হওয়ায় আমি এই পদ্ধতির ব্যবহার করতে পারি না।

কোন ধারণা?


আপনি কেন পজিশনটি সে হিসাবে সংরক্ষণ করতে পারবেন না এবং পরে প্রক্রিয়াজাতকরণ করবেন? নিরক্ষীয় অঞ্চলে, দ্রাঘিমাংশের 1 ডিগ্রি প্রায় 111 কিমি, সুতরাং 0.001 ডিগ্রি 1 কিলোমিটারের থেকে কিছুটা বেশি হবে। আপনি কি সত্যিই আপনার ডালা এত বড় চান?
দেবদত্ত টেংশে

0.001 ডিগ্রিটি আমার ধারণার একটি উদাহরণ ছিল। অবশ্যই আমাকে এটি প্রয়োজনীয়তার সাথে খাপ খাইয়ে নিতে হবে। আমি কোনও পোস্ট প্রসেসিং করতে পারি না কারণ এটি রিয়েল টাইম অ্যাপ্লিকেশন হওয়ার পরিকল্পনা রয়েছে এবং আমি আমার ব্যবহারকারীদের "কাল পর্যন্ত ধরে রাখতে পারি না , কারণ আমাকে পয়েন্টগুলি গ্রুপ করতে হবে" যাইহোক ধারণাগুলির জন্য ধন্যবাদ;)
কুউ

উত্তর:


6

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

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

(আমি কি "প্লেন" বিভক্ত করার কথা বলেছি? হ্যাঁ - যদি পৃথিবীর পৃষ্ঠকে একটি গোলক হিসাবে মডেল করে এবং জিওসেন্ট্রিক (x, y, z) স্থানাঙ্ক ব্যবহার করে, তবে আমাদের বেশিরভাগ গণনা তিনটি মাত্রায় হয় যেখানে ত্রিভুজের দিকগুলি টুকরো টুকরো হয় গোলকের ছেদগুলি তার উত্সের মধ্য দিয়ে প্লেনগুলি দিয়ে This এটি গণনাগুলি দ্রুত এবং সহজ করে তোলে)


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

চিত্র 1

যেহেতু সমস্ত পক্ষের সমান দৈর্ঘ্য রয়েছে তাই এলোমেলোভাবে একটিকে "দীর্ঘতম" এবং বিভাগে বিভাজন হিসাবে বেছে নেওয়া হয়েছে:

চিত্র ২

নতুন ত্রিভুজগুলির প্রত্যেকটির জন্য এটি পুনরাবৃত্তি করুন:

চিত্র 3

N পদক্ষেপের পরে আমাদের 2 ^ n ত্রিভুজ হবে। 10 টি পদক্ষেপের পরে পরিস্থিতি এখানে রয়েছে, অক্ট্যান্টে 1024 ত্রিভুজ দেখানো হয়েছে (এবং পুরো ক্ষেত্রের মধ্যে 8192):

চিত্র 4

আরও একটি উদাহরণ হিসাবে, আমি এই অক্ট্যান্টের মধ্যে একটি এলোমেলো পয়েন্ট তৈরি করেছি এবং ত্রিভুজটির দীর্ঘতম দিকটি 0.05 রেডিয়ানের কম না পৌঁছানো পর্যন্ত মহকুমা গাছটি ভ্রমণ করেছি। (কার্তেসিয়ান) ত্রিভুজগুলি প্রব পয়েন্টটি লাল দেখানো হয়েছে।

চিত্র 5

ঘটনাক্রমে, বিন্দুর অবস্থানটি অক্ষাংশের এক ডিগ্রি (প্রায়) সংকীর্ণ করতে, আপনি খেয়াল করতে পারেন যে এটি প্রায় 1/60 রেডিয়ান এবং সুতরাং প্রায় (1/60) covers 2 / (পাই / 2) = 1/6000 এর কভার মোট পৃষ্ঠ। যেহেতু প্রতিটি মহকুমা প্রায় ত্রিভুজ আকারকে অর্ধেক করে দেয়, তাই অষ্টান্টের প্রায় 13 থেকে 14 টি মহকুমা কৌশলটি সম্পাদন করবে। এটি খুব বেশি গণনা নয় - যেমন আমরা নীচে দেখব - গাছটি একেবারেই না সঞ্চয় করা, তবে উড়তে মহকুমা সঞ্চালনকে দক্ষ করে তোলে। শুরুতে আপনি লক্ষ করবেন যে বিন্দুটি কী অবস্থিত - এটি তার তিনটি স্থানাঙ্কের চিহ্ন দ্বারা নির্ধারিত হয়, যা একটি তিন-অঙ্কের বাইনারি সংখ্যা হিসাবে রেকর্ড করা যায় - এবং প্রতিটি পদক্ষেপে আপনি মনে রাখতে চান যে বিন্দুটি মিথ্যা কিনা ত্রিভুজটির বাম (0) বা ডান (1) এ। এটি অন্য 14-সংখ্যার বাইনারি নম্বর দেয়। আপনি এই কোডগুলি ইচ্ছামত পয়েন্টগুলিতে গ্রুপ করতে ব্যবহার করতে পারেন।

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


আমি এটি প্রয়োগ করতে গণিত 8 টি ব্যবহার করেছি : আপনি আপনার পছন্দসই প্রোগ্রামিং পরিবেশে বাস্তবায়নের জন্য এটি যেমন-তে বা সিউডোকোড হিসাবে নিতে পারেন।

বিমানটি 0-Ab পয়েন্ট পি এর কোন দিকে রয়েছে তা নির্ধারণ করুন:

side[p_, {a_, b_}] := If[Det[{p, a, b}] >=  0, left, right];

পয়েন্ট পি এর উপর ভিত্তি করে ত্রিভুজ এবি কে পরিমার্জন করুন।

refine[p_, {a_, b_, c_}] := Block[{sides, x, y, z, m},
  sides = Norm /@ {b - c, c - a, a - b} // N;
  {x, y, z} = RotateLeft[{a, b, c}, First[Position[sides, Max[sides]]] - 1];
  m = Normalize[Mean[{y, z}]];
  If[side[p, {x, m}] === right, {y, m, x}, {x, m, z}] 
  ]

অক্টেন্ট প্রদর্শন করে এবং তার উপরে, বহুভুজের একটি সেট হিসাবে নীচের তালিকাটি উপস্থাপন করে শেষ চিত্রটি অঙ্কিত হয়েছিল:

p = Normalize@RandomReal[NormalDistribution[0, 1], 3]        (* Random point *)
{a, b, c} = IdentityMatrix[3] . DiagonalMatrix[Sign[p]] // N (* First octant *)
NestWhileList[refine[p, #] &, {a, b, c}, Norm[#[[1]] - #[[2]]] >= 0.05 &, 1, 16]

NestWhileListrefineশর্তটি সম্পর্কিত (ত্রিভুজটি বৃহত্তর) বা সর্বাধিক ক্রিয়াকলাপের গণনা না হওয়া অবধি বারবার একটি অপারেশন প্রয়োগ করে ( )।

অক্ট্যান্টের সম্পূর্ণ ত্রিভুজ্যরণটি প্রদর্শনের জন্য, আমি প্রথম অক্ট্যান্ট দিয়ে শুরু করেছি এবং দশবার পরিমার্জনকে পুনরাবৃত্তি করেছি। এটি একটি সামান্য পরিবর্তন দিয়ে শুরু refine:

split[{a_, b_, c_}] := Module[{sides, x, y, z, m},
  sides = Norm /@ {b - c, c - a, a - b} // N;
  {x, y, z} = RotateLeft[{a, b, c}, First[Position[sides, Max[sides]]] - 1];
  m = Normalize[Mean[{y, z}]];
  {{y, m, x}, {x, m, z}}
  ]

পার্থক্যটি হল যে প্রদত্ত বিন্দুটি মিথ্যা নয় তার পরিবর্তে এর ইনপুট ত্রিভুজটির উভয় অংশই splitফেরত দেয় । পূর্ণ ত্রিভুজটি এটি পুনরাবৃত্তি করে প্রাপ্ত হয়:

triangles = NestList[Flatten[split /@ #, 1] &, {IdentityMatrix[3] // N}, 10];

পরীক্ষা করতে, আমি প্রতিটি ত্রিভুজ আকারের একটি পরিমাপ গণনা করে পরিসরের দিকে তাকিয়েছি। (এই "আকার" প্রতিটি ত্রিভুজ এবং গোলকের কেন্দ্রের দ্বারা চিহ্নিত পিরামিড-আকৃতির চিত্রের সমানুপাতিক; এর মতো ছোট ত্রিভুজগুলির জন্য, এই আকারটি মূলত তার গোলাকার ক্ষেত্রের সমানুপাতিক)

Through[{Min, Max}[Map[Round[Det[#], 0.00001] &, triangles[[10]] // N, {1}]]]

{0.00523, 0.00739}

সুতরাং মাপগুলি তাদের গড় থেকে প্রায় 25% দ্বারা উপরে বা নীচে পরিবর্তিত হয়: এটি গ্রুপ পয়েন্টগুলির জন্য প্রায় অভিন্ন পথ অর্জনের পক্ষে যুক্তিসঙ্গত বলে মনে হয়।

এই কোডটি স্ক্যান করার সময়, আপনি কোনও ত্রিকোণমিতি লক্ষ্য করবেন না : কেবলমাত্র এটির দরকার পরে গোলাকার এবং কার্তেসিয়ান স্থানাঙ্কের মধ্যে পিছনে পিছনে রূপান্তর করতে হবে। কোডটি পৃথিবীর পৃষ্ঠকে কোনও মানচিত্রে প্রজেক্ট করে না, ফলে পরিবেশনকারীদের বিকৃতি এড়িয়ে চলে। অন্যথায়, এটি সমস্ত কাজ করার জন্য কেবল গড় ( Mean), পাইথাগোরিয়ান উপপাদক ( Norm) এবং একটি 3 বাই 3 নির্ধারক ( Det) ব্যবহার করে। (মত কিছু সহজ তালিকা-ম্যানিপুলেশন কমান্ড হয় RotateLeftএবং Flatten, খুব, প্রতিটি ত্রিভুজ দীর্ঘতম পাশ জন্য একটি অনুসন্ধান সহ।)


1

এটি একটি কঠিন, যেহেতু 3 ডাব্লুজিজি 84 ভৌগলিক স্থানাঙ্ক সিস্টেম থেকে ফ্ল্যাট 2 ডি প্রক্ষেপণে যাওয়ার সময় অনুমানগুলি বিকৃতি প্রবর্তন করে। বৈশ্বিক স্তরে, আপনি সিস্টেমের কোথাও বিকৃতি থাকতে বাধ্য।

আমি মনে করি আপনার সেরা বাজি হ'ল ইউনিভার্সাল ট্রান্সভার্স মারকেটর প্রক্ষেপণে প্রজেক্ট করা । আমি যতদূর জানি এটি সবচেয়ে নিকটতম আপনি কমপক্ষে বিকৃতির সাথে বিশ্বব্যাপী অভিক্ষেপ পেতে পারেন।

আপনি যদি গ্রুপগুলি সঠিক একই আকারের পাশাপাশি রিয়েল-টাইম প্রসেসিংয়ের প্রয়োজনীয়তাগুলিতে সংজ্ঞায়িত করতে পারেন তবে ডিবিএসসিএন , এবং ডেরিভেটিভসের একটি পরিবার রয়েছে যা গোষ্ঠী তৈরিতে সহায়তা করতে পারে cl


1
ইউটিএম কোনও "গ্লোবাল প্রজেকশন" নয়: বিক্ষোভটি হ'ল প্রায় কোনও জোড় বৈধ স্থানাঙ্ক, যেমন (500000, 5000000), ইউটিএম সিস্টেমে কমপক্ষে 120 স্বতন্ত্রভাবে বিচ্ছিন্ন পয়েন্টগুলির সাথে মিলে যায়। এবং, দুর্ভাগ্যক্রমে, ক্লাস্টারিং অ্যালগরিদমগুলি কেবলমাত্র তাদের অবস্থানের ভিত্তিতে (এবং অন্যান্য পয়েন্টগুলির সাথে তাদের সান্নিধ্যের ভিত্তিতে নয়) রিয়েল টাইমে পয়েন্টগুলি গ্রুপ করতে সক্ষম হওয়ার ওপির প্রয়োজনীয়তা পূরণ করে না ।
হোয়বার

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

শন, (1) গ্লোবাল প্রক্ষেপণ সমস্যার আমার সমাধানটি ব্যবহার না করে। বিদ্যমান কোন ব্যতিক্রমী-বিন্দু ছাড়া বিশ্বব্যাপী প্রক্ষেপণ। (২) সত্য, বাস্তব মন্তব্যে একটি মন্তব্য একটি মন্তব্যে হাজির। "আমার প্রথম ধারণা" এর পরে লেখা পাঠ্যটি একটি ভাল কাজ করে, যদিও এই সমস্যাটির উপর গুরুত্বারোপ করে যে অবস্থানগুলির একটি সেটকে গুচ্ছ না করে পৃথিবীর পৃষ্ঠকে বিভাজন করা of আমি সেই মুহূর্তটি ছিলাম (খুব কার্যকরভাবে নয়) আপনাকে আমার আমার পূর্ববর্তী মন্তব্যে পৌঁছানোর চেষ্টা করছিলাম।
whuber
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.