MySQL का उपयोग करके दूरी के भीतर अंक प्राप्त करें


20

मेरे पास उपयोगकर्ता नाम, अक्षांश और उपयोगकर्ता के देशांतर के साथ एक MySQL तालिका है। मैं उस उपयोगकर्ता की एक सूची प्राप्त करना चाहूंगा जो किसी दिए गए अक्षांश और देशांतर के वर्ग या वर्ग के अंदर हो। उदाहरण के लिए मेरा इनपुट Lat = 78.3232 और Long = 65.3234 और दूरी = 30 मील। मैं उन उपयोगकर्ताओं की सूची प्राप्त करना चाहूंगा, जो बिंदु 78.3232 और 65.3234 से 30 मील की दूरी के अंदर हैं। क्या एकल क्वेरी से इसे हल करना संभव है? या आप मुझे इस प्रश्न को हल करने का संकेत दे सकते हैं? मैं भू आधारित जानकारी के लिए नया हूँ।


PostGIS क्यों नहीं? यदि आप जियो प्रोजेक्ट शुरू कर रहे हैं, तो आप अपने स्टैक को बदल सकते हैं
सिम्प्लेक्सियो

stackoverflow.com/a/40272394/1281385 इस क्वेरी को तेज करने (यदि आवश्यक) में उपयोगी होना चाहिए
exussum

जवाबों:


32

SQL कथन जो निकटतम 20 स्थानों को ढूंढेगा जो 30 मील के दायरे से 78.3232, 65.3234 तक समन्वय करेगा। यह उस पंक्ति के अक्षांश / देशांतर और लक्ष्य अक्षांश / देशांतर के आधार पर दूरी की गणना करता है, और फिर केवल उन पंक्तियों के लिए पूछता है जहां दूरी का मान 30 मील से कम है, दूरी के अनुसार पूरी क्वेरी का आदेश देता है, और इसे 20 परिणामों तक सीमित करता है। मील के बजाय किलोमीटर से खोजने के लिए 3959 को 6371 से बदलें।

SELECT
  id, (
    3959 * acos (
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
  ) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;

यह Google मैप्स एपीआई v3 का उपयोग MySQL बैकएंड के साथ कर रहा है जो आपके पास पहले से है।

https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql


मैं इसे चुनकर अपने सिंटैक्स में त्रुटि प्राप्त कर रहा हूं, "# 1582 - देशी फ़ंक्शन 'रेडियंस' के लिए कॉल में गलत पैरामीटर गणना। यह क्या हो सकता है?
bluantinoo

मिला: मैं चर चर खाली था! माफ़ करना!
ब्लैंटिनो 3

वास्तव में मैं क्या चाहता था, लेकिन हजारों रिकॉर्ड के लिए क्वेरी प्रदर्शन ओवरलोड क्या है? और सटीकता के बारे में कैसे?
अमित शाह

1
मीटर की खोज के लिए इसे 6371392.896 पर बदलने के लिए बेहतर है
वासिली सुरिकोव

34

मैपरज़ का उत्तर अमान्य है। साइनस की गणना अक्षांश से की जानी चाहिए और देशांतर से नहीं। तो एसक्यूएल SQL कथन है:

SELECT
    id, (
      3959 * acos (
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;

आपका जवाब 1 आदेश दिया जाना चाहिए।
अमित शाह

@AmitShah अगर आपको लगता है कि आप पिकर (@ शशिभाक जो लगभग 6 वर्षों से साइट पर सक्रिय नहीं हैं) और / या meta.stackexchange.com/questions/268666-/ के
PolyGeo

यह स्वीकृत उत्तर होना चाहिए।
कैटबर्गर

2

यह एक समारोह बनाने के लिए आधार हो सकता है .. इसलिए आप इसे अन्य क्षेत्रों में पुन: उपयोग कर सकते हैं। आपकी क्वेरी को थोड़ा साफ कर देगा ... कम से कम यह मेरा 2 सेंट है।

DELIMITER $$

create function calcDistance(lat float, lng float, pnt_lat float, pnt_lng float)

Returns float
BEGIN

Declare dist float;
SET dist =
  3959 * acos (
  cos ( radians(pnt_lat) )
  * cos( radians( lat ) )
  * cos( radians( lng ) - radians(pnt_lng) )
  + sin ( radians(pnt_lat) )
  * sin( radians( lat ) )
);

RETURN dist;

END

यदि आप कोडस्टाइल को ठीक करते हैं तो उत्तर को बदल दिया जाएगा। यह सही तरीका है
Vasilii Suricov

0

यहाँ मेरा क्वेरी का संस्करण है, थोड़ा आसान लगता है ( http://dexxtr.com/post/83498801191/how-to-determine-point-inside-circle-use-mysql )

SELECT 
    *
FROM 
    `locator`
WHERE
    SQRT(POW(X(`center`) - 49.843317 , 2) + POW(Y(`center`) - 24.026642, 2)) * 100 < `radius`

4
यह आसान है लेकिन इस तथ्य की अनदेखी करता है कि पृथ्वी घुमावदार है।
टिम रिजावेक

सटीक होने के लिए एक सूत्र की आवश्यकता है। शायद यह कम दूरी पर ही अच्छा होगा: D
Jethro

मैं एक मिसाइल, या कुछ लॉन्च करने जा रहा हूँ?
डेनिस ब्रागा

1
@DennisBraga - यदि ऐसा है, तो शायद यह सवाल ऑफ-टॉपिक है, बेहतर http://globalathyonuclearwar.stackexchange.com के अनुकूल है ...?
ashleedawg
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.