كيفية استرداد LayerPoint (X، Y) من إحداثيات Latitude وLongitude باستخدام Leaflet API

StackOverflow https://stackoverflow.com//questions/22032270

سؤال

إذا استخدمت الكود التالي للحصول على LayerPoint من خط العرض/الغاز الطبيعي المسال المحدد:

var latLng = new L.latLng(-37.81303878836989, 144.97421264648438);
var point = map.latLngToLayerPoint(latLng);

الإخراج هو ما يلي:

o.Point
  x: 86042
  y: 77065

ثم عندما أحاول الوصول إلى بلاط الطبقة باستخدام عنوان URL التالي:

http://a.tile.osm.org/10/86042/77065.png

أحصل على 404 لأنه X، Y غير صالح.

والآن إذا استخدمت الكود التالي:

map.on("click", function (e) {
    console.log(e);
});

يمكنني استرداد LayerPoint في وحدة التحكم إلى جانب خطوط الطول والعرض.

latlng: o.LatLng
  lat: -37.81303878836989
  lng: 144.97421264648438
layerPoint: o.Point
  x: 950
  y: 303

ثم يؤدي الوصول إلى عنوان URL التالي إلى إرجاع بلاط الطبقة هذا:

http://a.tile.osm.org/10/950/303.png

enter image description here

تكمن المشكلة في أنه لا يبدو أنه المربع الصحيح لخط العرض هذا ولا الكود الأصلي الخاص بي لتحويل خطوط العرض LNG إلى LayerPoint في الواقع تُرجع X وY صالحة في المقام الأول.

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

لست متأكدًا مما إذا كانت هناك طريقة أخرى لاسترداد طبقات التجانب بناءً على قائمة خطوط الطول والعرض؟

سبب اهتمامي بهذا هو أنني أريد أن أكون قادرًا على استخدام بيانات التجانب المخزنة مؤقتًا لتطبيق غير متصل والبيانات الوحيدة التي أملكها هي الشكل الهندسي/الإحداثيات عبر حمولة GeoJSON التي يتم إنشاؤها للتطبيق من جانب العميل.

تحديث:

انتهى الأمر بهذه الوظيفة (بفضل @scai).

وفق هذا الرابط.

var getSlippyTileLayerPoints = function (lat_deg, lng_deg, zoom) {
    var x = (Math.floor((lng_deg + 180) / 360 * Math.pow(2, zoom)));
    var y = (Math.floor((1 - Math.log(Math.tan(lat_deg * Math.PI / 180) + 1 / Math.cos(lat_deg * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, zoom)));

    var layerPoint = {
        x: x,
        y: y
    };

    return layerPoint;
};

انتاج:

Object {x: 924, y: 628}

http://a.tile.osm.org/10/924/628.png

enter image description here

التحديث 2:

وبعد مزيد من البحث، اتضح أن ما كنت أبحث عنه هو الوظيفة التالية:

var layerPoint = map.project(latlng).divideBy(256).floor();
console.log(layerPoint.x, layerPoint.y);
هل كانت مفيدة؟

المحلول

وبعد مزيد من البحث، اتضح أن ما كنت أبحث عنه هو الوظيفة التالية:

var layerPoint = map.project(latlng).divideBy(256).floor();
console.log(layerPoint.x, layerPoint.y);

نصائح أخرى

تعتمد عناوين URL الخاصة ببلاط OSM على نظام مختلف.يجب أن تقرأ عنها أسماء بلاط الخريطة الزلقة في ويكي OSM.يحتوي على تطبيقات لأرقام lon/lat إلى أرقام التجانب والعكس لمختلف لغات البرمجة/البرمجة النصية.

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