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

जियोलोकेशन MySQL क्वेरी

समस्या यह है कि जिस तरह से आप डेटाबेस में डेटा संग्रहीत कर रहे हैं वह आपके द्वारा किए जा रहे कार्य के प्रकार के लिए उपयुक्त नहीं है। Point का उपयोग करना Geometry में मान डेटा पॉइंट जाने का रास्ता है। वास्तव में इस उद्देश्य के लिए 4+ साल पहले कुछ कोडित किया गया था, लेकिन इसे खोजने में समस्याएं आ रही थीं। लेकिन यह पोस्ट ए> ऐसा लगता है कि इसे अच्छी तरह से कवर किया गया है।

संपादित करें ठीक है, मेरा पुराना कोड मिला, लेकिन यह पुराने क्लाइंट डेटा की बात कर रहा है जिसे मैं स्पष्ट रूप से साझा नहीं कर सकता। लेकिन डेटाबेस में निर्देशांक के साथ गति की कुंजी POINT . का उपयोग कर रही है डेटाबेस तालिका में संग्रहीत डेटा GEOMETRY . के प्रकार के साथ . अधिक विवरण यहां आधिकारिक MySQL साइट पर। चूँकि मुझे इस प्रकार के कोड पर फिर से जाने के लिए एक कारण की आवश्यकता है - और अवधारणाएँ - यहाँ कुछ समय के लिए एक त्वरित MySQL स्क्रिप्ट है जिसे मैंने मूल अवधारणाओं को व्यक्त करने के लिए नमूना डेटा के साथ एक नमूना तालिका बनाने के लिए तैयार किया है। एक बार जब आप समझ जाते हैं कि क्या हो रहा है, तो यह बहुत अच्छे विकल्प खोलता है।

यह बढ़िया/सरल स्पष्टीकरण भी मिला अवधारणा का भी।

और पाया स्थानिक डेटा का एक और बेहतरीन आकलन MySQL 5.6 में। अनुक्रमणिका और प्रदर्शन पर बहुत अच्छी जानकारी। विशेष रूप से MySQL स्थानिक सूचकांक प्रदर्शन के संबंध में:

और दूसरी तरफ:

और यहाँ मेरी मूल MySQL परीक्षण स्क्रिप्ट है जो अवधारणा को स्पष्ट करने में मदद करती है:

/* Create the database `spatial_test` */
CREATE DATABASE `spatial_test` CHARACTER SET utf8 COLLATE utf8_general_ci;

/* Create the table `locations` in `spatial_test` */
CREATE TABLE `spatial_test`.`locations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `coordinates` point NOT NULL,
  UNIQUE KEY `id` (`id`),
  SPATIAL KEY `idx_coordinates` (`coordinates`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

/* Insert some test data into it. */
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(27.174961 78.041822)'));
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(27.985818 86.923596)'));
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(44.427963 -110.588455)'));
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(19.896766 -155.582782)'));
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(40.748328 -73.985560)'));
INSERT INTO `spatial_test`.`locations` (`id`, `coordinates`) VALUES (NULL, GeomFromText('POINT(40.782710 -73.965310)'));

/* A sample SELECT query that extracts the 'latitude' & 'longitude' */
SELECT x(`spatial_test`.`locations`.`coordinates`) AS latitude, y(`spatial_test`.`locations`.`coordinates`) AS longitude FROM `spatial_test`.`locations`;

/* Another sample SELECT query calculates distance of all items in database based on GLength using another set of coordinates. */
SELECT GLength(LineStringFromWKB(LineString(GeomFromText(astext(PointFromWKB(`spatial_test`.`locations`.`coordinates`))), GeomFromText(astext(PointFromWKB(POINT(40.782710,-73.965310))))))) AS distance
FROM `spatial_test`.`locations`
;

/* Yet another sample SELECT query that selects items by using the Earth’s radius. The 'HAVING distance < 100' equates to a distance of less than 100 miles or kilometers based on what you set the query for. */
/* Earth’s diameter in kilometers: 6371 */
/* Earth’s diameter in miles: 3959 */
SELECT id, (3959 * acos(cos(radians(40.782710)) * cos(radians(x(`spatial_test`.`locations`.`coordinates`))) * cos(radians(y(`spatial_test`.`locations`.`coordinates`)) - radians(-73.965310)) + sin(radians(40.782710)) * sin(radians(x(`spatial_test`.`locations`.`coordinates`))))) AS distance 
FROM `spatial_test`.`locations`
HAVING distance < 100
ORDER BY id
;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. किसी अन्य तालिका से चयन के साथ MySQL अद्यतन

  2. क्या MySQL का टाइमज़ोन UTC पर सेट होना चाहिए?

  3. MySQL:लगातार महीनों के साथ रिकॉर्ड की संख्या

  4. प्रत्येक विवरण के साथ सभी डेटा परिवर्तनों को स्टोर करें (जैसे स्टैक ओवरफ्लो)

  5. एक तालिका के भीतर अतिव्यापी (दिनांक/समय) पंक्तियों का पता लगाएं