7

我有一个显示瓷砖层的标准传单地图。现在传单只允许您使用panTo使用 LatLng 的方法,例如,

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

EPSG:3857例如,如果我的坐标在其中,我将如何使用上述 panTo 方法(3679364.68,-9096106.74)

这在 Openlayers 中非常简单,因为一旦您定义了地图投影,一切都在该投影中工作。但是 Leaflet 总是在外面工作。

使用传单库完成此任务的任何简单方法?

谢谢!

4

3 回答 3

10

Leaflet 可让您通过 unproject 3857 点使用 panTo 方法。如果您不想使用 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));
于 2014-03-20T09:04:48.233 回答
6

如果我使用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

要纯粹在 Leaflet 中执行此操作,请查看@ARsl 的答案。我仍然接受这个作为我的答案的唯一原因是,做这样的投影计算仍然感到不舒服(不是他们错了),正因为如此,我不接受这个答案。加上 proj4js 作为支持更多基准的附加优势。

于 2013-07-17T13:37:44.307 回答
2

我还没有找到任何将 EPSG:3857 坐标转换为 LatLng 的内置方法。

LeafLet crs 类L.CRS.EPSG3857只有在 EPSG:3857 坐标 project中转换L.LatLng为的方法。https://github.com/Leaflet/Leaflet/blob/master/src/geo/crs/CRS.EPSG3857.jsL.Point

但是用方法扩展它很容易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]));
于 2013-10-20T13:21:56.437 回答