Обтекание данных Geo json по строке даты в Openlayers - PullRequest
0 голосов
/ 22 марта 2020

Я использую 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 не отображаются справа от строки даты. Я понимаю, что это потому, что экстент VectorSource по умолчанию [-180, -90, 180, 90]. У меня вопрос: как я могу изменить этот экстент до экстента вида карты, чтобы данные отображались на другой стороне линии даты?

Похоже, что лучшим подходом было бы перехватить координаты данных USGS и добавить преобразование к координате lon, возможно, через ol / proj.transform или ol / proj.transformExtent , но мне не удалось найти объект данных openlayers, содержащий координаты, ни способ применить к ним карту или преобразование.

1 Ответ

1 голос
/ 22 марта 2020

Слои векторов используют проекцию вида, которая, если не указано, является 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
  })
...