Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL में दिए गए दायरे में क्वेरी पॉइंट्स

MySQL 5.7+ के लिए

यह देखते हुए कि हमारे पास निम्नलिखित सरल तालिका है,

create table example (
  id bigint not null auto_increment primary key,
  lnglat point not null
);

create spatial index example_lnglat 
    on example (lnglat);

निम्नलिखित सरल डेटा के साथ,

insert into example (lnglat) 
values
(point(-2.990435, 53.409246)),
(point(-2.990037, 53.409471)),
(point(-2.989736, 53.409676)),
(point(-2.989554, 53.409797)),
(point(-2.989350, 53.409906)),
(point(-2.989178, 53.410085)),
(point(-2.988739, 53.410309)),
(point(-2.985874, 53.412656)),
(point(-2.758019, 53.635928));

आपको किसी अन्य बिंदु की दी गई सीमा के भीतर अंक मिलेंगे (नोट:हमें बहुभुज के अंदर खोजना होगा) सेंट फ़ंक्शंस के निम्नलिखित संयोजन के साथ:

set @px = -2.990497;
set @py = 53.410943;
set @range = 150; -- meters
set @rangeKm = @range / 1000;

set @search_area = st_makeEnvelope (
  point((@px + @rangeKm / 111), (@py + @rangeKm / 111)),
  point((@px - @rangeKm / 111), (@py - @rangeKm / 111))
);

select id, 
       st_x(lnglat) lng, 
       st_y(lnglat) lat,
       st_distance_sphere(point(@px, @py), lnglat) as distance
  from example
 where st_contains(@search_area, lnglat);

परिणामस्वरूप आपको कुछ ऐसा दिखाई देना चाहिए:

3   -2.989736   53.409676   149.64084252776277
4   -2.989554   53.409797   141.93232714661812
5   -2.98935    53.409906   138.11516275402533
6   -2.989178   53.410085   129.40289289527473

दूरी के संदर्भ के लिए, यदि हम बाधा को हटाते हैं तो परीक्षण बिंदु के लिए परिणाम इस तरह दिखता है:

1   -2.990435   53.409246   188.7421181457556
2   -2.990037   53.409471   166.49406509160158
3   -2.989736   53.409676   149.64084252776277
4   -2.989554   53.409797   141.93232714661812
5   -2.98935    53.409906   138.11516275402533
6   -2.989178   53.410085   129.40289289527473
7   -2.988739   53.410309   136.1875540498202
8   -2.985874   53.412656   360.78532732013963
9   -2.758019   53.635928   29360.27797292756

नोट 1 :फ़ील्ड को lnglat कहा जाता है क्योंकि यदि आप बिंदुओं (x, y) के बारे में सोचते हैं तो यह सही क्रम है और यह वह क्रम भी है जो अधिकांश फ़ंक्शन (जैसे बिंदु) पैरामीटर को स्वीकार करते हैं

नोट 2 :यदि आप मंडलियों का उपयोग करते हैं तो आप वास्तव में स्थानिक अनुक्रमणिका का लाभ नहीं उठा सकते हैं; यह भी ध्यान दें कि बिंदु फ़ील्ड को शून्य स्वीकार करने के लिए सेट किया जा सकता है, लेकिन स्थानिक अनुक्रमणिका इसे अनुक्रमित नहीं कर सकते हैं यदि यह अशक्त है (सूचकांक में सभी फ़ील्ड गैर-शून्य होना आवश्यक है)।

नोट 3 :st_buffer को (दस्तावेज़ीकरण द्वारा) इस उपयोग के मामले के लिए खराब माना जाता है

नोट 4 :उपरोक्त कार्यों (विशेष रूप से st_distance_sphere) को तेजी से प्रलेखित किया गया है लेकिन जरूरी नहीं कि सुपर सटीक हो; यदि आपका डेटा इसके प्रति अति संवेदनशील है, तो खोज में थोड़ा सा विग्गल रूम जोड़ें और परिणाम सेट में कुछ अच्छी ट्यूनिंग करें



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एंड्रॉइड स्टूडियो में सभी गतिविधियों में खाते की जानकारी रखें

  2. 500 आंतरिक सर्वर त्रुटि?

  3. MySQL और PHP - उन सभी पंक्तियों को कैसे प्रदर्शित करें जहाँ फ़ील्ड मान x के बराबर है?

  4. गैर-रूट उपयोगकर्ता के रूप में MySQL डेटाबेस w/C# से कनेक्ट करें?

  5. पीडीओ स्टेटमेंट में कॉलम का नाम गतिशील रूप से बदलें