लैट / लोन और किमी दूरी के साथ काम करने के लिए सरल गणना?


119

क्या एक साधारण गणना है जो मैं कर सकता हूं जो किमी को एक मूल्य में बदल देगा जिसे मैं खोजों के लिए एक बाउंडिंग बॉक्स की गणना करने के लिए एक लाट या लोन फ्लोट में जोड़ सकता हूं? यह पूरी तरह से सटीक होने की आवश्यकता नहीं है।

उदाहरण के लिए: यदि मुझे लंदन, इंग्लैंड (51.5001524, -0.1262362) के लिए एक लेट / लोन दिया गया था और मैं इस बात की गणना करना चाहता था कि उस बिंदु से लाट 25 किमी पूर्व / पश्चिम में क्या होगा, और लोन उस से 25 किमी उत्तर या दक्षिण में क्या होगा? बिंदु, ऊपर दिए गए मानों को जोड़ने के लिए मुझे 25 किमी को दशमलव में बदलने के लिए क्या करना होगा?

मैं एक सामान्य नियम के अंगूठे की तलाश कर रहा हूं, अर्थात: 1 किमी == +/- 0.XXX

संपादित करें:

"Lat lon" की मेरी मूल खोज इस परिणाम को नहीं लौटाती:

किसी दिए गए lat / lng स्थान के लिए बाउंडिंग बॉक्स की गणना कैसे करें?

स्वीकृत उत्तर मेरी आवश्यकताओं के लिए पर्याप्त लगता है।


जवाबों:


220

अनुमानित रूपांतरण हैं:

  • अक्षांश: 1 डिग्री = 110.574 किमी
  • देशांतर: 1 डिग्री = 111.320 * कॉस (अक्षांश) किमी

यह पृथ्वी के ध्रुवीय चपटेपन के लिए पूरी तरह से सही नहीं है - इसके लिए आप शायद WGS84 संदर्भ दीर्घवृत्त (जीपीएस के लिए उपयोग किया जाने वाला मॉडल) का उपयोग करके अधिक जटिल सूत्र चाहते हैं। लेकिन त्रुटि शायद आपके उद्देश्यों के लिए नगण्य है।

स्रोत: http://en.wikipedia.org/wiki/Lititude

सावधानी : ध्यान रखें कि अक्षांश निर्देशांक डिग्री में व्यक्त किए जाते हैं, जबकि cosअधिकांश (सभी?) भाषाओं में कार्य आम तौर पर रेडियन स्वीकार करते हैं, इसलिए रेडियन रूपांतरण के लिए डिग्री की आवश्यकता होती है।


क्या आप दूसरे फॉर्मूले में cos (देशांतर) का मतलब है?
ओडीस

1
आप इसके साथ कैसे आए? मुझे कुछ याद आ रहा है, क्या आप देशांतर गणना पर विस्तार से बता सकते हैं? Ty
ओडिस

5
@Odys: यदि आप दो बिंदुओं की तुलना कर रहे हैं जो देशांतर (उत्तर / दक्षिण) की एक ही रेखा पर स्थित हैं, तो वे एक महान वृत्त पर स्थित हैं और रूपांतरण कारक पृथ्वी की ध्रुवीय परिधि 360 डिग्री से विभाजित है। लेकिन यह पूर्व-पश्चिम मापों के लिए अलग है, क्योंकि (भूमध्य रेखा को छोड़कर) आप "महान सर्कल" के साथ माप नहीं रहे हैं, इसलिए किसी दिए गए अक्षांश पर "परिधि" छोटा है। और सुधार कारक अक्षांश का कोसाइन निकला।
जिम लुईस

17
मेरी व्याख्या: cos(0°) = 1=> इसलिए भूमध्य रेखा पर गणना करते समय कोई सुधार कारक लागू नहीं किया गया है। अनुदैर्ध्य वहाँ सबसे व्यापक हैं। cos(90°) = 0=> ध्रुवों पर अनुदैर्ध्य एक बिंदु में मिलते हैं। गणना करने के लिए कोई दूरी नहीं है।
जेनी ओ'रिली ने

4
@Stijn: Math.cos () पर कॉल करने से पहले आपको डिग्रियों से रेडियन में बदलना होगा।
जिम लुईस

5

यदि आप जावा, जावास्क्रिप्ट या पीएचपी का उपयोग कर रहे हैं, तो एक पुस्तकालय है जो इन गणनाओं को बिल्कुल ठीक करेगा, कुछ मनोरंजक जटिल (लेकिन अभी भी तेज) त्रिकोणमिति का उपयोग करते हुए:

http://www.jstott.me.uk/jcoord/


साइट में अभी लाइब्रेरी है।
मिडफील्ड

2
लिंक टूट गया है!
चैटजिच

PHP के लिए, आप इस कांटे का उपयोग कर सकते हैं: github.com/dvdoug/PHPCoord
dearsina


1

दिलचस्प है कि मैंने UTM निर्देशांक का उल्लेख नहीं देखा।

https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system

कम से कम यदि आप उसी क्षेत्र में किमी जोड़ना चाहते हैं, तो यह सीधा होना चाहिए (पायथन में: https://pypi.org/project/utm/ )

utm.from_latlon और utm.to_latlon


यूटीएम से लिंक के लिए धन्यवाद। चौंकाने वाला है कि यह कोई प्रलेखन है लगता है।
वेस्टवर्ल्ड

1

जिम लुईस को उनके शानदार उत्तर के लिए धन्यवाद और मैं स्विफ्ट में अपने कार्य द्वारा इस समाधान का वर्णन करना चाहूंगा:

func getRandomLocation(forLocation location: CLLocation, withOffsetKM offset: Double) -> CLLocation {
        let latDistance = (Double(arc4random()) / Double(UInt32.max)) * offset * 2.0 - offset
        let longDistanceMax = sqrt(offset * offset - latDistance * latDistance)
        let longDistance = (Double(arc4random()) / Double(UInt32.max)) * longDistanceMax * 2.0 - longDistanceMax

        let lat: CLLocationDegrees = location.coordinate.latitude + latDistance / 110.574
        let lng: CLLocationDegrees = location.coordinate.longitude + longDistance / (111.320 * cos(lat / .pi / 180))
        return CLLocation(latitude: lat, longitude: lng)
    }

निम्नलिखित सूत्रों का उपयोग करने के लिए दूरी बदलने के लिए इस समारोह में:

latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))

मुझे लगता है कि यह "lat * पीआई / 180" होना चाहिए
मैगामिग

1

क्यों न ठीक से तैयार किए गए भू-स्थानिक प्रश्नों का उपयोग करें ???

यहाँ STContains geospatial फ़ंक्शन पर SQL सर्वर संदर्भ पृष्ठ है:

https://docs.microsoft.com/en-us/sql/t-sql/spatial-geography/stcontains-geography-data-type?view=sql-server-ver15

या यदि आप बॉक्स और रेडियन रूपांतरण का उपयोग करने के लिए इंतजार नहीं करते हैं, तो आप उन बिंदुओं को खोजने के लिए हमेशा दूरी समारोह का उपयोग करते हैं जो आपको चाहिए:

DECLARE @CurrentLocation geography; 
SET @CurrentLocation  = geography::Point(12.822222, 80.222222, 4326)

SELECT * , Round (GeoLocation.STDistance(@CurrentLocation ),0) AS Distance FROM [Landmark]
WHERE GeoLocation.STDistance(@CurrentLocation )<= 2000 -- 2 Km

वहाँ लगभग किसी भी डेटाबेस के लिए समान कार्यक्षमता होनी चाहिए।

यदि आपने भू-स्थानिक अनुक्रमण को सही ढंग से लागू किया है तो आपकी खोजों का उपयोग आपके द्वारा उपयोग किए जा रहे दृष्टिकोण से अधिक तेज़ होगा


1
कृपया सहायता केंद्र में संपादन सहायता के माध्यम से पढ़ने के लिए कुछ समय दें । स्टैक ओवरफ्लो पर प्रारूपण अन्य साइटों की तुलना में अलग है।
Dharman
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.