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) को तेजी से प्रलेखित किया गया है लेकिन जरूरी नहीं कि सुपर सटीक हो; यदि आपका डेटा इसके प्रति अति संवेदनशील है, तो खोज में थोड़ा सा विग्गल रूम जोड़ें और परिणाम सेट में कुछ अच्छी ट्यूनिंग करें