Листовка: координаты веб-Меркатора panTo (EPSG 3857)

у меня есть стандартная карта листовки, показывающая слой плитки. Теперь листовка позволяет использовать только panTo метод с использованием LatLng, например,

map.panTo(new L.LatLng(40.17, -98.12));

как я буду использовать выше метод панто, если мои координаты находятся в (3679364.68,-9096106.74) ?

Это довольно просто в Openlayers, как только вы определяете проекцию карты, все работает в этой проекции. Но листовка всегда работает на latlng с снаружи.

любой простой способ сделать это с помощью библиотека листовка?

спасибо!

3 ответов


листовка позволяет использовать метод panTo с помощью unproject 3857 point. Если вы не хотите использовать библиотеку proj4js, это также достигается в листовке.

var point = new L.Point(3679364.68,-9096106.74); // Lon/Lat
var earthRadius = 6378137;
var latlng = L.Projection.SphericalMercator.unproject(point.divideBy(earthRadius));

map.panTo(new L.LatLng(latlng.lat, latlng.lng));

Я могу заставить его работать, если я использую proj4js библиотека для преобразования координат, делая это:

var source = new Proj4js.Proj('EPSG:3857');
var dest = new Proj4js.Proj('EPSG:4326');
var p = new Proj4js.Point(-9096106.74,3679364.68); //this takes x,y
Proj4js.transform(source, dest, p);
this.map.setView(new L.LatLng(p.y, p.x),zoom);

но это все еще не идеальное решение, поскольку оно облагает меня мегабайтом за включение библиотеки. Я все еще ищу решение для листовки. Зная, что внутренне листовка уже использует EPSG: 3857 для извлечения плиток, это не должно быть так сложно.

Update

чтобы сделать это чисто в листовке, посмотрите на ответ @ARsl. Единственная причина, по которой я все еще принимаю это как мой ответ, потому что все еще неудобно делать проекционные вычисления (не то, что они ошибаются), и именно по этой причине я не принимаю этот ответ. Плюс proj4js как дополнительные преимущества поддержки многих других данных.


Я также не нашел никакого встроенного метода для преобразования координат EPSG:3857 в LatLng.

листовка crs class L.CRS.EPSG3857 только project метод, который преобразует L.LatLng to L.Point в EPSG: 3857 координат. https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.js

но его довольно легко расширить с помощью unproject способ:

L.CRS.EPSG3857.unproject = function (point) { // Point -> LatLng
  var earthRadius = 6378137;
      projectionPoint = L.point(point).divideBy(earthRadius);

  return this.projection.unproject(projectionPoint);
};

затем вы можете использовать его с panTo метод:

map.panTo(map.options.crs.unproject([1372720.6476878107, 5690559.995203462]));

или:

map.panTo(L.CRS.EPSG3857.unproject([1372720.6476878107, 5690559.995203462]));