أكثر

حساب إحداثيات Mercator من خط العرض / الطول


أنا جديد على GIS ولكني أعمل على مشروع رسم خرائط مبنى باستخدام مخططات الطوابق و JOSM.

باستخدام مكوّن PicLayer الإضافي ، أضفت .png "> http://wiki.openstreetmap.org/wiki/Mercator

يحول كود Python ضمن Elliptical Mercator خط الطول الخاص بي بشكل صحيح ، لكن خط العرض متوقف بنحو 0.5٪ (بضعة أمتار).

import math def merc_x (lon): r_major = 6378137.000 إرجاع r_major * math.radians (lon) def merc_y (lat): if lat> 89.5: lat = 89.5 if lat <-89.5: lat = -89.5 r_major = 6378137.000 r_minor = 6356752.3142 temp = r_minor / r_major eccent = math.sqrt (1-temp ** 2) phi = math.radians (lat) sinphi = math.sin (phi) con = eccent * sinphi com = eccent / 2 con = ((1.0- con) / (1.0 + con)) ** com ts = math.tan ((math.pi / 2-phi) / 2) / con y = 0-r_major * math.log (ts) إرجاع y

تم محاذاة العقد والطرق الخاصة بي بشكل صحيح مع الصورة مع خط الطول وخط العرض هذا في WGS84 ، لذلك أعتقد أنها صحيحة والتحويل ليس كذلك. أنا في نصف الكرة الشمالي وأستخدم منطقة بالقرب من 49 شمالاً ، -122 شرقًا.


ألق نظرة على Proj4 https://github.com/OSGeo/proj.4/wiki python application pyproj https://github.com/jswhit/pyproj

يمكنك تحديد الإسقاطات src و dest (مثلEPSG: 4326وEPSG: 3857) وتحويل الإحداثيات بينهما. وسيقوم بيبروج بإجراء جميع الحسابات الأولية.


ملاحظة: هذا الحل يستهدف مدخلات الصفيف. مستوحى من حل @ JoshVazquez المقبول.

إذااللاتولونكلا المصفوفتين (أو أعمدة إطار البيانات) ...

الإجابة المقبولة الحالية ستعمل بشكل جيد عندمااللاتولونهي معلمات عددية.

ومع ذلك ، فقد اصطدمت مؤخرًا بسيناريواللاتولونهي مصفوفات عددية (أو أعمدة إطار بيانات الباندا). لإنجاز هذا العمل مع أعمدة المصفوفات / إطار البيانات ، قمت بشكل أساسي بتعديل حل @ JoshVazquez أعلاه - لاستبدال جميعالرياضياتوظائف معحبيبيالمهام.

استيراد عدد كبير مثل np def merc_from_arrays (lats، lons): r_major = 6378137.000 x = r_major * np.radians (lons) scale = x / lons y = 180.0 / np.pi * np.log (np.tan (np.pi / 4.0 + lats * (np.pi / 180.0) /2.0)) * إرجاع المقياس (x، y) lats = np.asarray ([54.984105، 56]) lons = np.asarray ([- 3.193693، -2.2]) xs ، ys = merc_from_arrays (lats، lons) print ('xs: {}'. format (xs)) # => [-355520.27851004 -244902.8797452] print ('ys: {}'. format (ys)) # => [ 7358781.82857011 7558415.65608178]

تحويل خط الطول من Mercator الإهليلجي (نفس الصيغة في كلا النظامين ؟:

import math def merc_x (lon): r_major = 6378137.000 إرجاع r_major * math.radians (lon)

مركاتور X معروف الآن. اقسم هذا على خط الطول للحصول على قيمة المقياس.

تحويل خط العرض من كروي مركاتور:

import math def lat2y (a): إرجاع 180.0 / math.pi * math.log (math.tan (math.pi / 4.0 + a * (math.pi / 180.0) /2.0))

اضرب النتيجة في قيمة المقياس للحصول على قيمة Mercator Y.

في وظيفة واحدة:

import math def merc (lat ، lon): r_major = 6378137.000 x = r_major * math.radians (lon) scale = x / lon y = 180.0 / math.pi * math.log (math.tan (math.pi / 4.0 + خط الطول * (math.pi / 180.0) /2.0)) * إرجاع المقياس (س ، ص)


شاهد الفيديو: Opseg i površina kvadrata i pravokutnika (شهر اكتوبر 2021).