尝试使用EPSG:传单中的3857

时间:2018-01-26 13:27:36

标签: javascript leaflet proj4js

我正在尝试使用EPSG:3857作为输入坐标系。我使用porj4leaflet来实现这一目标。我已经定义了我的地图实例:

var map = L.map('map', {
center: [8378860.13, 1481133.311008498],
zoom: 7,
crs: new L.Proj.CRS(
  'EPSG:3857',
  '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs',
    {
      resolutions: [
        8192, 4096, 2048, 1024, 512, 256, 128
      ],
      origin: [0, 0]
    }
  )
});

当我尝试运行时,我得到TypeError: coordinates must be finite numbers。你可以在这里看到整个小提琴:https://jsfiddle.net/asdpinspdai/fckbpq0a/

我从文档中理解的是,设置这样的crs应该允许我将坐标传递给EPSG:3857格式的传单。我错过了什么吗?

这里的任何帮助都是非常非常的。谢谢

1 个答案:

答案 0 :(得分:2)

“有限数字”错误是因为L.Map期望center坐标在-90到90和-180到180度的范围内。

在您的jsfiddle中,您还遇到选择zoom:11的问题,但CRS定义中只有7个缩放级别。

Leaflet API始终以度为单位使用WGS84纬度/经度坐标,因此使用Proj4leaflet这种方式将无法满足您的需求。请参阅此explanation from the Proj4Leaflet project

但是,EPSG:3857已经是Leaflet中的默认CRS,您可以使用其内置方法在米和WGS84度之间进行转换,而无需Proj4Leaflet或Proj4js。请参阅Leaflet CRS documentation

const proj = L.CRS.EPSG3857;

// Degrees to metres
proj.project(new L.LatLng(51,-2));             // {x: -222638.98158654, y: 6621293.722740}

// Metres to degrees
proj.unproject(new L.Point(-222600, 6621000)); // {lat: 50.998339473, lng: -1.99964982245}

每当你需要将它传递给Leaflet时,你的仪表坐标unproject可能最简单,但是你也可以编写一些Leaflet函数的重写版本。这些将采用仪表坐标,将它们转换为度数,然后将它们传递给原始函数。