MySQL डेटाबेस में अक्षांश / देशांतर को संग्रहीत करते समय उपयोग करने के लिए आदर्श डेटा प्रकार क्या है?


431

इस बात को ध्यान में रखते हुए कि मैं हाल ही में लंबी / लंबी जोड़ी पर गणना कर रहा हूँ, डेटासाइप एक MySQL डेटाबेस के साथ उपयोग के लिए सबसे उपयुक्त है?


1
मुझे यह लिंक बहुत उपयोगी लगा: howto-use-mysql-spatial-ext.blogspot.com/2007/11/… यह थोड़ा बड़ा हो सकता है, लेकिन इसमें उदाहरण सहित पूरी व्याख्या शामिल है।
एमएडीसी

इम्हो अधिकांश लोग यह नहीं समझते कि क्या होता है। जैसे ही ऐप कोड एक नंबर को छूता है, बशर्ते कोई एक डबल्स का उपयोग करता है (जो कि सबसे अधिक होता है), संख्या सबसे अधिक डबल परिशुद्धता में बदल जाती है । फिर भी एक लाख डेसीमल के साथ इसे स्टोर करने से कोई अच्छा नहीं होगा। इसे सीमित संख्या में डेसीमल (जैसे। 6) के साथ संग्रहित करने से उस परिशुद्धता का हिस्सा नष्ट हो जाता है और डेटाबेस में फिर से लिखे जाने पर हर बार संचित त्रुटि जुड़ जाती है । एक दोहरी सीए 16 महत्वपूर्ण संख्याओं को वहन करती है, संभवतः सभी दशमलव। उनमें से 10 को स्क्रैप करने से समय के साथ एक संचित त्रुटि पैदा होती है। यह कारण के लिए "फ्लोटिंग पॉइंट" है। जारी।
स्टॉर्मविंड

योगदान: जब किसी बाहरी स्रोत से प्राप्त किया गया हो, तो पहली बार 6 डेसीमल ठीक हो सकता है, बिना स्रोत के और पहली बार - स्रोत सामग्री से। लेकिन अगर एक बार भी उस पर एक गणना प्रदर्शन, और इसे फिर से भंडारण, यह है गूंगा एक विशिष्ट दशमलव स्वरूप को लागू करके यह परिशुद्धता के हिस्से को हटाने के लिए। पूरी तरह से सर्वर के अंदर गणना करना अलग हो सकता है (सर्वर आंतरिक रूप से डबल्स की तुलना में कुछ और का उपयोग नहीं कर सकता है), और ऐप गणना में डबल की तुलना में खराब संख्यात्मक प्रतिनिधित्व का उपयोग करके भंडारण परिशुद्धता की आवश्यकता को समान रूप से कम करता है।
स्टॉर्मविंड

कंट: यदि दावा "9.6" (जो मुझे नहीं पता है कि यह करता है) के बावजूद , सर्वर एक उच्च परिशुद्धता के साथ संख्या को संग्रहीत करता है, तो यह सब कुछ भी मायने नहीं रखता है, और प्रारूप विशुद्ध रूप से सुविधा की बात है - बहुत कम है सटीक मुद्दों के साथ करते हैं। लेकिन मुझे आश्चर्य नहीं होगा अगर सर्वर वास्तव में उस प्रारूप के साथ 6 दशमलव परिशुद्धता में किसी भी संख्या को गोल करता है।
स्टॉर्मविंड

Cont: अंत में: lat के लिए, lon's, 6th दशमलव एक ca में तड़कने की बात है। 11-सेंटीमीटर ग्रिड। हर बार जब कोई 6 (दशमलव) पढ़ता है (छूता है), फिर से गणना करता है और संग्रहीत करता है, तो एक नया तड़कना (= संचित त्रुटि) होगा। यदि एक ही दिशा में जाने के लिए सभी त्रुटियां होती हैं, तो एक बड़ी त्रुटि होगी। यदि उस पर अस्थायी गुणन करना (जैसे। स्केल अप, फिर घटाना और स्केल डाउन), तो यह और भी बड़ा हो सकता है। एक अच्छा रासन के बिना सटीक स्क्रैप न करें!
स्टॉर्मविंड

जवाबों:


161

GIS के साथ MySQL के स्थानिक एक्सटेंशन का उपयोग करें ।


25
क्या आपके पास उदाहरण के लिए कोई अन्य लिंक या कोई अन्य जानकारी है कि उनके साथ सबसे अच्छी शुरुआत कैसे करें?
कोडबीफ

6
MYSQL स्थानिक एक अच्छा विकल्प है, लेकिन अभी भी महत्वपूर्ण सीमाएं और चेतावनी (6 के रूप में) है। कृपया मेरा जवाब नीचे देखें ...
जेम्स स्कैच

1
@ जेम्स शेक सही है। इसके अलावा, MySQL यह सब यूक्लिडियन ज्यामिति का उपयोग करके गणना करता है, इसलिए यह lat / lng के लिए वास्तविक दुनिया के उपयोग के मामले का प्रतिनिधित्व नहीं करता है।
mkuech

FYI करें; मैसिकल केवल * .isisam टेबल, यानी ISAM इंजन के साथ स्थानिक सूचकांक का समर्थन करता है। लिंक: dev.mysql.com/doc/refman/5.0/en/creating-spatial-indexes.html
PodTech.io

इस लेख को अंत अद्यतन भाग में देखें: mysqlserverteam.com/mysql-5-7-and-gis-an-example
Singh

149

Google, Google मैप्स के साथ "स्टोर लोकेटर" एप्लिकेशन के उदाहरण के लिए PHP / MySQL समाधान समाप्त करने के लिए एक शुरुआत प्रदान करता है। इस उदाहरण में, वे "10,6" की लंबाई के साथ "फ्लोट" के रूप में लाट / लैंग मूल्यों को संग्रहीत करते हैं।

http://code.google.com/apis/maps/articles/phpsqlsearch.html


11
Google स्पष्ट रूप से यह नहीं समझता है कि FLOAT विनिर्देश कैसे काम करता है: FLOAT(10,6)समन्वय के पूर्णांक भाग के लिए 4 अंक छोड़ता है। और नहीं, साइन की गिनती नहीं है - जो (अन) हस्ताक्षरित विशेषता से आता है।
एलिक्स एक्सल

2
लेकिन अगर आपको [0, 180] से अभिन्न अंग मूल्यों के रूप में संग्रहीत करने की आवश्यकता है, तो अधिक पर्याप्त होना चाहिए, है ना?
हृदयोज गोलकिक

37
@AlixAxel मुझे लगता है कि Google जानता है कि वह क्या कर रहा है। क्योंकि इसमें कहा गया है कि: " Google मैप्स की वर्तमान ज़ूम क्षमताओं के साथ, आपको दशमलव के बाद केवल 6 अंकों की सटीकता की आवश्यकता होनी चाहिए। यह फ़ील्ड दशमलव के बाद 6 अंकों को संग्रहीत करने देगा, साथ ही दशमलव से पहले 4 अंकों तक, जैसे - 123.456789 डिग्री। ”। यदि अहस्ताक्षरित की जांच की जाती है तो पैटर्न 1234,567890 होगा । तो कोई समस्या नहीं।
1.44mb

16
@AlixAxel वह अनुक्रम में संख्याओं की गिनती कर रहा है; एक वास्तविक समन्वय का उपयोग नहीं कर रहा है ...
एंड्रयू एलिस

8
DoubleLaravel के लिए डेटाटाइप का उपयोग करना
FooBar

133

मूल रूप से यह आपके स्थानों के लिए आवश्यक सटीकता पर निर्भर करता है। DOUBLE के उपयोग से आपके पास 3.5nm का सटीक होगा। DECIMAL (8,6) / (9,6) 16cm नीचे चला जाता है। FLOAT 1.7 मीटर है ...

इस बहुत ही रोचक तालिका में एक और पूरी सूची है: http://mysql.rjweb.org/doc.php/latlit :

Datatype               Bytes            Resolution

Deg*100 (SMALLINT)     4      1570 m    1.0 mi  Cities
DECIMAL(4,2)/(5,2)     5      1570 m    1.0 mi  Cities
SMALLINT scaled        4       682 m    0.4 mi  Cities
Deg*10000 (MEDIUMINT)  6        16 m     52 ft  Houses/Businesses
DECIMAL(6,4)/(7,4)     7        16 m     52 ft  Houses/Businesses
MEDIUMINT scaled       6       2.7 m    8.8 ft
FLOAT                  8       1.7 m    5.6 ft
DECIMAL(8,6)/(9,6)     9        16cm    1/2 ft  Friends in a mall
Deg*10000000 (INT)     8        16mm    5/8 in  Marbles
DOUBLE                16       3.5nm     ...    Fleas on a dog

उम्मीद है की यह मदद करेगा।


2
मुझे पदों की सामग्री पर केंद्रित एक रचनात्मक, विस्तृत टिप्पणी लिखने की आवश्यकता है, इसलिए मैं यह कहूंगा कि रिक जेम्स की वेबसाइट से प्रदान की गई सटीकता तालिका का अवलोकन करते हुए, मुझे रिज़ॉल्यूशन विवरण "एक कुत्ते पर पिस्सू" पर हल्का आश्चर्य हुआ था यह उसे कुदोस के योग्य लगा। तकनीकी रूप से, यह एक सहायक चित्रण था जिसने मुझे यह तय करने में सहायता दी कि दो पतों के बीच की दूरी को मापने के लिए निर्देशांक संग्रहीत करते समय क्या डेटाटाइप का उपयोग करना है, जो, @Simon, मैं आपको साझा करने के लिए धन्यवाद देना चाहता हूं।
सैम_Butler

FWIW, कि "कड़ी स्केल" के लिंक का उपयोग भयावह रूप से अक्षम है। Oguzhan का उत्तर , दशमलव बिंदु के बाद 7 अंको के साथ 4-बाइट हस्ताक्षरित इंट में लंबे / लाट को संग्रहीत करने का एक शानदार तरीका है । छोटे आकार में महान परिशुद्धता (~ 1 सेमी) (4 बी)।
टूलमेकरसैट

74

MySQL के स्थानिक एक्सटेंशन सबसे अच्छा विकल्प हैं क्योंकि आपके पास अपने निपटान में स्थानिक ऑपरेटरों और सूचकांकों की पूरी सूची है। एक स्थानिक सूचकांक आपको बहुत तेज़ी से दूरी-आधारित गणना करने की अनुमति देगा। कृपया ध्यान रखें कि 6.0 के रूप में, स्थानिक विस्तार अभी भी अधूरा है। मैं MySQL स्थानिक नीचे नहीं डाल रहा हूँ, इससे पहले कि आप इस पर बहुत दूर जाने से पहले आप नुकसान के बारे में जानते हैं।

यदि आप बिंदुओं और केवल DISTANCE फ़ंक्शन के साथ सख्ती से काम कर रहे हैं, तो यह ठीक है। यदि आपको पॉलीगॉन, लाइन्स या बफर-पॉइंट्स के साथ कोई गणना करने की आवश्यकता है, तो स्थानिक ऑपरेटर सटीक परिणाम प्रदान नहीं करते हैं जब तक कि आप "संबंधित" ऑपरेटर का उपयोग नहीं करते हैं। 21.5.6 के शीर्ष पर चेतावनी देखें । एमबीआर का उपयोग करते हुए, भीतर या चौराहों जैसे संबंध सटीक ज्यामिति के आकार का नहीं होते हैं (जैसे कि एक इलिप को आयत की तरह माना जाता है)।

इसके अलावा, MySQL स्थानिक में दूरियां आपकी पहली ज्यामिति के समान इकाइयों में हैं। इसका मतलब है कि यदि आप दशमलव दशमलव का उपयोग कर रहे हैं, तो आपकी दूरी माप दशमलव में है। इससे सटीक परिणाम प्राप्त करना बहुत मुश्किल हो जाएगा क्योंकि आप भूमध्य रेखा से फ़ुरथुर प्राप्त करते हैं।


26
रेस्टिंग: MySQL स्पैटियल एक्सटेंशन्स लैट / लॉन्ग द्वारा दर्शाई गई पृथ्वी की सतह पर बिंदुओं के बीच महान सर्कल दूरी की गणना के लिए उपयुक्त नहीं हैं। उनकी दूरी के कार्य, आदि, केवल कार्टेसियन, प्लानर, निर्देशांक पर उपयोगी हैं।
ओ जोन्स

71

जब मैंने ARINC424 से निर्मित एक नेविगेशन डेटाबेस के लिए ऐसा किया था तो मैंने काफी मात्रा में परीक्षण किया था और कोड को देख रहा था, मैंने एक DECIMAL (18,12) (वास्तव में एक NUMERIC (18,12) का उपयोग किया क्योंकि यह अग्निरोधी था)।

फ़्लोट्स और डबल्स उतने सटीक नहीं हैं और इसके परिणामस्वरूप राउंडिंग त्रुटियां हो सकती हैं जो बहुत बुरी बात हो सकती है। मुझे याद नहीं है कि क्या मुझे कोई वास्तविक डेटा मिला है जिसमें समस्याएं थीं - लेकिन मैं काफी निश्चित हूं कि फ्लोट या एक डबल में सटीक रूप से स्टोर करने में असमर्थता समस्या पैदा कर सकती है

मुद्दा यह है कि डिग्री या रेडियन का उपयोग करते समय हम मूल्यों की सीमा को जानते हैं - और आंशिक भाग को सबसे अधिक अंकों की आवश्यकता होती है।

MySQL स्थानिक एक्सटेंशन क्योंकि वे का पालन एक अच्छा विकल्प हैं opengis ज्यामिति मॉडल । मैंने उनका उपयोग नहीं किया क्योंकि मुझे अपने डेटाबेस को पोर्टेबल रखने की आवश्यकता थी।


3
धन्यवाद, यह मददगार था। 2008 के इन सभी सवालों और जवाबों को पढ़कर अजीब लगता है, यह एहसास 8 साल पहले ही हो गया था।
22

1
@TheSexiestManinJamaica - IEEE 754-1985 से पहले, कंप्यूटर फ्लोटिंग-पॉइंट हार्डवेयर अव्यवस्थित था। यहां तक ​​कि मशीन पर भी था जहां a*bसमान नहीं था b*a(कुछ मूल्यों के लिए)। कुछ हद तक इस तरह के कई उदाहरण थे: 2+2 = 3.9999। मानक ने बहुत गंदगी को साफ किया, और हार्डवेयर और सॉफ्टवेयर के लगभग हर टुकड़े द्वारा 'तेजी से' अपनाया गया था। इसलिए, यह चर्चा केवल 2008 के बाद से ही नहीं, बल्कि एक तिहाई सदी के लिए मान्य है।
रिक जेम्स

42

आपके द्वारा आवश्यक परिशुद्धता पर निर्भर करता है।

Datatype           Bytes       resolution
------------------ -----  --------------------------------
Deg*100 (SMALLINT)     4  1570 m    1.0 mi  Cities
DECIMAL(4,2)/(5,2)     5  1570 m    1.0 mi  Cities
SMALLINT scaled        4   682 m    0.4 mi  Cities
Deg*10000 (MEDIUMINT)  6    16 m     52 ft  Houses/Businesses
DECIMAL(6,4)/(7,4)     7    16 m     52 ft  Houses/Businesses
MEDIUMINT scaled       6   2.7 m    8.8 ft
FLOAT                  8   1.7 m    5.6 ft
DECIMAL(8,6)/(9,6)     9    16cm    1/2 ft  Friends in a mall
Deg*10000000 (INT)     8    16mm    5/8 in  Marbles
DOUBLE                16   3.5nm     ...    Fleas on a dog

प्रेषक: http://mysql.rjweb.org/doc.php/latlng

संक्षेपित करते हुए:

  • सबसे सटीक उपलब्ध विकल्प है DOUBLE
  • सबसे आम देखा जाने वाला प्रकार है DECIMAL(8,6)/(9,6)

MySQL 5.7 के रूप में , स्थानिक डेटा प्रकार (SDT) का उपयोग करने पर विचार करें , विशेष रूप से POINTएकल समन्वय के लिए। 5.7 से पहले, SDT अनुक्रमित का समर्थन नहीं करता है (5.6 के अपवाद के साथ जब तालिका प्रकार MyISAM है)।

ध्यान दें:

  • POINTकक्षा का उपयोग करते समय , निर्देशांक के भंडारण के लिए तर्कों का क्रम होना चाहिए POINT(latitude, longitude)
  • स्थानिक सूचकांक बनाने के लिए एक विशेष वाक्यविन्यास है ।
  • एसडीटी का उपयोग करने का सबसे बड़ा लाभ यह है कि आपके पास स्थानिक विश्लेषण कार्यों तक पहुंच है , उदाहरण के लिए दो बिंदुओं ( ST_Distance) के बीच की दूरी की गणना करना और यह निर्धारित करना कि क्या एक बिंदु दूसरे क्षेत्र के भीतर निहित है ( ST_Contains)।

2
आप एक पिछले उत्तर के पिछले भाग की नकल करते हैं और उस तालिका को बनाने वाले किसी व्यक्ति के साथ "संक्षेप" करते हैं, जिसकी अनुशंसा नहीं की गई थी : «कैसे करें पार्टिशन? खैर, MySQL बहुत picky है। तो FLOAT / DOUBLE बाहर हैं। DECIMAL बाहर है। तो, हम कुछ कीचड़ के साथ फंस गए हैं। अनिवार्य रूप से, हमें Lat / Lng को INT के कुछ आकार में बदलने की आवश्यकता है और पार्टी द्वारा पार्टीशन का उपयोग करें। » और «FLOAT में 24 महत्वपूर्ण बिट्स हैं; DOUBLE में 53 हैं। (वे साझेदारी के साथ काम नहीं करते हैं, लेकिन पूर्णता के लिए शामिल हैं। अक्सर लोग DOUBLE का उपयोग यह महसूस किए बिना करते हैं कि यह कितना ओवरकिल है , और यह कितना स्थान लेता है।) »बस आपने जो एसडीटी भाग लिखा है उसे छोड़ दें।
आर्मफूट 11

1
@Armfoot यदि आप संपादन के समय को देखते हैं, तो यह दूसरा उत्तर है जो मुझसे कॉपी किया गया है। ऐसा नहीं है कि यह मायने रखता है: मैं स्टैक ओवरफ्लो को "भविष्य के लिए नोट्स" के रूप में देख रहा हूं।
गजस

1
नहीं, वह आपसे कॉपी नहीं करता, उसने 2014 की संदर्भित लिंक (आपकी पोस्ट 2015 से है) से जैसे आपने किया था वैसे ही टेबल को चिपकाया था। Btw, मुझे लगता है कि जब आप स्थानिक डेटा प्रकारों को लिंक करते हैं तो आपको "विशेष" याद आती है । आपके द्वारा लिखा गया यह हिस्सा वास्तव में उन लोगों के लिए उपयोगी है जो उनका उपयोग शुरू करना चाहते हैं, यदि आप कुछ और उदाहरणों को जोड़ते हैं जैसे कि CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g)) ENGINE=MyISAM;और एसडीटी सीमाओं के बारे में चेतावनी, जैसा कि जेम्स ने उल्लेख किया है , शायद आपका जवाब अन्य लोगों की मदद करने में भी अधिक संक्षिप्त और सटीक होगा। ..
आर्मफुट 12

@ गजस - मुझे इस बात का सम्मान है कि आप में से दो को मेरा दस्तावेज़ मिला! (नहीं, मुझे नहीं पता कि पिस्सू कितना बड़ा है, लेकिन मुझे लगा कि यह किसी का ध्यान आकर्षित करेगा।)
रिक जेम्स

POINT वर्ग का उपयोग करते समय, निर्देशांक संग्रहीत करने के लिए तर्कों का क्रम POINT (देशांतर / X, अक्षांश / Y) होना चाहिए।
एंड्रेपी


19

का प्रयोग करें DECIMAL(8,6)अक्षांश (90 -90 अंश) के लिए और DECIMAL(9,6)देशांतर (180 -180 अंश) के लिए। अधिकांश अनुप्रयोगों के लिए 6 दशमलव स्थान ठीक है। नकारात्मक मूल्यों की अनुमति के लिए दोनों को "हस्ताक्षरित" किया जाना चाहिए।


DECIMALप्रकार वित्तीय गणना के लिए अभिप्रेत है जहाँ कोई floor/ceilस्वीकार नहीं किया जाता है। सादे FLOATकाफी बेहतर प्रदर्शन करते हैं DECIMAL
कोंडायबस

1
@ कोंडायबस - चूंकि डेटाबेस में मुख्य लागत पंक्तियां ले रही हैं, इसलिए फ्लोट और दशमलव के बीच प्रदर्शन अंतर चिंता का विषय नहीं होना चाहिए।
रिक जेम्स

14

Google मानचित्र के अनुसार, दूर जाने की कोई आवश्यकता नहीं है, सबसे अच्छा है FLOAT (10,6) लेट और लैंग के लिए।


आपको यह जानकारी कहां से मिली, मुझे यह नहीं मिला बस मामले में कुछ बदल जाता है।
2

1
@webfacer, यह "MySQL में एक तालिका बनाना" खंड में है: यहाँ पर Developers.google.com/maps/documentation/javascript/… उदाहरणार्थ lat FLOAT( 10, 6 ) NOT NULL, lng FLOAT( 10, 6 ) NOT NULL
turrican_34

1
@webfacer, ऐसा लगता है कि FLOATवाक्य रचना के रूप में पदावनत किया गया है mysql 8.0.17। Mysql अब FLOATकिसी भी सटीक मापदंडों dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html और dev.mysql.com/doc/refman/5.5/en=floating-point- के
turrican_34

7

हम डबल्स के साथ राउंड ऑफ एरर से बचने के लिए NUMBERS के रूप में अपने ऑरेकल डेटाबेस में अक्षांश / देशांतर X 1,000,000 को स्टोर करते हैं।

यह देखते हुए कि 6 वें दशमलव स्थान के लिए अक्षांश / देशांतर 10 सेमी की सटीकता थी जिसकी हमें आवश्यकता थी। कई अन्य डेटाबेस भी 6 वें दशमलव स्थान पर lat / long स्टोर करते हैं।


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

@KaitlinDuckSherwood - बिट्स बिट्स हैं - मुझे किसी भी कारण के बारे में पता नहीं है कि 32-बिट पूर्णांक की तुलना में एक 32-बिट फ्लोट पुनर्प्राप्ति (अनुक्रमित या अन्यथा) के लिए धीमा होगा। यहां तक ​​कि फ्लोटिंग गणित भी इन दिनों एक गैर-मुद्दा बनने के लिए काफी तेज है। फिर भी, मैं एक पूर्णांक के साथ निहित गुणक का उपयोग करने के लिए टिप्पणी से सहमत हूं: यह आपके द्वारा 32 बिट्स से निकलने वाली परिशुद्धता को अधिकतम करता है। प्रौद्योगिकी में सुधार के रूप में भविष्य के साक्ष्य का एक सा।
टूलमेकरसेव

6

पूरी तरह से अलग और सरल परिप्रेक्ष्य में:

इस तरह से आपको अनुक्रमण संख्याओं और डेटा प्रकारों से जुड़ी अन्य सभी समस्याओं के बारे में चिंता करने की आवश्यकता नहीं है जो आपके निर्देशांक को खराब कर सकती हैं।


अच्छा नहीं। ओपी ने कहा कि वह हाल ही में लैग / लैंग जोड़े पर गणना कर रहा होगा - आपके उत्तर पूर्व में बताएंगे कि
यारिन

4
@ यारिन यह एक लोकप्रिय सवाल है, जहां कुछ (या बहुत से) लोगों को सिर्फ अपनी जरूरतों के अनुसार निर्देशांक को कैसे संग्रहीत करना है, इस पर एक उत्तर की आवश्यकता होती है (उनमें से एक बहुत कुछ बस Google मानचित्र का उपयोग कर सकता है)। आपके डाउनवोट से पता चलता है कि यह उत्तर उनकी मदद नहीं कर सकता है ... निर्देशांक को एक स्ट्रिंग में संग्रहीत करके वे वास्तव में मूल मूल्यों को जानेंगे जो उन्हें प्रदान किए गए थे (उदाहरण के लिए: Google द्वारा) जो बाद में उनकी मदद करने का फैसला करेंगे यदि वे उन्हें विकसित करने का निर्णय लेते हैं खुद एप्लिकेशन और उन पर गणना करते हैं। उस समय, उनके पास अभी भी मूल कच्चा डेटा होगा क्योंकि उन्होंने इसे रूपांतरण के साथ गड़बड़ नहीं किया था।
आर्मफूट

4

आप आवेदन के आधार पर, मैं FLOAT (9,6) का उपयोग करने का सुझाव देता हूं

स्थानिक कुंजियाँ आपको अधिक सुविधाएँ प्रदान करेंगी, लेकिन उत्पादन बेंचमार्क के अनुसार स्थानिक कुंजियों की तुलना में फ़्लोट्स बहुत तेज़ हैं। (0,01 वीएस 0,001 एवीजी में)


1
क्या आप कृपया अपना परीक्षा परिणाम यहां विवरण के साथ प्रदान कर सकते हैं?
NameNotFoundException

4

MySQL सभी फ्लोट्स के लिए डबल का उपयोग करता है ... इसलिए टाइप डबल का उपयोग करें। फ्लोट का उपयोग करने से अधिकांश स्थितियों में अप्रत्याशित गोल मूल्यों को बढ़ावा मिलेगा


1
MySQL संचालन करता हैDOUBLE । MySQL आपको 4-बाइट या 8-बाइट के रूप में डेटा स्टोर करने देता है । तो, एक स्तंभ में एक अभिव्यक्ति को संग्रहीत करते समय परिशुद्धता का नुकसान होने की संभावना है । FLOATDOUBLEFLOAT
रिक जेम्स

4

हालांकि यह सभी परिचालनों के लिए इष्टतम नहीं है, यदि आप केवल एक प्रक्षेपण (जैसे मर्केटर, जैसे Google मैप्स और कई अन्य फिसलन मानचित्र चौखटों की अपेक्षा करते हैं) के साथ मैप टाइलें बना रहे हैं या बड़ी संख्या में मार्कर (डॉट्स) के साथ काम कर रहे हैं, तो मैंने पाया है कि मुझे क्या मिला है मैं "वास्ट कोआर्डिनेट सिस्टम" कहता हूं वास्तव में, वास्तव में आसान है। मूल रूप से, आप x और y पिक्सेल निर्देशांक को किसी तरह से ज़ूम-इन-इन स्टोर करते हैं - मैं ज़ूम स्तर 23 का उपयोग करता हूं। इसके कई लाभ हैं:

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

मैंने हाल के ब्लॉग पोस्ट में इस सब के बारे में बात की: http://blog.webfoot.com/2013/03/12/optimizing-map-tile-generation/


4

मैं कुछ उत्तरों / टिप्पणियों से अत्यधिक आश्चर्यचकित हूं।

क्यों पृथ्वी पर कोई भी स्वेच्छा से "पूर्व-कमी" को सटीक रूप से तैयार करने के लिए तैयार होगा, और फिर बाद में खराब संख्याओं पर गणना करने के लिए? अंततः बेवकूफ लगता है।

यदि स्रोत में 64-बिट परिशुद्धता है, तो निश्चित रूप से यह उदाहरण के लिए पैमाने को स्वेच्छा से ठीक करने के लिए गूंगा होगा। 6 दशमलव, और परिशुद्धता को अधिकतम 9 महत्वपूर्ण खुदाई तक सीमित करता है (जो आमतौर पर प्रस्तावित दशमलव 9.6 प्रारूप के साथ होता है)।

स्वाभाविक रूप से, कोई डेटा उस सटीकता के साथ संग्रहीत करता है जो स्रोत सामग्री है। परिशुद्धता घटने का एकमात्र कारण सीमित भंडारण स्थान होगा।

  • मूल सटीकता के साथ स्रोत के आंकड़े स्टोर करें
  • सटीक गणना में स्रोत से गणना किए गए स्टोर आंकड़े होते हैं (जैसे। यदि कोड कोड डबल्स का उपयोग करता है, तो परिणामों को डबल्स के रूप में संग्रहीत करें)

दशमलव 9.6 प्रारूप एक स्नैप-इन-ग्रिड घटनाओं का कारण बनता है। यह बहुत अंतिम चरण होना चाहिए, अगर ऐसा होना ही है।

मैं संचित त्रुटियों को अपने घोंसले में आमंत्रित नहीं करूंगा।


2
क्योंकि अधिकांश GPS उपकरण और एप्लिकेशन केवल 6 दशमलव स्थानों के लिए सटीक हैं। व्यर्थ क्या उपकरण माप सकते हैं की तुलना में एक अधिक से अधिक परिशुद्धता के लिए डाटा स्टोर करने gis.stackexchange.com/questions/8650/...
Yarin

1
@ यारिन वास्तव में, लेकिन आप माप और जीपीएस के बारे में बात करते हैं, जो प्रश्न में वर्णित नहीं हैं। निश्चित रूप से अधिक सटीक आंकड़े मौजूद हैं। लेकिन जीपीएस पर विचार करने देता है; 64-बिट फ़्लोट्स का एक स्रोत डेटा सेट, जिसमें पहले से ही एक अशुद्धि है। 6 डेसीमल का अर्थ है निकटतम सीए 11 सेंटीमीटर के अक्षांश का तड़कना। इसलिए, अब केवल (6 डेसीमल के साथ) डेटा संग्रहीत करके, आप संभावित 22 सेमी की अशुद्धि के लिए खोलते हैं (यदि मूल रूप से 11 सेमी भी)। स्वैच्छिक रूप से, शायद उस पर 64-बिट गणना करने के लिए, शायद इससे पहले एक 3 बार भंडारण - अब 33 सेमी अशुद्धि खिड़की, + -16 सेमी। गूंगा लगता है, इमो।
Stormwind

@ रिक जेम्स मैं इसे 64-बिट के रूप में स्टोर करूँगा, अर्थात। .3333333333333333। हम बात करते हैं जियोडेटा, है ना? "1/3" शायद ही कभी प्रकृति में प्रकट होता है जहां चीजें सामान्य रूप से मापा जाता है, एक उचित परिशुद्धता के साथ।
स्टॉर्मविंड

4

टी एल; डॉ

अगर आप NASA / मिलिट्री में काम नहीं कर रहे हैं और एयरक्राफ्ट नेवी सिस्टम नहीं बना रहे हैं तो FLOAT (8,5) का उपयोग करें।


अपने प्रश्न का पूरी तरह से उत्तर देने के लिए, आपको कई बातों पर विचार करना होगा:

स्वरूप

  • डिग्री मिनट सेकंड : 40 ° 26 ″ 46 ° एन 79 ° 58 ″ 56। डब्ल्यू
  • डिग्री दशमलव मिनट : 40 ° 26.767 minutes N 79 ° 58.933 ° W
  • दशमलव डिग्री 1 : 40.446 ° N 79.982 ° W
  • दशमलव 2 डिग्री : -32.60875, 21.27812
  • कुछ अन्य घर-निर्मित प्रारूप? कोई भी आपको अपने स्वयं के घर-केंद्रित निर्देशांक प्रणाली बनाने से मना करता है और इसे अपने घर से शीर्षक और दूरी के रूप में संग्रहीत करता है। यह आपके द्वारा काम कर रहे कुछ विशिष्ट समस्याओं के लिए समझ में आ सकता है।

तो उत्तर का पहला भाग होगा - आप अपने रूपांतरणों के उस प्रारूप में निर्देशांक को संग्रहीत कर सकते हैं जिसका उपयोग निरंतर रूपांतरणों को आगे और पीछे करने के लिए करता है और सरल एसक्यूएल प्रश्न बनाता है।

संभवतः आप अपना डेटा प्रदर्शित करने के लिए Google मानचित्र या OSM का उपयोग करते हैं, और GMaps "दशमलव डिग्री 2" प्रारूप का उपयोग कर रहे हैं। इसलिए एक ही प्रारूप में निर्देशांक स्टोर करना आसान होगा।

शुद्धता

फिर, आप अपनी आवश्यकता के अनुसार सटीक परिभाषित करना चाहेंगे। बेशक आप "-32.608697550570334,21.278081997935146" जैसे निर्देशांक स्टोर कर सकते हैं, लेकिन क्या आपने कभी पॉइंट पर नेविगेशन करते समय मिलीमीटर की परवाह की है? यदि आप नासा में काम नहीं कर रहे हैं और उपग्रह या रॉकेट या विमानों के प्रक्षेपवक्र नहीं कर रहे हैं, तो आपको कई मीटर सटीकता के साथ ठीक होना चाहिए।

आमतौर पर इस्तेमाल किया जाने वाला प्रारूप डॉट्स के बाद 5 अंक है जो आपको 50 सेमी सटीकता देता है।

उदाहरण : X, 21.278081 8 और X, 21.278081 9 के बीच 1cm की दूरी है । तो डॉट के बाद 7 अंक आपको 1/2 सेमी की सटीकता देते हैं और डॉट के बाद के 5 अंक आपको 1/2 मीटर की सटीकता देंगे (क्योंकि अलग-अलग बिंदुओं के बीच न्यूनतम दूरी 1 मी है, इसलिए गोलाई की त्रुटि इसके आधे से अधिक नहीं हो सकती है)। अधिकांश नागरिक उद्देश्यों के लिए यह पर्याप्त होना चाहिए।

डिग्री दशमलव मिनट प्रारूप (40 ° 26.767 ° N 79 ° 58.933 gives W) आपको डॉट के बाद 5 अंकों के समान सटीकता प्रदान करता है

अंतरिक्ष-कुशल भंडारण

यदि आपने दशमलव प्रारूप का चयन किया है, तो आपका समन्वय एक जोड़ी है (-32.60875, 21.27812)। स्पष्ट रूप से, 2 x (साइन के लिए 1 बिट, डिग्री के लिए 2 अंक और घातांक के लिए 5 अंक) पर्याप्त होंगे।

इसलिए यहाँ मैं Alix Axel को टिप्पणियों से यह कहते हुए समर्थन देना चाहूंगा कि Google का सुझाव इसे FLOAT (10,6) में संग्रहीत करने का है, वास्तव में अतिरिक्त है, क्योंकि आपको मुख्य भाग के लिए 4 अंकों की आवश्यकता नहीं है (क्योंकि चिन्ह अलग है और अक्षांश सीमित है 90 तक और देशांतर 180 तक सीमित है)। आप आसानी से 1 / 2m परिशुद्धता के लिए FLOAT (8,5) या 50 / 2cm परिशुद्धता के लिए FLOAT (9,6) का उपयोग कर सकते हैं। या आप अलग-अलग प्रकारों में लैट और लॉन्ग भी स्टोर कर सकते हैं, क्योंकि फ्लिप के लिए FLOAT (7,5) पर्याप्त है। MySQL फ्लोट प्रकार संदर्भ देखें । उनमें से कोई भी सामान्य FLOAT जैसा होगा और वैसे भी 4 बाइट्स के बराबर होगा।

आमतौर पर अंतरिक्ष आजकल कोई समस्या नहीं है, लेकिन अगर आप किसी कारण से स्टोरेज को वास्तव में ऑप्टिमाइज़ करना चाहते हैं (डिस्क्लेमर: प्री-ऑप्टिमाइज़ेशन नहीं करते हैं), तो आप लेट सेक कर सकते हैं (91 000 मान से अधिक नहीं + साइन) + लंबा (नहीं 21 बिट्स के लिए 181 000 से अधिक मान + संकेत) जो 2xFLOAT (8 बाइट्स == 64 बिट्स) से काफी कम है


3

PostGIS में स्थानिक कार्य MySQL स्थानिक कार्यों की तुलना में बहुत अधिक कार्यात्मक (यानी BBOX संचालन के लिए विवश नहीं) हैं। इसे देखें: लिंक टेक्स्ट


1
  1. अक्षांश -90 से +90 (डिग्री) तक है, इसलिए DECIMAL (10, 8) उसके लिए ठीक है

  2. longitudes -180 से +180 (डिग्री) तक होते हैं, इसलिए आपको DECIMAL (11, 8) की आवश्यकता होती है।

नोट: पहली संख्या संग्रहीत अंकों की कुल संख्या है, और दूसरी दशमलव बिंदु के बाद की संख्या है।

संक्षेप में: lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL



-2

लाट लंबी गणनाओं में सटीकता की आवश्यकता होती है, इसलिए कुछ प्रकार के दशमलव प्रकारों का उपयोग करें और गणित की गणना करने के लिए आपके द्वारा संग्रहित संख्या की तुलना में कम से कम 2 उच्च सटीकता करें। मुझे अपने sql डेटाटिप्स के बारे में पता नहीं है, लेकिन SQL सर्वर में लोग अक्सर दशमलव के बजाय फ्लोट या रियल का उपयोग करते हैं और परेशानी में पड़ जाते हैं क्योंकि ये अनुमानित संख्याएँ वास्तविक नहीं हैं। तो बस यह सुनिश्चित करें कि आपके द्वारा उपयोग किया जाने वाला डेटा प्रकार एक सच्चा दशमलव प्रकार है न कि एक अस्थायी दशमलव प्रकार और आप ठीक होना चाहिए।


1
फ्लोट और दशमलव दोनों प्रकारों का अपना स्थान है। अंगूठे के एक नियम के रूप में, फ्लोट्स का मतलब है भौतिक चर, और दशमलव गणना योग्य संस्थाओं (ज्यादातर पैसे) के लिए हैं। मैं यह नहीं देखता कि आप lat / long के लिए दशमलव क्यों पसंद करेंगे
Javier

1
मुझे भी लगता है कि लेट / लॉन्ग के लिए फ्लोट ठीक है। कम से कम SQL सर्वर (4bytes, 7 अंक) पर।
ड्रैगोलजब čurčić

फ्लोट सटीक नहीं है यह अनुमान लगाया गया है, एक लंबे समय में सटीकता की झील घातक है! यह आपको ग्लोब पर एक बिल्कुल अलग जगह की ओर इशारा कर सकता है।
HLGEM

2
फ्लोट डेटाटिप्स की अधिकतम त्रुटि काफी कम है कि यह एक समस्या नहीं होनी चाहिए। मेरा मतलब है, आपको वैसे भी दोनों कार्यान्वयनों के साथ त्रुटि गुणा / संचय के बारे में पता होना चाहिए।
स्पाइडी

@HLGEM - कुछ दशमलव स्थानों पर गोलाई आपको ग्लोब पर एक अलग स्थान पर भी दिखाती है । सवाल यह है कि क्या अलग जगह इतनी करीब है कि कोई फर्क नहीं पड़ता।
रिक जेम्स

-3

A FLOATको आपको अपनी आवश्यक सभी सटीकता देनी चाहिए, और तुलनात्मक कार्यों के लिए बेहतर होना चाहिए कि प्रत्येक समन्वय को एक स्ट्रिंग या पसंद के रूप में संग्रहीत किया जाए।

यदि आपका MySQL संस्करण 5.0.3 से पहले का है, तो आपको कुछ फ़्लोटिंग पॉइंट तुलना त्रुटियों के बावजूद ध्यान रखने की आवश्यकता हो सकती है ।

MySQL 5.0.3 से पहले, DECIMAL कॉलम सटीक सटीकता के साथ मूल्यों को संग्रहीत करता है क्योंकि उन्हें स्ट्रिंग्स के रूप में दर्शाया जाता है, लेकिन DECIMAL मानों की गणना फ़्लोटिंग-पॉइंट ऑपरेशन का उपयोग करके की जाती है। 5.0.3 तक, MySQL 64 दशमलव अंकों की सटीकता के साथ DECIMAL संचालन करता है, जो कि DECIMAL स्तंभों के लिए सबसे आम अशुद्धि समस्याओं को हल करना चाहिए।


2
आपको आसान गणित के लिए एक वास्तविक अक्षांश / देशांतर समन्वित डेटाटाइप की आवश्यकता है। दुकानों से "चयन करें" के बराबर की सुविधा की कल्पना करें जहां दूरी (स्टोर.लोकेशन, मायलोकेशन) <5 मील "
कर्क स्ट्रूसर

1
पहले स्थानिक एक्सटेंशन के बारे में नहीं सुना था, यह बहुत सुविधाजनक ध्वनि करता है, पहले एक विरासत वाले ऐप पर काम करता है जो काफी कुछ जियो से संबंधित गणना करता है, इसे अवश्य देखें।
कॉनरॉय

@ConroyP - नहीं। यह उद्धरण इशारा कर रहा है कि DECIMAL(5.0.3 से पहले) अस्थायी कार्यान्वयन के उपयोग के कारण कुछ त्रुटियां थीं।
रिक जेम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.