স্পটিএলাইটে পয়েন্ট লোকেশন সহ দুটি টেবিলের মধ্যে নিকটতম প্রতিবেশীদের সন্ধান করছেন?


10

আমি আজ স্পাটিএলাইটের সাথে খেলতে শুরু করেছি এবং ইতিমধ্যে কোনও সমস্যায় হোঁচট খেয়েছি।

সারণীতে সঞ্চিত প্রতিটি পয়েন্টের অবস্থানের জন্য আমি টেবিলটো থেকে একটি, নিকটতম (লিনিয়ার দূরত্ব) পয়েন্ট নির্বাচন করতে চাই।

এখনও অবধি আমি একটি আনাড়ি সমাধান নিয়ে এসেছি যা ভিউ ব্যবহার করে:

CREATE VIEW testview AS 
SELECT 
A.id , 
B.myValue, 
Distance(A.Geometry, B.Geometry) AS distance
FROM tableOne AS A, tableTwo AS B
WHERE distance < 10000
ORDER BY A.Id, distance;

এবং তারপর:

SELECT * FROM testview
WHERE distance = (SELECT MIN(distance) FROM testview AS t WHERE t.id = testview.id)

কাজটি মনে হচ্ছে

দুটি প্রশ্ন:

ভিউউ তৈরি না করে এই জাতীয় কোয়েরি করার কোনও উপায় আছে কি?

আরও ভাল পারফরম্যান্সের জন্য এই কোয়েরিটি অপ্টিমাইজ করার অন্য কোনও উপায় আছে কি? একটি বাস্তব বিশ্বের দৃশ্যে টেবিলের কয়েক'শ হাজার রেকর্ড, এবং টেবিলটো - 1.3 মিলিয়ন থাকবে।


আমি আপনাকে এমন একটি দৃষ্টিভঙ্গি দিতে পারি যা বেশ কয়েকটি মাত্রার দ্রুত নির্দেশ দেয়, তবে এটির জন্য আপনাকে অবশ্যই স্থানগ্রন্থের পরিবর্তে পোস্টগ্র্যাসক্লল 9 নঙ্গি সূচক ব্যবহার করা প্রয়োজন ...
রাগী ইয়াসার বারহুম

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

@ রাগি: আমি জানি যে পোস্টজিআইএস এই জাতীয় সমস্যা নিয়ে কাজ করার জন্য আরও কার্যকর উপায় হবে। তবে এই মহড়ার চূড়ান্ত লক্ষ্যটি হবে ছোট পোর্টেবল অ্যাপ্লিকেশন করা এবং এই ক্ষেত্রে স্প্যাটিয়ালাইট একটি বিজয়ী।
রাদেক

আপনার পোর্টেবল অ্যাপের জন্য আপনার বিকাশ প্ল্যাটফর্মটি কী?
অ্যালান আদায়ার

@ অ্যালান: উভয় নিয়ে কাজ করছেন: উইন্ডোজ সার্ভার ২০০৮ এবং এই মুহূর্তে উবুন্টু।
রাদেক

উত্তর:


5

আমি এই এসকিউএল পরীক্ষা করেছি এবং এটি কাজ করে:

SELECT g1.OGC_FID As id1, g2.OGC_FID As id2, MIN(ST_Distance(g1.GEOMETRY,g2.GEOMETRY)) AS DIST
FROM table_01 As g1, table_02 As g2   
WHERE g1.OGC_FID <> g2.OGC_FID
AND ST_Contains(ST_Expand(g1.geometry,50),g2.geometry)
GROUP BY id1
ORDER BY id1

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

শুভেচ্ছান্তে,

অ্যান্ড্রিয়া


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

আমিও নিশ্চিত নই যে আমি এই বিবৃতিটির উদ্দেশ্য বুঝতে পেরেছি: যেখানে g1.OGC_FID <> g2.OGC_FID
kflaw

এছাড়াও, আমার ফলস্বরূপ আমি নাল দূরত্ব পাচ্ছি। আমি এই রেখার সাথে চারপাশে খেলেছি: এবং এস এস কনটেনস (এস এস এক্সপান্ড (জি 1.জমিট্রি, 50), জি 2.geometry) পাশাপাশি এটিকে সরিয়ে ফেলেছি এবং এখনও কোনও দূরত্বের মান পাচ্ছি না, যদিও আমি আইডি
পাচ্ছি

6

আপনি যদি সমস্ত বিন্দু সংমিশ্রনের মধ্যে দূরত্বগুলি গণনা করতে না চান তবে আপনি টেবিলের একটিতে স্থানিক সূচক ব্যবহার করতে পারেন:

SELECT 
  A.id , 
  B.myValue, 
  MIN(Distance(A.Geometry, B.Geometry)) AS distance
FROM tableOne AS A, tableTwo AS B
WHERE A.ROWID IN (
  SELECT ROWID
  FROM SpatialIndex WHERE
    f_table_name = 'A' 
    AND search_frame = BuildCircleMbr(ST_X(B.Geometry), ST_Y(B.Geometry), 10000))
GROUP BY A.id, B.myValue

আমার যেমন একটি স্থানিক সূচক ব্যবহার করা প্রয়োজন তেমন পোস্ট করা সমাধানটি ব্যবহার করার চেষ্টা করেছি, তবে এটি কোনও মূল্য দেয় না? রেখার জন্য f_table_name = 'A', আমাকে কি সত্যিকারের টেবিলের নাম (টেবিলের একটি) দিয়ে 'এ' প্রতিস্থাপন করতে হবে? আমি উভয় ক্ষেত্রেই চেষ্টা করেছি এবং এটি এখনও কিছু ফেরত না, কেন এই হতে পারে
kflaw

আপনার ঠিক f_table_name = 'A'হওয়া উচিত f_table_name = 'tableOne'। নোট করুন যে এই অনুরোধটি স্থানিক> 4x অনুমান করে ( SpatialIndexভার্চুয়াল টেবিল ব্যবহৃত হয়)। আপনি কি search_frameআপনার ব্যবহারের ক্ষেত্রে সামঞ্জস্য করার চেষ্টা করেছেন ? উপরের উদাহরণে, পয়েন্টগুলি সর্বোচ্চ 10000 মিটার দূরত্বে ধরে নেওয়া হয়।
স্যামুয়েল

আমি অনুসন্ধান ফ্রেমের মানটি নিয়ে ঘুরে দেখলাম, আমি ধরে নিলাম এর অর্থ 10000 মিটারের মধ্যে যা আমার জন্য কাজ করা উচিত। আমি আসলে স্থানিক কোন সংস্করণ জানি না, আমি কিগিসের মাধ্যমে ডেটাবেস তৈরি করেছি এবং গুগিকে কিউজিসে ব্যবহার করছি। আমি দেখতে পাচ্ছি কিনা তা দেখতে দিন
kflaw

এটি স্ক্লাইট সংস্করণ 3.7.17 সহ 4.1.1 সংস্করণ, সুতরাং এটি তখন কাজ করা উচিত? আমি ভাবছি কী ভুল আমি আরও কিছু পরীক্ষা করব
কেফ্লা

3

সংস্করণ 4.4.0 যেহেতু স্পাটিএলাইট নিকটবর্তী প্রতিবেশী সমস্যার জন্য একটি কেএনএন ভার্চুয়াল টেবিল সূচককে সমর্থন করে। এখানে একটি কোয়েরিটি রয়েছে যে বিন্দু সারণীতে প্রতিটি বিন্দুতে লাইনস্ট্রিিং টেবিলের নিকটতম রেখাটি সন্ধান করে।

SELECT k.* FROM knn k, points p
WHERE f_table_name = 'linestrings' 
AND ref_geometry = p.geometry
AND max_items = 1;

2

আপনি আপনার ক্যোয়ারীটিকে এভাবে সরল করতে পারেন।

SELECT 
   A.id , 
   B.myValue, 
   MIN(Distance(A.Geometry, B.Geometry)) AS distance
FROM tableOne AS A, tableTwo AS B
GROUP BY A.id, B.myValue

আরও জেনেরিক সমাধানের জন্য, এই পোস্টজিআইএস নিকটতম নিকটবর্তী ফাংশনটি রূপান্তরিত করার চেষ্টা করা উপযুক্ত: http://blog.mackerron.com/2011/03/postgis-nearest-neighbour/


দুর্ভাগ্যক্রমে SQL error: "misuse of aggregate: MIN()"
কোডটির

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