宣传单:panTo Web Mercator坐标(EPSG 3857)

时间:2013-07-15 21:31:49

标签: javascript maps gis leaflet

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

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

如果我的坐标位于EPSG:3857,例如(3679364.68,-9096106.74),我将如何使用上面的panTo方法?

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

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

谢谢!

3 个答案:

答案 0 :(得分:10)

Leaflet允许您通过取消投影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));

答案 1 :(得分: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

要完全在传单中这样做,请查看@ ARsl的答案。唯一的原因我仍然接受这个作为我的答案因为,仍然感到不舒服做这样的投影计算(不是他们错了),只是因为这个原因我不接受这个答案。加上proj4js作为支持更多基准的额外优势。

答案 2 :(得分:2)

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

LeafLet crs类L.CRS.EPSG3857只有project方法,可以在EPSG中将L.LatLng转换为L.Point: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]));