পুরানো + এন মিটার থেকে অক্ষাংশ, নতুন দ্রাঘিমাংশ গণনা করা হচ্ছে


86

আমি স্থানাঙ্ক এবং মিটার দূরত্বের ভিত্তিতে 2 টি নতুন দ্রাঘিমাংশ এবং 2 টি নতুন অক্ষাংশ তৈরি করতে চাই, আমি একটি নির্দিষ্ট পয়েন্টের চারপাশে একটি সুন্দর বাউন্ডিং বক্স তৈরি করতে চাই। এটি একটি শহরের অংশ এবং সর্বাধিক 00 1500 মিটারের জন্য। সুতরাং আমি মনে করি না যে পৃথিবীর বক্রতা বিবেচনায় নিতে হবে।

সুতরাং আমার কাছে 50.0452345(x) এবং 4.3242234(y) আছে এবং আমি x + 500 মিটার, x - 500 মিটার, y - 500 মিটার, y + 500 মিটার জানতে চাই

আমি অনেক অ্যালগরিদম খুঁজে পেয়েছি তবে প্রায় সবাই পয়েন্টগুলির মধ্যে দূরত্ব নিয়ে কাজ করে বলে মনে হচ্ছে।


উত্তর:


125

দ্রাঘিমাংশের ডিগ্রি প্রতি কিলোমিটারের সংখ্যা প্রায়

(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পৃথিবীর ব্যাসার্ধ তুলনায় ছোট এবং আপনি খুব খুঁটি পাসে না।


4
ডিগ্রী থেকে রূপান্তর করুন আপনি 180. দ্বারা PY এবং ডিভাইড সঙ্গে সংখ্যাবৃদ্ধি কিন্তু আপনি লিখতে রেডিয়ানে করতেcos(latitude*180/pi)
josch

9
@ জোছ: ভাল ক্যাচ কেবলমাত্র একটি সংশোধনের প্রস্তাব দেওয়ার পরিবর্তে উত্তরটি পরবর্তী সময় সংশোধন করার চেষ্টা করুন। অনেকে সঠিকভাবে স্ট্যাকওভারফ্লো থেকে কোডটি অনুলিপি এবং পেস্ট করে মনে করে এটি সঠিক এবং ব্যবহারের জন্য প্রস্তুত।
অ্যালেক্স এসিলফি

4
ঠিক আছে, দিকটি কী হবে? মানে আমি যদি 50 মিটার যুক্ত করতে চাই তবে এটি কোথায় যুক্ত হবে? ডান, বাম, উপরে বা নীচে?
তুষার মনিরুল

4
পৃথিবী পুরোপুরি গোলাকার নয়, সুতরাং "ব্যাসার্ধ" এর জন্য একটি একক মান ব্যবহার করা একটি আনুমানিক। উইকিপিডিয়া বলেছে, "কেন্দ্রের পৃষ্ঠের পয়েন্টগুলি থেকে দূরত্ব 6,৩৩৩ কিমি থেকে ,,৩৮৪ কিমি পর্যন্ত"। এটি আরও বলেছে যে, পৃথিবীকে গোলক হিসাবে মডেলিংয়ের বিভিন্ন উপায়, যার প্রতিটি ফলন হয় তার গড় ব্যাসার্ধ 6,371 কিলোমিটার যা আপনার মানকে নির্দেশ করে। সত্যই, যদি আপনার অ্যাপ্লিকেশনটিতে এই সংশোধনটি তাৎপর্যপূর্ণ হয় তবে আপনার উচিত যাইহোক আরও ভাল অ্যালগরিদম ব্যবহার করা উচিত।
নিবোট

4
যে কেউ নিশ্চিত না যে r_earth পরিবর্তনশীলটি মিটারে হওয়া উচিত এবং প্রায় 6371000.0 এর সমান হওয়া উচিত
অমিত আসারফ

30

গৃহীত উত্তর পুরোপুরি সঠিক এবং কাজ করে। আমি কিছু টুইট করে এটিকে পরিণত করেছি:

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);

আশা করি এটিও সাহায্য করবে।


28
0.0000089? যাদু সংখ্যাগুলি এড়াতে চেষ্টা করুন, এটি কেউ বুঝতে পারবে না।
স্কাই

4
কোডে এটি পৃথিবী ব্যাস এবং পাই সংখ্যার একটি সংক্ষিপ্ত সংস্করণ। যাদু নয়
নুমান কারাস্লান

17
কেউ যদি এই সংখ্যা পুনরুত্পাদন করতে না জানেন তবে এটি এখনও যাদু। আপনি কেন আপনার কোডে পুরো হিসাব রাখেন না?
স্কাই

13
গুগল ম্যাপে 1 ডিগ্রি 111.32 কিলোমিটারের সমান। 1 ডিগ্রি = 111.32KM। ডিগ্রিতে 1KM = 1 / 111.32 = 0.008983। ডিগ্রীতে 1 এম = 0.000008983।
মুহাম্মদ আজিম

7
আপনার উত্তরে আপনার একটি মন্তব্য করা উচিত ছিল, মন্তব্যগুলিতে রেখে দেওয়া কার্যকর নয়।
চুটসু

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একটি ইতিবাচক বা নেতিবাচক মান থাকতে পারে।


9

আপনি কি পরীক্ষা করে দেখেছেন: প্রদত্ত ল্যাট / লম্বরের উত্তর কিমি কিমি / লম্বাটি কীভাবে খুঁজে পাব ?

এই গণনাগুলি সবচেয়ে বিরক্তিকর, আমি তাদের মধ্যে অনেকগুলি করেছি। Haversine সূত্র আপনার বন্ধু হবে।

কিছু উল্লেখ: http://www.movable-type.co.uk/scriptts/latlong.html ml


আপনি যদি খুব ছোট অঞ্চলের জন্য কাজ করেন, তবে প্রায় বর্গ কিমি এলাকা পেতে কেবল অক্ষাংশ-0.09 এবং দ্রাঘিমাংশ-0.0148 করা কি সত্যিই খারাপ?
বেনিয়ামিন উদ্দিন দশ কেট

আমি বলব এটি আসলে খারাপ নয়। সেই স্তরের বর্গকিলোমিটার পৃথিবীর বক্রতা দ্বারা বিকৃত হবে না - যতক্ষণ আপনি যে ল্যাট / এলএনজি ব্যবহার করছেন দশমিক।
রায়ান টার্নিয়ার

4
@ বেনজামিনউডিংকেনেট আমস্টারডামে কাজ করবে তবে বিশ্বের অন্যান্য অংশে এটি ভুল হবে। "দ্রাঘিমাংশ-0.0148" করা আপনাকে নিরক্ষীয় অঞ্চলে প্রায় 0.16 কিমি পেতে পারে।
নিবোট

4

@ নিমোট দ্বারা সমাধানটি কাজ করতে আমাকে প্রায় দুই ঘন্টা ব্যয় করতে হয়েছিল, তার কেন্দ্র বিন্দু এবং প্রস্থ / উচ্চতা (বা ব্যাসার্ধ) কিলোমিটারের মধ্যে দিয়ে একটি সীমানা বাক্স তৈরি করার জন্য আমার কেবল একটি পদ্ধতির প্রয়োজন ছিল:

আমি সমাধানটি গণিত / ভৌগোলিকভাবে বুঝতে পারি না। চারটি স্থানাঙ্ক পাওয়ার জন্য আমি সমাধানটি চেষ্টা করেছিলাম (চেষ্টা করে এবং ত্রুটি করে):

উত্তর:

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});

4
আপনার উত্তরে দয়া করে কিছু ব্যাখ্যা যুক্ত করুন।
আনা

আপনি যদি বর্তমান মানচিত্রের কেন্দ্রের কাছে প্রায় 50 মিটার অবধি মানচিত্রের অবজেক্টটি সরিয়ে নিতে চান, তবে আপনি +, - সংখ্যার সাথে +50
Eyni Kave
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.