इस बात को ध्यान में रखते हुए कि मैं हाल ही में लंबी / लंबी जोड़ी पर गणना कर रहा हूँ, डेटासाइप एक MySQL डेटाबेस के साथ उपयोग के लिए सबसे उपयुक्त है?
इस बात को ध्यान में रखते हुए कि मैं हाल ही में लंबी / लंबी जोड़ी पर गणना कर रहा हूँ, डेटासाइप एक MySQL डेटाबेस के साथ उपयोग के लिए सबसे उपयुक्त है?
जवाबों:
GIS के साथ MySQL के स्थानिक एक्सटेंशन का उपयोग करें ।
Google, Google मैप्स के साथ "स्टोर लोकेटर" एप्लिकेशन के उदाहरण के लिए PHP / MySQL समाधान समाप्त करने के लिए एक शुरुआत प्रदान करता है। इस उदाहरण में, वे "10,6" की लंबाई के साथ "फ्लोट" के रूप में लाट / लैंग मूल्यों को संग्रहीत करते हैं।
FLOAT(10,6)
समन्वय के पूर्णांक भाग के लिए 4 अंक छोड़ता है। और नहीं, साइन की गिनती नहीं है - जो (अन) हस्ताक्षरित विशेषता से आता है।
Double
Laravel के लिए डेटाटाइप का उपयोग करना
मूल रूप से यह आपके स्थानों के लिए आवश्यक सटीकता पर निर्भर करता है। 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
उम्मीद है की यह मदद करेगा।
MySQL के स्थानिक एक्सटेंशन सबसे अच्छा विकल्प हैं क्योंकि आपके पास अपने निपटान में स्थानिक ऑपरेटरों और सूचकांकों की पूरी सूची है। एक स्थानिक सूचकांक आपको बहुत तेज़ी से दूरी-आधारित गणना करने की अनुमति देगा। कृपया ध्यान रखें कि 6.0 के रूप में, स्थानिक विस्तार अभी भी अधूरा है। मैं MySQL स्थानिक नीचे नहीं डाल रहा हूँ, इससे पहले कि आप इस पर बहुत दूर जाने से पहले आप नुकसान के बारे में जानते हैं।
यदि आप बिंदुओं और केवल DISTANCE फ़ंक्शन के साथ सख्ती से काम कर रहे हैं, तो यह ठीक है। यदि आपको पॉलीगॉन, लाइन्स या बफर-पॉइंट्स के साथ कोई गणना करने की आवश्यकता है, तो स्थानिक ऑपरेटर सटीक परिणाम प्रदान नहीं करते हैं जब तक कि आप "संबंधित" ऑपरेटर का उपयोग नहीं करते हैं। 21.5.6 के शीर्ष पर चेतावनी देखें । एमबीआर का उपयोग करते हुए, भीतर या चौराहों जैसे संबंध सटीक ज्यामिति के आकार का नहीं होते हैं (जैसे कि एक इलिप को आयत की तरह माना जाता है)।
इसके अलावा, MySQL स्थानिक में दूरियां आपकी पहली ज्यामिति के समान इकाइयों में हैं। इसका मतलब है कि यदि आप दशमलव दशमलव का उपयोग कर रहे हैं, तो आपकी दूरी माप दशमलव में है। इससे सटीक परिणाम प्राप्त करना बहुत मुश्किल हो जाएगा क्योंकि आप भूमध्य रेखा से फ़ुरथुर प्राप्त करते हैं।
जब मैंने ARINC424 से निर्मित एक नेविगेशन डेटाबेस के लिए ऐसा किया था तो मैंने काफी मात्रा में परीक्षण किया था और कोड को देख रहा था, मैंने एक DECIMAL (18,12) (वास्तव में एक NUMERIC (18,12) का उपयोग किया क्योंकि यह अग्निरोधी था)।
फ़्लोट्स और डबल्स उतने सटीक नहीं हैं और इसके परिणामस्वरूप राउंडिंग त्रुटियां हो सकती हैं जो बहुत बुरी बात हो सकती है। मुझे याद नहीं है कि क्या मुझे कोई वास्तविक डेटा मिला है जिसमें समस्याएं थीं - लेकिन मैं काफी निश्चित हूं कि फ्लोट या एक डबल में सटीक रूप से स्टोर करने में असमर्थता समस्या पैदा कर सकती है
मुद्दा यह है कि डिग्री या रेडियन का उपयोग करते समय हम मूल्यों की सीमा को जानते हैं - और आंशिक भाग को सबसे अधिक अंकों की आवश्यकता होती है।
MySQL स्थानिक एक्सटेंशन क्योंकि वे का पालन एक अच्छा विकल्प हैं opengis ज्यामिति मॉडल । मैंने उनका उपयोग नहीं किया क्योंकि मुझे अपने डेटाबेस को पोर्टेबल रखने की आवश्यकता थी।
a*b
समान नहीं था b*a
(कुछ मूल्यों के लिए)। कुछ हद तक इस तरह के कई उदाहरण थे: 2+2 = 3.9999
। मानक ने बहुत गंदगी को साफ किया, और हार्डवेयर और सॉफ्टवेयर के लगभग हर टुकड़े द्वारा 'तेजी से' अपनाया गया था। इसलिए, यह चर्चा केवल 2008 के बाद से ही नहीं, बल्कि एक तिहाई सदी के लिए मान्य है।
आपके द्वारा आवश्यक परिशुद्धता पर निर्भर करता है।
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
)।CREATE TABLE geom (g GEOMETRY NOT NULL, SPATIAL INDEX(g)) ENGINE=MyISAM;
और एसडीटी सीमाओं के बारे में चेतावनी, जैसा कि जेम्स ने उल्लेख किया है , शायद आपका जवाब अन्य लोगों की मदद करने में भी अधिक संक्षिप्त और सटीक होगा। ..
इस विकी लेख के आधार पर http://en.wikipedia.org/wiki/Decimal_degrees#Accuracy MySQL में उपयुक्त डेटा प्रकार अलग-अलग क्षेत्रों में देशांतर और अक्षांश को संग्रहीत करने के लिए दशमलव (9,6) है।
का प्रयोग करें DECIMAL(8,6)
अक्षांश (90 -90 अंश) के लिए और DECIMAL(9,6)
देशांतर (180 -180 अंश) के लिए। अधिकांश अनुप्रयोगों के लिए 6 दशमलव स्थान ठीक है। नकारात्मक मूल्यों की अनुमति के लिए दोनों को "हस्ताक्षरित" किया जाना चाहिए।
DECIMAL
प्रकार वित्तीय गणना के लिए अभिप्रेत है जहाँ कोई floor/ceil
स्वीकार नहीं किया जाता है। सादे FLOAT
काफी बेहतर प्रदर्शन करते हैं DECIMAL
।
Google मानचित्र के अनुसार, दूर जाने की कोई आवश्यकता नहीं है, सबसे अच्छा है FLOAT (10,6) लेट और लैंग के लिए।
lat FLOAT( 10, 6 ) NOT NULL,
lng FLOAT( 10, 6 ) NOT NULL
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- के
हम डबल्स के साथ राउंड ऑफ एरर से बचने के लिए NUMBERS के रूप में अपने ऑरेकल डेटाबेस में अक्षांश / देशांतर X 1,000,000 को स्टोर करते हैं।
यह देखते हुए कि 6 वें दशमलव स्थान के लिए अक्षांश / देशांतर 10 सेमी की सटीकता थी जिसकी हमें आवश्यकता थी। कई अन्य डेटाबेस भी 6 वें दशमलव स्थान पर lat / long स्टोर करते हैं।
पूरी तरह से अलग और सरल परिप्रेक्ष्य में:
VARCHAR
) के रूप में संग्रहीत करते हैं , जैसे: " -0000.0000001, -0000.000000000000001 " (35 लंबाई और यदि किसी संख्या में 7 से अधिक दशमलव अंक हैं तो गोल हो जाता है);google.maps.geometry.poly.containsLocation(latLng, bermudaTrianglePolygon))
इस तरह से आपको अनुक्रमण संख्याओं और डेटा प्रकारों से जुड़ी अन्य सभी समस्याओं के बारे में चिंता करने की आवश्यकता नहीं है जो आपके निर्देशांक को खराब कर सकती हैं।
आप आवेदन के आधार पर, मैं FLOAT (9,6) का उपयोग करने का सुझाव देता हूं
स्थानिक कुंजियाँ आपको अधिक सुविधाएँ प्रदान करेंगी, लेकिन उत्पादन बेंचमार्क के अनुसार स्थानिक कुंजियों की तुलना में फ़्लोट्स बहुत तेज़ हैं। (0,01 वीएस 0,001 एवीजी में)
MySQL सभी फ्लोट्स के लिए डबल का उपयोग करता है ... इसलिए टाइप डबल का उपयोग करें। फ्लोट का उपयोग करने से अधिकांश स्थितियों में अप्रत्याशित गोल मूल्यों को बढ़ावा मिलेगा
DOUBLE
। MySQL आपको 4-बाइट या 8-बाइट के रूप में डेटा स्टोर करने देता है । तो, एक स्तंभ में एक अभिव्यक्ति को संग्रहीत करते समय परिशुद्धता का नुकसान होने की संभावना है । FLOAT
DOUBLE
FLOAT
हालांकि यह सभी परिचालनों के लिए इष्टतम नहीं है, यदि आप केवल एक प्रक्षेपण (जैसे मर्केटर, जैसे Google मैप्स और कई अन्य फिसलन मानचित्र चौखटों की अपेक्षा करते हैं) के साथ मैप टाइलें बना रहे हैं या बड़ी संख्या में मार्कर (डॉट्स) के साथ काम कर रहे हैं, तो मैंने पाया है कि मुझे क्या मिला है मैं "वास्ट कोआर्डिनेट सिस्टम" कहता हूं वास्तव में, वास्तव में आसान है। मूल रूप से, आप x और y पिक्सेल निर्देशांक को किसी तरह से ज़ूम-इन-इन स्टोर करते हैं - मैं ज़ूम स्तर 23 का उपयोग करता हूं। इसके कई लाभ हैं:
मैंने हाल के ब्लॉग पोस्ट में इस सब के बारे में बात की: http://blog.webfoot.com/2013/03/12/optimizing-map-tile-generation/
मैं कुछ उत्तरों / टिप्पणियों से अत्यधिक आश्चर्यचकित हूं।
क्यों पृथ्वी पर कोई भी स्वेच्छा से "पूर्व-कमी" को सटीक रूप से तैयार करने के लिए तैयार होगा, और फिर बाद में खराब संख्याओं पर गणना करने के लिए? अंततः बेवकूफ लगता है।
यदि स्रोत में 64-बिट परिशुद्धता है, तो निश्चित रूप से यह उदाहरण के लिए पैमाने को स्वेच्छा से ठीक करने के लिए गूंगा होगा। 6 दशमलव, और परिशुद्धता को अधिकतम 9 महत्वपूर्ण खुदाई तक सीमित करता है (जो आमतौर पर प्रस्तावित दशमलव 9.6 प्रारूप के साथ होता है)।
स्वाभाविक रूप से, कोई डेटा उस सटीकता के साथ संग्रहीत करता है जो स्रोत सामग्री है। परिशुद्धता घटने का एकमात्र कारण सीमित भंडारण स्थान होगा।
दशमलव 9.6 प्रारूप एक स्नैप-इन-ग्रिड घटनाओं का कारण बनता है। यह बहुत अंतिम चरण होना चाहिए, अगर ऐसा होना ही है।
मैं संचित त्रुटियों को अपने घोंसले में आमंत्रित नहीं करूंगा।
टी एल; डॉ
अगर आप NASA / मिलिट्री में काम नहीं कर रहे हैं और एयरक्राफ्ट नेवी सिस्टम नहीं बना रहे हैं तो FLOAT (8,5) का उपयोग करें।
अपने प्रश्न का पूरी तरह से उत्तर देने के लिए, आपको कई बातों पर विचार करना होगा:
स्वरूप
तो उत्तर का पहला भाग होगा - आप अपने रूपांतरणों के उस प्रारूप में निर्देशांक को संग्रहीत कर सकते हैं जिसका उपयोग निरंतर रूपांतरणों को आगे और पीछे करने के लिए करता है और सरल एसक्यूएल प्रश्न बनाता है।
संभवतः आप अपना डेटा प्रदर्शित करने के लिए 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 बिट्स) से काफी कम है
PostGIS में स्थानिक कार्य MySQL स्थानिक कार्यों की तुलना में बहुत अधिक कार्यात्मक (यानी BBOX संचालन के लिए विवश नहीं) हैं। इसे देखें: लिंक टेक्स्ट
अक्षांश -90 से +90 (डिग्री) तक है, इसलिए DECIMAL (10, 8) उसके लिए ठीक है
longitudes -180 से +180 (डिग्री) तक होते हैं, इसलिए आपको DECIMAL (11, 8) की आवश्यकता होती है।
नोट: पहली संख्या संग्रहीत अंकों की कुल संख्या है, और दूसरी दशमलव बिंदु के बाद की संख्या है।
संक्षेप में: lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL
मेरा सुझाव है कि आप SQL सर्वर के लिए फ्लोट डेटाटाइप का उपयोग करें।
लाट लंबी गणनाओं में सटीकता की आवश्यकता होती है, इसलिए कुछ प्रकार के दशमलव प्रकारों का उपयोग करें और गणित की गणना करने के लिए आपके द्वारा संग्रहित संख्या की तुलना में कम से कम 2 उच्च सटीकता करें। मुझे अपने sql डेटाटिप्स के बारे में पता नहीं है, लेकिन SQL सर्वर में लोग अक्सर दशमलव के बजाय फ्लोट या रियल का उपयोग करते हैं और परेशानी में पड़ जाते हैं क्योंकि ये अनुमानित संख्याएँ वास्तविक नहीं हैं। तो बस यह सुनिश्चित करें कि आपके द्वारा उपयोग किया जाने वाला डेटा प्रकार एक सच्चा दशमलव प्रकार है न कि एक अस्थायी दशमलव प्रकार और आप ठीक होना चाहिए।
A FLOAT
को आपको अपनी आवश्यक सभी सटीकता देनी चाहिए, और तुलनात्मक कार्यों के लिए बेहतर होना चाहिए कि प्रत्येक समन्वय को एक स्ट्रिंग या पसंद के रूप में संग्रहीत किया जाए।
यदि आपका MySQL संस्करण 5.0.3 से पहले का है, तो आपको कुछ फ़्लोटिंग पॉइंट तुलना त्रुटियों के बावजूद ध्यान रखने की आवश्यकता हो सकती है ।
MySQL 5.0.3 से पहले, DECIMAL कॉलम सटीक सटीकता के साथ मूल्यों को संग्रहीत करता है क्योंकि उन्हें स्ट्रिंग्स के रूप में दर्शाया जाता है, लेकिन DECIMAL मानों की गणना फ़्लोटिंग-पॉइंट ऑपरेशन का उपयोग करके की जाती है। 5.0.3 तक, MySQL 64 दशमलव अंकों की सटीकता के साथ DECIMAL संचालन करता है, जो कि DECIMAL स्तंभों के लिए सबसे आम अशुद्धि समस्याओं को हल करना चाहिए।
DECIMAL
(5.0.3 से पहले) अस्थायी कार्यान्वयन के उपयोग के कारण कुछ त्रुटियां थीं।