नए देशांतर की गणना, पुराने + n मीटर से अक्षांश


84

मैं एक समन्वय और मीटर में दूरी के आधार पर 2 नए देशांतर और 2 नए अक्षांश बनाना चाहता हूं, मैं एक निश्चित बिंदु के आसपास एक अच्छा बाउंडिंग बॉक्स बनाना चाहता हूं। यह एक शहर के हिस्से के लिए है और अधिकतम for 1500 मीटर है। इसलिए मुझे नहीं लगता कि पृथ्वी की वक्रता को ध्यान में रखा जाना चाहिए।

तो मेरे पास 50.0452345(x) और 4.3242234(y) है और मैं x + 500 मीटर, x - 500 मीटर, y - 500 मीटर, y + 500 मीटर जानना चाहता हूं

मुझे कई एल्गोरिदम मिले लेकिन लगभग सभी बिंदुओं के बीच की दूरी से निपटने के लिए प्रतीत होते हैं।


जवाबों:


122

देशांतर प्रति किलोमीटर किलोमीटर की संख्या लगभग है

(2*pi/360) * r_earth * cos(theta)

thetaडिग्री में अक्षांश कहाँ है और r_earthलगभग 6378 किमी है।

लगभग सभी स्थानों पर अक्षांशों के प्रति किलोमीटर किलोमीटर की संख्या लगभग समान है

(2*pi/360) * r_earth = 111 km / degree 

तो आप कर सकते हैं:

new_latitude  = latitude  + (dy / r_earth) * (180 / pi);
new_longitude = longitude + (dx / r_earth) * (180 / pi) / cos(latitude * pi/180);

जब तक dxऔर dyपृथ्वी की त्रिज्या की तुलना में छोटे हैं और आप ध्रुवों के बहुत करीब नहीं जाते हैं।


2
डिग्री से रेडियन में बदलने के लिए जिसे आप पी के साथ गुणा करते हैं और 180 से विभाजित करते हैं। लेकिन आप लिखते हैंcos(latitude*180/pi)
josch

9
@ जोश: अच्छी पकड़। केवल एक सुधार का प्रस्ताव देने के बजाय अगली बार उत्तर को सही करने का प्रयास करें। कई लोग बस स्टैकऑवरफ्लो से कोड कॉपी और पेस्ट करते हैं यह सोचकर कि यह सही है और उपयोग के लिए तैयार है।
एलेक्स Essilfie

4
ठीक है, दिशा क्या होगी? मेरा मतलब है कि अगर मैं 50 मीटर जोड़ना चाहता हूं, तो इसे कहां जोड़ा जाएगा? दायें, बायें, ऊपर या नीचे?
तुषार मोनिरुल

3
पृथ्वी पूरी तरह से गोलाकार नहीं है, इसलिए "त्रिज्या" के लिए एक एकल मूल्य का उपयोग करना एक अनुमान है। विकिपीडिया कहता है "सतह पर बिंदुओं से केंद्र की दूरी 6,353 किमी से 6,384 किमी तक"। यह भी कहता है "पृथ्वी को मॉडलिंग के कई अलग-अलग तरीकों से प्रत्येक क्षेत्र में 6,371 किमी का औसत त्रिज्या प्राप्त होता है" जो आपके मूल्य को इंगित करता है। वास्तव में, यदि यह सुधार आपके आवेदन में महत्वपूर्ण है, तो आपको वैसे भी एक बेहतर एल्गोरिथ्म का उपयोग करना चाहिए।
नीबोट

4
किसी के लिए जो सुनिश्चित नहीं है कि r_earth चर मीटर में होना चाहिए और लगभग 6371000.0 के बराबर होना चाहिए
अमित

26

स्वीकृत उत्तर पूरी तरह से सही है और काम करता है। मैंने कुछ मोड़ दिए और इस में बदल गया:

double meters = 50;

// number of km per degree = ~111km (111.32 in google maps, but range varies
   between 110.567km at the equator and 111.699km at the poles)
// 1km in degree = 1 / 111.32km = 0.0089
// 1m in degree = 0.0089 / 1000 = 0.0000089
double coef = meters * 0.0000089;

double new_lat = my_lat + coef;

// pi / 180 = 0.018
double new_long = my_long + coef / Math.cos(my_lat * 0.018);

आशा है कि यह भी मदद करता है।


27
0.0000089? जादू की संख्या से बचने की कोशिश करें, यह कोई भी नहीं समझेगा।
23

2
यह कोड में पृथ्वी के व्यास और पाई नंबर का एक छोटा संस्करण है। जादू नहीं।
नुमान करलासन

16
यह अभी भी जादू है अगर कोई नहीं जानता कि इस संख्या को कैसे पुन: पेश करना है। आप अपने कोड में पूर्ण गणना क्यों नहीं करते हैं?
स्काइ

13
गूगल मैप में 1 डिग्री 111.32 किलोमीटर के बराबर है। 1 डिगरी = 111.32KM। डिग्री में 1KM = 1 / 111.32 = 0.008983। डिग्री में 1M = 0.000008983।
मुहम्मद अज़ीम

7
आपको अपने उत्तर में एक टिप्पणी करनी चाहिए थी, टिप्पणियों में डालना मददगार नहीं है।
चुतसू 16-13 को

18

अक्षांश के लिए करें:

var earth = 6378.137,  //radius of the earth in kilometer
    pi = Math.PI,
    m = (1 / ((2 * pi / 360) * earth)) / 1000;  //1 meter in degree

var new_latitude = latitude + (your_meters * m);

देशांतर के लिए:

var earth = 6378.137,  //radius of the earth in kilometer
    pi = Math.PI,
    cos = Math.cos,
    m = (1 / ((2 * pi / 360) * earth)) / 1000;  //1 meter in degree

var new_longitude = longitude + (your_meters * m) / cos(latitude * (pi / 180));

चर your_metersमें एक सकारात्मक या एक नकारात्मक मान हो सकता है।


8

क्या आपने जाँच की है: मैं अक्षांश / लंबा कैसे पता लगा सकता हूँ जो किसी दिए गए अक्षांश / उत्तर से x किमी उत्तर में है ?

ये गणना सबसे अच्छा कष्टप्रद है, मैंने उनमें से कई को किया है। हैवरसाइन सूत्र आपका मित्र होगा।

कुछ संदर्भ: http://www.movable-type.co.uk/scripts/latlong.html


यदि आप एक बहुत छोटे से क्षेत्र के लिए काम करते हैं, तो क्या लगभग अक्षांश-0.09 और देशांतर-0.0148 में लगभग एक वर्ग किमी क्षेत्र प्राप्त करना बहुत बुरा है?
बेंजामिन उडिंक दस केट

मैं कहूंगा कि यह वास्तव में बुरा नहीं है। उस स्तर पर वर्ग किमी पृथ्वी की वक्रता से विकृत नहीं होगा - जब तक कि लैट / लैंग के साथ आप काम कर रहे हैं दशमलव है।
रयान टर्निअर

1
@BenjaminUdinktenCate जो एम्स्टर्डम में काम करेगा, लेकिन दुनिया के अन्य हिस्सों में गलत होगा। "देशांतर-0.0148" करने से आपको भूमध्य रेखा पर केवल 0.16 किमी ही मिलेगा।
nibot

3

मुझे @nibot द्वारा समाधान निकालने के लिए लगभग दो घंटे बिताने थे, मुझे बस एक केंद्र बिंदु बनाने की विधि की आवश्यकता थी जो किलोमीटर में इसकी केंद्र बिंदु और चौड़ाई / ऊँचाई (या त्रिज्या) को देखते हुए:

मैं समाधान को गणितीय / भौगोलिक रूप से नहीं समझता। मैंने चार निर्देशांक प्राप्त करने के लिए समाधान (कोशिश और त्रुटि द्वारा) को ट्विक किया:

उत्तर:

private static Position FromKmToNPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_latitude = p.Lat + (km / r_earth) * (180 / pi);
    return new Position(new_latitude, p.Long);
}

पूर्व:

private static Position FromKmToEPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_longitude = p.Long + (km / r_earth) * (180 / pi) / Math.Cos(p.Lat * pi / 180);
    return new Position(p.Lat, new_longitude);
}

दक्षिण:

private static Position FromKmToSPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_latitude = p.Lat - (km / r_earth) * (180 / pi);
    return new Position(new_latitude, p.Long);
}

पश्चिम:

private static Position FromKmToWPosition(Position p, double km)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_longitude = p.Long - (km / r_earth) * (180 / pi) / Math.Cos(p.Lat * pi / 180);
    return new Position(p.Lat, new_longitude);
}

1

यदि आपको बहुत सटीक नहीं होना है तो: प्रत्येक 10000 मीटर अक्षांश और देशांतर के लिए लगभग 0.1 है। उदाहरण के लिए, मैं अपने डेटाबेस से बिंदु_ए के आसपास 3000 मीटर की दूरी लोड करना चाहता हूं:

double newMeter =  3000 * 0.1 / 10000;
double lat1 = point_A.latitude - newMeter;
double lat2 = point_A.latitude + newMeter;
double lon1 = point_A.longitude - newMeter;
double lon1 = point_A.longitude + newMeter;
Cursor c = mDb.rawQuery("select * from TABLE1  where lat >= " + lat1 + " and lat <= " + lat2 + " and lon >= " + lon1 + " and lon <= " + lon2 + " order by id", null);


-1
var meters = 50;
var coef = meters * 0.0000089;
var new_lat = map.getCenter().lat.apply() + coef;
var new_long = map.getCenter().lng.apply() + coef / Math.cos(new_lat * 0.018);
map.setCenter({lat:new_lat, lng:new_long});

2
कृपया अपने उत्तर में कुछ स्पष्टीकरण जोड़ें।
अन्ना

यदि आप वर्तमान मानचित्र के केंद्र के पास 50 मीटर के बारे में मैप ऑब्जेक्ट को स्थानांतरित करना चाहते हैं, तो आप इस कोड का उपयोग +, - संख्याओं को +50 के प्रतिस्थापन के रूप में कर सकते हैं
Eyni Kave
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.