我有一个显示图块层的标准传单图。现在,传单只允许您使用LatLng使用panTo
方法,例如,
map.panTo(new L.LatLng(40.17, -98.12));
如果我的坐标位于EPSG:3857
,例如(3679364.68,-9096106.74)
,我将如何使用上面的panTo方法?
这在Openlayers中非常简单,因为一旦定义了地图投影,一切都在该投影中起作用。但Leaflet总是在外面工作。
使用传单库完成此任务的简单方法?
谢谢!
答案 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]));