SQL Academy · पाठ

दूरी और निकटतम पड़ोसी

आस-पास की चीज़ें खोजिए।

पाठ 2, कुल 4 में से13 चरण

दूरी और निकटतम पड़ोसी, CoddyKit पर SQL Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह SQL Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। SQL Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

स्थानिक दूरी क्या है

भू-स्थानिक डेटाबेस में दूरी दो भौगोलिक स्थानों के बीच मापी गई अलगाव को कहते हैं। PostGIS बिंदुओं, रेखाओं, बहुभुजों और अन्य ज्यामिति प्रकारों के बीच दूरी निकालने के लिए शक्तिशाली फलन प्रदान करता है।

दूरी संबंधी प्रश्नों को समझने से आप ऐसे प्रश्नों के उत्तर दे सकते हैं: मेरे सबसे निकट कौन-सा रेस्तराँ है? या हमारे गोदाम से 5 किमी के भीतर कौन-से ग्राहक हैं?

ST_Distance फलन

ST_Distance(geom_a, geom_b) दो ज्यामिति वस्तुओं के बीच की न्यूनतम दूरी लौटाता है। डिफ़ॉल्ट रूप से, साधारण ज्यामिति प्रकारों का उपयोग करने पर परिणाम निर्देशांक संदर्भ प्रणाली की उन्हीं इकाइयों में होता है (आमतौर पर EPSG:4326 के लिए डिग्री)।

मीटर में अर्थपूर्ण परिणाम पाने के लिए आपको भौगोलिक प्रकार का उपयोग करना चाहिए या अपने डेटा का पुनर्प्रक्षेपण करना चाहिए।

SELECT ST_Distance(
  ST_MakePoint(28.9784, 41.0082)::geography,
  ST_MakePoint(29.0100, 41.0200)::geography
) AS distance_meters;

नमूना तालिका तैयार करना

आइए, भौगोलिक निर्देशांकों वाले स्थानों की एक सरल तालिका बनाएँ। हम भौगोलिक प्रकार का उपयोग करेंगे, ताकि सभी दूरी-गणनाएँ अपने-आप मीटर में परिणाम दें — मैन्युअल प्रक्षेपण की आवश्यकता न पड़े।

इस तालिका में किसी शहर के कैफ़े होंगे, जिनमें से प्रत्येक का नाम और बिंदु के रूप में संग्रहीत स्थान होगा।

CREATE TABLE cafes (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL,
  location GEOGRAPHY(Point, 4326)
);

INSERT INTO cafes (name, location) VALUES
  ('Cafe Alpha',   ST_MakePoint(28.9784, 41.0082)::geography),
  ('Cafe Beta',    ST_MakePoint(28.9900, 41.0150)::geography),
  ('Cafe Gamma',   ST_MakePoint(29.0100, 41.0200)::geography),
  ('Cafe Delta',   ST_MakePoint(28.9650, 40.9980)::geography),
  ('Cafe Epsilon', ST_MakePoint(29.0250, 41.0350)::geography);

एक निश्चित बिंदु से दूरी निकालना

स्थान डेटा उपलब्ध होने पर आप प्रत्येक पंक्ति की दूरी किसी संदर्भ बिंदु से निकाल सकते हैं। यहाँ हम यह गणना करेंगे कि निर्देशांक (28.9800, 41.0100) पर खड़े उपयोगकर्ता से प्रत्येक कैफ़े कितनी दूर है।

परिणाम मीटर में है, क्योंकि हमने भौगोलिक प्रकार का उपयोग किया है।

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
ORDER BY distance_m;

निकटतम पड़ोसी खोजना

किसी दिए गए बिंदु से एकमात्र निकटतम स्थान खोजने के लिए दूरी के अनुसार क्रमबद्ध करें और LIMIT 1 से केवल एक पंक्ति लें। यह निकटतम-पड़ोसी प्रश्न का पारंपरिक रूप है।

स्थान-आधारित अनुप्रयोगों में यह तरीका बहुत आम है: सबसे निकट की दुकान, डॉक्टर या सार्वजनिक परिवहन केंद्र खोजना।

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 1;

निकटतम पड़ोसी के लिए &lt;-&gt; संचालक

PostGIS <-> संचालक (KNN — K निकटतम पड़ोसी) प्रदान करता है, जो अनुक्रमणिका का उपयोग कर सकता है। ORDER BY खंड में ST_Distance के विपरीत, <-> प्रत्येक पंक्ति को स्कैन करने से बचने के लिए GiST स्थानिक अनुक्रमणिका का उपयोग कर सकता है।

जब आपको निकटतम पड़ोसी कुशलतापूर्वक चाहिए हों, तो ORDER BY में सदैव <-> को प्राथमिकता दें। इसके समर्थन के लिए इस तरह की अनुक्रमणिका बनाएँ:

CREATE INDEX ON cafes USING GIST (location);

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 5;

दूरी के आधार पर फ़िल्टर करना (ST_DWithin)

ST_DWithin(geom_a, geom_b, distance) तब TRUE लौटाता है, जब दो ज्यामितियाँ एक-दूसरे से निर्दिष्ट दूरी के भीतर हों। भौगोलिक प्रकारों के लिए दूरी मीटर में होती है।

WHERE खंड में ST_Distance(...) < radius की तुलना में यह अधिक कुशल है, क्योंकि ST_DWithin अनुक्रमणिका का उपयोग कर सकता है और शर्त पूरी होते ही आगे की जाँच रोक देता है।

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
WHERE ST_DWithin(
  location,
  ST_MakePoint(28.9800, 41.0100)::geography,
  2000
)
ORDER BY distance_m;

त्रिज्या-सीमा के साथ शीर्ष-N निकटतम स्थान

उत्पादन प्रणालियों में एक सामान्य तरीका ST_DWithin को प्रारंभिक फ़िल्टर और <-> को क्रम निर्धारण के साथ जोड़ता है। ST_DWithin जाँच स्थानिक अनुक्रमणिका का उपयोग करके दूर की पंक्तियों को तेज़ी से हटा देती है, जिसके बाद बचे हुए अभ्यर्थियों को सटीक दूरी के अनुसार क्रमबद्ध किया जाता है।

इससे आपको अधिकतम त्रिज्या के भीतर के N निकटतम स्थान बहुत कुशलतापूर्वक मिल जाते हैं।

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m
FROM cafes
WHERE ST_DWithin(
  location,
  ST_MakePoint(28.9800, 41.0100)::geography,
  5000
)
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
LIMIT 3;

दो तालिकाओं के बीच दूरी (पार-दूरी)

आप दो अलग-अलग तालिकाओं की पंक्तियों के बीच दूरी को JOIN और ST_Distance के संयोजन से निकाल सकते हैं। यह मिलान के लिए उपयोगी है, जैसे प्रत्येक ग्राहक को उसके निकटतम गोदाम से या प्रत्येक घटना को निकटतम अस्पताल से जोड़ना।

नीचे हम users तालिका के प्रत्येक उपयोगकर्ता के लिए सबसे निकट का कैफ़े खोजते हैं और इसके लिए LATERAL JOIN का उपयोग करते हैं — प्रति-पंक्ति उपप्रश्नों के लिए PostgreSQL का एक शक्तिशाली तरीका।

SELECT
  u.username,
  c.name AS nearest_cafe,
  ROUND(ST_Distance(u.location, c.location)::NUMERIC) AS distance_m
FROM (
  VALUES
    ('alice', ST_MakePoint(28.9810, 41.0095)::geography),
    ('bob',   ST_MakePoint(29.0200, 41.0300)::geography)
) AS u(username, location)
CROSS JOIN LATERAL (
  SELECT name, location
  FROM cafes
  ORDER BY location <-> u.location
  LIMIT 1
) c;

दूरी के परिणाम का प्रारूपण

मीटर में दी गई कच्ची दूरियाँ पढ़ना कठिन हो सकता है। आप CASE अभिव्यक्तियों और स्ट्रिंग-स्वरूपण का उपयोग करके उन्हें किलोमीटर में प्रारूपित कर सकते हैं या मनुष्यों के लिए अनुकूल लेबल जोड़ सकते हैं। यहाँ एक ऐसा प्रश्न है, जो कम दूरियों के लिए दूरी को मीटर में और अधिक दूरियों के लिए किलोमीटर में दिखाता है।

SELECT
  name,
  CASE
    WHEN ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography) < 1000
    THEN ROUND(ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography)::NUMERIC)
         || ' m'
    ELSE ROUND((ST_Distance(location, ST_MakePoint(28.9800, 41.0100)::geography) / 1000.0)::NUMERIC, 2)
         || ' km'
  END AS formatted_distance
FROM cafes
ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography;

दूरी के आधार पर क्रम निर्धारित करना

RANK() और ROW_NUMBER() जैसे विंडो फलन दूरी संबंधी प्रश्नों के साथ बहुत अच्छी तरह काम करते हैं। आप किसी उपयोगकर्ता के सापेक्ष प्रत्येक स्थान को निकटता-क्रमांक दे सकते हैं, जो निकटता के अनुसार क्रमबद्ध सुझाव सूचियाँ या खोज परिणाम बनाने में उपयोगी है।

SELECT
  name,
  ROUND(
    ST_Distance(
      location,
      ST_MakePoint(28.9800, 41.0100)::geography
    )::NUMERIC
  ) AS distance_m,
  ROW_NUMBER() OVER (
    ORDER BY location <-> ST_MakePoint(28.9800, 41.0100)::geography
  ) AS proximity_rank
FROM cafes;

ज्ञान की जाँच

PostGIS में दूरी संबंधी प्रश्नों और निकटतम-पड़ोसी खोजों की अपनी समझ जाँचें।

पाठ का पुनरावलोकन

इस पाठ में आपने PostGIS में स्थानिक दूरियों और निकटतम-पड़ोसी प्रश्नों के साथ काम करना सीखा:

  • ST_Distance दो ज्यामितियों के बीच सटीक दूरी निकालता है; मीटर अपने-आप पाने के लिए भौगोलिक प्रकार का उपयोग करें।
  • ST_DWithin स्थानिक अनुक्रमणिका का उपयोग करके किसी त्रिज्या के भीतर की पंक्तियों को कुशलतापूर्वक फ़िल्टर करता है — WHERE खंडों में ST_Distance < radius की तुलना में इसे प्राथमिकता दें।
  • ORDER BY में <-> संचालक (KNN) अनुक्रमणिका का उपयोग कर सकता है और निकटतम N पड़ोसियों को प्राप्त करने का सबसे तेज़ तरीका है।
  • सबसे कुशल त्रिज्या के भीतर शीर्ष-N प्रश्नों के लिए ST_DWithin को प्रारंभिक फ़िल्टर और <-> को क्रम निर्धारण के साथ जोड़ें।
  • CROSS JOIN LATERAL आपको प्रति-पंक्ति आधार पर किसी दूसरी तालिका से निकटतम मिलान खोजने देता है।
  • ROW_NUMBER() जैसे विंडो फलन दूरी के क्रम में दिए गए परिणामों को निकटता-क्रमांक दे सकते हैं।

वास्तविक दुनिया के अनुप्रयोगों में स्थान-आधारित सुविधाओं की नींव यही तरीके बनाते हैं।

शुरुआत निःशुल्क

एआई शिक्षक के साथ SQL सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
46
पाठ
183

अक्सर पूछे जाने वाले प्रश्न

क्या “दूरी और निकटतम पड़ोसी” पाठ निःशुल्क है?

हाँ—“दूरी और निकटतम पड़ोसी” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और SQL Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। SQL Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“दूरी और निकटतम पड़ोसी” में मैं क्या सीखूँगा?

आस-पास की चीज़ें खोजिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ SQL Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या SQL Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर SQL Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।

“दूरी और निकटतम पड़ोसी” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस SQL Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर SQL Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. स्थानिक डेटा प्रकार
  2. दूरी और निकटतम पड़ोसी
  3. स्थानिक जॉइन और समावेशन
  4. स्थानिक इंडेक्स (GiST)
← SQL Academy पर वापस जाएँ