سؤال

أنا أستخدم OpenLayers مع خريطة Mercator عادية وأحاول تذوق مربع محيط من خلال العثور على شبكة من النقاط في Latlong. يتم التعبير عن Bbox في لاتلون ، على سبيل المثال

48.1388,-15.3616,55.2057,-3.9359

يمكنني تحديد مسافة في درجات (على سبيل المثال x: 2.5 ، y: 2.4) وعمل النقاط من هناك. لكني أود التعبير عن هذه المسافة متر (على سبيل المثال 50000) من أجل ربطه بعقلية المستخدم (يفهم الناس العدادات ، وليس الدرجات). كيف يمكنني تحويل هذه المسافة؟ أنا أعرف كيفية إعادة مشروع نقطة ، ولكن ليس مسافة.

شكرا على أي تلميحات! مولون

هل كانت مفيدة؟

المحلول

استخدم ال صيغة هافرين للحصول على المسافة بين نقطتين من LAT/Long. هذا يفترض أن الأرض عبارة عن مجال (وهو ، بالنسبة لمعظم الحالات ، "جيد بما فيه الكفاية").

تنفيذ JavaScript لها (سرقت بلا خجل من هنا) يشبه هذا:

var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad(); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
        Math.sin(dLon/2) * Math.sin(dLon/2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c;

نصائح أخرى

دون السماح بالشكل غير الكروي للأرض قليلاً ،

دقيقة واحدة من خط العرض شمالًا إلى الجنوب = 1 ميل بحري = 6075 قدمًا ، لذا فإن درجة واحدة = 60 دقيقة = 60 * 6075 قدمًا هناك 3.28 قدمًا في المتر ، لذا فإن درجة واحدة = 60 * 6075 / 3.28 مترًا = 111،128 مترًا

بدلاً من ذلك ، دقيقة واحدة من خط العرض = 1852 مترًا ، لذا فإن درجة واحدة = 60 * 1852 مترًا = 111،120 مترًا

لست متأكدًا من ما هو أكثر دقة ...

لدرجة خط الطول ، افعل نفس الشيء ، ولكن اضرب جيب التمام (خط العرض) لأن خطوط الطول تقترب معًا أثناء تحركك شمالًا.

يختلف التحول بين الدرجات والأمتار عبر سطح الأرض.

بافتراض الأرض الكروية ، خط العرض الدرجات = المسافة * 360 / (2 * PI * 6400000)

لاحظ أن خط الطول سيختلف حسب خط العرض:

خط طول الدرجات = المسافة * 360 * / (2 * pi * cos (خط العرض))

ما سبق هو لسطح الأرض ، ولا يستخدم إسقاط Mercator. إذا كنت ترغب في العمل مع المسافة الخطية المتوقعة ، فستحتاج إلى استخدام إسقاط Mercator.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top