Как получить LayerPoint (X, Y) из координат широты и долготы с помощью API-интерфейса Leaflet - программирование
Подтвердить что ты не робот

Как получить LayerPoint (X, Y) из координат широты и долготы с помощью API-интерфейса Leaflet

Если я использую следующий код, чтобы получить LayerPoint из указанного параметра Lat/Lng:

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

Проблема в том, что она даже не кажется правильной черепицей для этой долготы широты, и мой исходный код для преобразования lat lng в LayerPoint фактически не возвращает действительный X, Y в первую очередь.

Я очень смущен, почему я получаю эти результаты. Любая помощь будет принята с благодарностью. Возможно, я делаю что-то неправильно.

Я не уверен, есть ли другой способ извлечения слоев плитки на основе списка широт и долгот?

Причина, по которой я после этого, заключается в том, что я хочу использовать данные кэшированной черепицы для автономного приложения, и единственные данные, которые у меня есть, - это геометрия/координаты с помощью полезной нагрузки geoJSON, созданной для клиентского приложения.

UPDATE:

Закончено с этой функцией (спасибо @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);
4b9b3361

Ответ 1

После дальнейших исследований выясняется, что я получил следующую функцию:

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

Ответ 2

URL-адреса графической подсистемы OSM основаны на другой схеме. Вы должны прочитать о slippy названиях плитки карты в вики OSM. Он содержит реализации для номеров lon/lat to tile и наоборот для различных языков программирования/сценариев.