পোস্টজিআইএস-এ সময় সম্পর্কিত পয়েন্ট ক্লাস্টারগুলি কীভাবে চিহ্নিত ও সরল করা যায়?


11

আমি কেবলমাত্র স্থানিক ডাটাবেসগুলির সাথে কাজ শুরু করেছি এবং কাঁচা জিপিএস-ট্র্যাকগুলি (স্থির ট্র্যাকিং ফ্রিকোয়েন্সি সহ) স্বয়ংক্রিয় জেনারাইজ করার জন্য একটি এসকিউএল (পোস্টজিআইএস) কোয়েরি লিখতে চাই। প্রথম যে বিষয়টি নিয়ে আমি জেগে উঠছি তা হ'ল একটি ক্যোয়ারী যা প্রতিনিধি পয়েন্ট দ্বারা বিশাল পয়েন্ট মেঘের প্রতিস্থাপনের জন্য "y মিটার দূরত্বের মধ্যে x পয়েন্ট" এর মত প্রশ্নের আকারে স্থির অবস্থানগুলি চিহ্নিত করে। আমি ইতিমধ্যে একটি নির্দিষ্ট দূরত্বে পয়েন্টগুলি স্ন্যাপ করতে এবং ছিটিয়ে থাকাগুলি গণনা করতে পেরেছি। নীচের ছবিতে যে কোনও কাঁচা উদাহরণ ট্র্যাক (ছোট কালো পয়েন্ট) এবং বর্ণিত পয়েন্টগুলির কেন্দ্রগুলি রঙিন চেনাশোনা (আকার = স্নেপড পয়েন্টের সংখ্যা) হিসাবে দেখতে পাবে।

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

CREATE table simplified AS 
 SELECT count(raw.geom)::integer AS count, st_centroid(st_collect(raw.geom)) AS center
   FROM raw
  GROUP BY st_snaptogrid(raw.geom, 500, 0.5)
  ORDER BY count(raw.geom) DESC;

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

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

আমার জন্য কারও কি কোন পরামর্শ আছে? আমি আশা করি আমার প্রশ্নটি পরিষ্কার।


লাইন-ধারণার জন্য আপনাকে ধন্যবাদ। আপনি নীচের স্ক্রিনশটে দেখতে পাবেন যেভাবে একটি লাস্টারিং তৈরি এবং সরল করে তুলতে পেরেছি (বিন্দুগুলি মূল পয়েন্ট)। এখানে চিত্র বর্ণনা লিখুন আমার এখনও যা দরকার তা হল বিশ্রামের জায়গাগুলি (> x x ব্যাসার্ধের মধ্যে x পয়েন্ট) নির্ধারণ করা, আদর্শভাবে আগত সময় এবং একটি প্রস্থান সময় সহ এক পয়েন্ট হিসাবে ... অন্য কোনও ধারণা?


2
আপনার অন্যান্য উদ্দেশ্যগুলির জন্য আসলে পয়েন্টগুলি দরকার? অন্যথায়, এটি সম্ভবত পয়েন্টগুলি থেকে লাইন তৈরি করার মত মনে হচ্ছে এবং তারপরে সেই লাইনগুলিকে সরলকরণ / জেনারেলাইজ করা আপনার উদ্দেশ্যকে উপস্থাপন করবে।
অ্যান্টনি -জিস্কো-

2
এটি একটি আকর্ষণীয় সমস্যা। আপনি মূলত একই প্রশ্ন যে জিজ্ঞাসা করা হল থেকে কিছু ধারনা সংগ্রহ করতে সক্ষম হতে পারেন ম্যাথামেটিকাল এ সাইটে mathematica.stackexchange.com/questions/2711 । সমস্ত উত্তর তথ্যের অস্থায়ী মাত্রা ব্যবহার করে না (তবে আমার এটি করে :-))।
হোয়বার

@ অ্যান্টনি-গিসকো- এটি একটি আকর্ষণীয় পদ্ধতি। যদি পয়েন্ট বৈশিষ্ট্যগুলির প্রয়োজন হয় তবে সাধারণ রেখাগুলি থেকে শীর্ষে বা এখানে gis.stackexchange.com/questions/27102/… এর মতো লাইনগুলি দিয়ে নতুন তৈরি করা যেতে পারে । আমি জানি, সেগুলি এখনও মূল পয়েন্ট নয়!
andytilia

@ অ্যান্টনি: আমার যে কোনও স্থির স্ট্যান্ড এবং কমপক্ষে শুরু এবং শেষ সময়টির "প্রতিনিধিত্ব" অবশ্যই দরকার ...
বার্লিন_জে

1
এবং পোস্টগ্রিস-সমাধান পাওয়া সত্যিই দরকারী হবে :)
বার্লিন_জে

উত্তর:


4

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

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


3

ইতিমধ্যে, আমি আমার সমস্যার সমাধান খুঁজে পেয়েছি:

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

     SELECT t1.id, t1.dist_type, t1."time", t1.the_geom, t1.group_flag, sum(t1.group_flag) OVER (ORDER BY t1.id) AS group_nr
FROM ( SELECT distances.id, distances.the_geom, distances."time", distances.dist_type, 
                CASE
                    WHEN lag(distances.dist_type) OVER (ORDER BY distances.id) = distances.dist_type THEN NULL::integer
                    ELSE 1
                END AS group_flag
           FROM distances) t1;

ফলাফলের টেবিলটি নীচে দেখায়:

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

পরবর্তী পরবর্তী পদক্ষেপটি "স্টপ" পয়েন্টগুলিকে গোষ্ঠীভুক্ত করে, এই পয়েন্ট গ্রুপগুলির সেন্ট্রয়েড চিহ্নিত করে এবং আগত এবং ছেড়ে যাওয়ার সময় হিসাবে সর্বনিম্ন এবং সর্বাধিক টাইমস্ট্যাম্প গ্রহণ করে।

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