أو كيفية ملائمة مربعات خرائط Yandex لإسقاط OpenStreetMaps؟
دخول
في كل مرة تفتح فيها خريطة من نوع ما ، لا تقوم بتنزيلها بالكامل. لتسريع عملية تحميل الخريطة ، يتم تقسيمها إلى أجزاء صغيرة (مربعات) بحيث يمكن فقط تنزيل المساحة المطلوبة. المشكلة هي أنه يمكنك قطع هذه المربعات بعدة طرق.

معظم البطاقات على الإنترنت "تعتقد" أن الأرض في شكل كرة. فيما بينها ، على سبيل المثال ، خرائط جوجل و OpenStreetMaps. البعض ، الأكثر دقة ، يأخذ في الاعتبار حقيقة أن الكوكب ليس الكرة الصحيحة: على الأقل ، يتم تسويته في القطبين. يتم استخدام مثل هذا الإسقاط الإهليلجي ، على سبيل المثال ، في خرائط ياندكس.

نتيجة لذلك ، ستظهر الخلية التي لها نفس الرقم في توقعات مختلفة أماكن مختلفة تمامًا. على سبيل المثال ، يوجد هنا بلاطة برقم 10427 على المحور X و 5119 على المحور Y. مقياس المستوى 14. على اليسار - OSM ، على Yandex اليمنى. بدلا من المدينة - نوع من الغابات.

على الرغم من أن معظم محركات الخرائط يمكنها ضبط البلاط تلقائيًا وفقًا للإسقاط المطلوب ، في بعض الأحيان قد تحتاج إلى القيام بذلك يدويًا. لكن كيف؟ أسهل طريقة هي ببساطة تحويل البلاط من خلال عدد معين من البكسل. نتيجة لذلك ، سوف نرى المنطقة المطلوبة على الخريطة. بالطبع ، إذا نظرت عن كثب ، يمكنك رؤية بعض التشوهات. ولكني أعتقد أن كل المهام اليومية ذات الدقة المماثلة ستكون أكثر من كافية. لذلك حان الوقت لإنهاء مع مقدمة والبدء في صنع المحول.

تقنية
للعمل ، نحتاج إلى صيغة تحويل. بقدر ما أفهم ، تم سحبها مباشرة من رمز صفحة خرائط ياندكس ، في تلك الأيام ، عندما كان لا يزال من الممكن القيام بذلك. لن أجد رابط المصدر الآن ، ولكن هذه الصيغة
قد نشرت بالفعل على المحور. لم أتطرق إليها من الناحية العملية: لقد قمت ببساطة بإعادة كتابتها على Swift وأعطيت متغيرات حرف واحد غير مفهومة المزيد من أسماء "الحديث". على الأقل أولئك الذين تمكنوا من التعرف عليها. (شكرا لإيريلن للمساعدة)
حسنا ، المهمة هي على النحو التالي. نحتاج إلى إجراء محول يأخذ رقم التجانب في الإسقاط القياسي كمدخلات ، ورقم التجانب في الإسقاط الإهليلجي وعدد البكسل الذي يحتاج إلى تحويله إلى الإخراج.
هكذا. على سبيل المثال ، خذ
بلاطة برقم X 10427 ، Y 5119 ، Z 14.
سوف نتصرف في خطوتين. أولاً ، تحتاج إلى العثور على الإحداثيات (خطوط الطول والعرض) لهذا البلاط. على سبيل المثال ، إحداثيات الزاوية اليسرى العليا.
func tileNumberToCoordinates(tileX: Int, tileY: Int, mapZoom: Int) -> (lat_deg: Double, lon_deg: Double) { let n : Double = pow(2.0, Double(mapZoom)) let lon = (Double(tileX) / n) * 360.0 - 180.0 let lat = atan( sinh (.pi - (Double(tileY) / n) * 2 * Double.pi)) * (180.0 / .pi) return (lat, lon) }
نحصل على الإخراج (55.7889 49.1088). الآن نحن استبدال القيم التي تم الحصول عليها في صيغتنا. مستوى التكبير لا يزال هو نفسه: 14.
func getWGS84Position(latitude: Double, longitude: Double, zoom: Int) -> (x:Int, y:Int, offsetX:Int, offsetY:Int) {
حصلنا على (10427 ، 5133 ، 0 ، 117). هذا يعني أننا نحتاج إلى
تجانب Yandex برقم X 10427 ، Y 5133 ، Z 14. وإذا قمت بتبديله بمقدار 0 بكسل إلى اليسار و 117 بكسل لأعلى ، فسيأخذ المكان الصحيح.

وماذا تفعل حيال ذلك؟
إذا كتبت متصفحك وأتيحت لك الفرصة للتأثير على عرض الخريطة ، فسيكون كل شيء بسيطًا نسبيًا. حساب الإزاحة لأي من البلاط على الشاشة. وحرك العنصر مع الخريطة بواسطة هذا العدد من البكسل بأي طريقة ملائمة.
ولكن إذا لم يكن لديك حق الوصول إلى الكود ، فسيتعين عليك إدخال رابط وسيط بين خادم الخريطة والملاحة. على سبيل المثال ، لقد تقدمت خادم بسيط لهذا الغرض. يستغرق إدخال عدد البلاط المطلوب ، يحسب عدد البلاط في إسقاط القطع الناقص. كما يقوم بتنزيل ثلاثة بلاطات مجاورة. قم بلصق هذه المربعات الأربعة في واحدة كبيرة واحدة ، ثم يقطع الجزء المطلوب منه ويعيده إلى متصفح المستخدم.

النتيجة والأصل:

بالطبع ، كل هذه العمليات تتطلب تكاليف وقت إضافية. باستخدام هذه الروابط ، يمكنك تقييم السرعة التي يقوم بها الخادم "بالفوتوشوب" في البطاقة في الوقت الفعلي:
https://anygis.ru/api/v1/Yandex_map/{x}/{y}/{z}https://anygis.ru/api/v1/Yandex_sat_clean/{x}/{y}/{z}حسنًا ، آمل أن تكون المعلومات المقدمة هنا مفيدة لشخص ما. حظا سعيدا في تجاربك.