كيفية استرداد LayerPoint (X، Y) من إحداثيات Latitude وLongitude باستخدام Leaflet API
-
21-12-2019 - |
سؤال
إذا استخدمت الكود التالي للحصول على 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
تكمن المشكلة في أنه لا يبدو أنه المربع الصحيح لخط العرض هذا ولا الكود الأصلي الخاص بي لتحويل خطوط العرض 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
التحديث 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 إلى أرقام التجانب والعكس لمختلف لغات البرمجة/البرمجة النصية.