सी # में अक्षांश / देशांतर मान के लिए डबल या दशमलव


96

C # में जियोसिनेस्टल डेटा संग्रहीत करते समय उपयोग करने के लिए सबसे अच्छा डेटा प्रकार क्या है? मैं इसके सटीक होने के लिए दशमलव का उपयोग करूँगा, लेकिन दशमलव फ़्लोटिंग पॉइंट नंबरों पर संचालन धीमा है तो बाइनरी फ़्लोटिंग पॉइंट नंबर (डबल)।

मैंने पढ़ा है कि ज्यादातर समय आपको अक्षांश या देशांतर के लिए किसी सटीक 6 या 7 अंक की आवश्यकता नहीं होगी। क्या युगल की अक्षमता तब भी मायने रखती है या इसे अनदेखा किया जा सकता है?


6
मैं विपरीत सवाल पूछूंगा: क्या प्रदर्शन के अंतर पर भी फर्क पड़ता है या इसे अनदेखा किया जा सकता है?
हेनजी

1
डेटाबेस में आपको देशांतर और अक्षांश स्टोर करने के लिए "sql स्थानिक डेटा प्रकार" का उपयोग करना चाहिए
azhar_SE_nextbridge

8
ध्यान दें कि .NET BCL अपने जियो कॉर्डिनेट क्लास में डबल्स का उपयोग करता है , जो एक मजबूत संकेत है कि सटीक पर्याप्त हो सकता है।
हेनजी

1
NodaTime का TzdbZoneLocation डबल का भी उपयोग करता है।
रिक डेविन

4
1) मैं तय बिंदु पर विचार करेंगे। 2) चूंकि आपको अक्सर भू निर्देशांक पर त्रिकोणमितीय ऑपरेशन करने की आवश्यकता होती है, और जो केवल के लिए लागू होते हैं double, doubleवे सबसे उपयुक्त हो सकते हैं।
कोडइन्चोस

जवाबों:


120

जाओ double, कई कारण हैं।

  • त्रिकोणमितीय कार्य केवल दोहरे के लिए उपलब्ध हैं
  • डबल (100 नैनोमीटर की रेंज) की शुद्धता कुछ भी परे है जो आपको कभी भी लाट / लोन मूल्यों के लिए आवश्यक होगी
  • जियो कॉर्डिनेट क्लास और थर्ड-पार्टी मॉड्यूल (जैसे डॉटस्पैटियल ) भी निर्देशांक के लिए डबल का उपयोग करते हैं

75

एक डबल परिशुद्धता के 15 दशमलव अंक तक है। तो, मान लें कि उनमें से तीन अंक अक्षांश / लंबे मान (अधिकतम 180 डिग्री) के लिए दशमलव बिंदु के बाईं ओर होने वाले हैं। यह दाईं ओर परिशुद्धता के 12 अंक छोड़ता है। चूंकि लेट / लॉन्ग की एक डिग्री ~ 111 किमी है, उन 12 अंकों में से 5 हमें मीटर को सटीक रूप देंगे। 3 और अंक हमें मिलीमीटर को सटीक रूप देंगे। शेष 4 अंक हमें लगभग 100 नैनोमीटर तक सटीक रूप से मिलेंगे। चूंकि डबल प्रदर्शन और स्मृति के दृष्टिकोण से जीत जाएगा, इसलिए मुझे दशमलव का उपयोग करने पर विचार करने का कोई कारण नहीं दिखता है।


2
एक विस्तृत और सटीक स्पष्टीकरण के लिए प्लस एक।
नजीब

4

मुझे इस सवाल का सामना काफी समय पहले करना पड़ा जब मैंने स्पेसियल प्रोग्रामिंग के साथ शुरुआत की। मैंने कुछ समय पहले एक किताब पढ़ी थी जो मुझे इस ओर ले गई।

//sql server has a really cool dll that deals with spacial data such like
//geography points and so on. 
//add this namespace
Using Microsoft.SqlServer.Types;

//SqlGeography.Point(dblLat, dblLon, srid)

var lat_lon_point = Microsoft.SqlServer.Types.SqlGeography.Point(lat, lon, 4326);

स्थानिक डेटा के साथ आपके एप्लिकेशन में काम करते समय यह सबसे अच्छा तरीका है। तब डेटा को बचाने के लिए sql में इसका उपयोग करें

CREATE TABLE myGeoTable
{
LatLonPoint GEOMETRY 
}

इसके अलावा, यदि आप कुछ और का उपयोग कर रहे हैं जो isnt sql सिर्फ बिंदु को हेक्साडेसिमल में परिवर्तित करता है और इसे संग्रहीत करता है। मैं लंबे समय के बाद स्पेसियल का उपयोग करके जानता हूं कि यह सबसे सुरक्षित है।


मुझे LatLonPoint को खोजने में परेशानी हो रही है, आपको अपने c # प्रोजेक्ट में किन संदर्भों या पैकेजों को शामिल करना है या 'usings' को क्या करना है? (मान तालिका बनाएँ पहचान मॉडल / सी # कोड के लिए था, क्योंकि उस प्रकार का एसएसएमएस में मूल्यांकन नहीं होता है)। आपका अग्रिम में ही बहुत धन्यवाद!
क्रिस

0

दोहरा

उत्तरों को मिलाकर यह है कि कैसे SqlGeography लाइब्रेरी में Microsoft इसका प्रतिनिधित्व करता है

[प्राप्त करें: Microsoft.SqlServer.Server.SqlMethod (IsDeterministic = true, IsPrecise = true)] सार्वजनिक System.Data.SqlTypes.SqlDouble Lat {प्राप्त करें; } गुण मान SqlDouble एक SqlDouble मान जो अक्षांश निर्दिष्ट करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.