在Openlayers中跨日期行包装Geojson数据

在Openlayers中跨日期行包装Geojson数据,openlayers,openlayers-6,Openlayers,Openlayers 6,我正在使用OpenLayers使用USGS数据集绘制地震图,该数据集位于: https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojson 我正在添加图层并按如下方式配置视图: var map = new Map({ target: 'map', layers: [ new TileLayer({ source: new OSM() }), new ImageLa

我正在使用OpenLayers使用USGS数据集绘制地震图,该数据集位于:

https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojson
我正在添加图层并按如下方式配置视图:

var map = new Map({
  target: 'map',
  layers: [
    new TileLayer({
      source: new OSM()
    }),
    new ImageLayer({
      opacity: 0.3,
      source: raster
    }),
    new WebGLPointsLayer({
      source: new VectorSource({
        url: "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojson",
        format: new GeoJSON(),
        attributions: 'USGS'
      })
    })
  ],
  view: new View({
    center: fromLonLat([103.8198, 1.3521]),
    zoom: 1
  })
});
“我的视图”被设置为在缩放级别1时,日期线包含在范围中。USGS数据不会呈现在日期行的右侧。我理解这是因为矢量源的默认范围是[-180,-90,180,90]。我的问题是,如何将该范围更改为地图视图的范围,以便数据在日期行的另一侧呈现


似乎最好的方法是截取美国地质勘探局数据的坐标,并向lon坐标添加变换,可能通过或,但我无法找到包含坐标的openlayers数据对象,也找不到对其应用地图或变换的方法。

矢量层使用视图投影,除非指定,否则该投影是以格林威治子午线为中心的EPSG:3857

您可以尝试定义一个以日期线为中心的球形墨卡托

proj4.defs('sphmerc180', '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=180.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs');
register(proj4);

var sphmerc180 = getProjection('sphmerc180');
sphmerc180.setExtent(getProjection('EPSG:3857').getExtent());
sphmerc180.setGlobal(true);
然后将其用作视图投影

  view: new View({
    projection: sphmerc180,
    center: fromLonLat([103.8198, 1.3521], sphmerc180),
    zoom: 1
  })

这让人感觉它正朝着正确的方向发展。数据现在在整个视图中进行,但现在整个地图是原始大小的1/4,视图不再以[103.8198,1.3521]为中心。它以日期线为中心。设置投影范围以匹配EPSG:3857应该可以解决这一问题。现在,底图与我开始时一样,很好地居中于正确的位置,但数据呈现在[0,360]之间,即从本初子午线到本初子午线。如果我将+lon_0=180.0调整为+lon_0=103.8198,则数据对齐,但是,也许现在我要走很长的路来解决这个问题。你可以将投影集中在任何经度上,但目前你只能在投影的一个世界内使用WebGL进行渲染(与VectorLayer不同,源代码的wrapX设置没有效果)。在这一点得到支持之前,我认为投影更改是最好的解决方法,尽管如果您也使用矢量图块,这将是一个问题,因为为一个投影设计的矢量图块不能与另一个投影一起使用。