Я пытаюсь добавить спутниковое изображение на карту, используя OpenLayers 5.
Проблема в том, что я не могу этого сделать, потому что я только что нашел возможность добавить изображение на карту, передавая экстент изображения (xmin, ymin, xmax, ymax), а не ограничивающий прямоугольник. Изображение должно помещаться внутри ограничительной рамки. По этой причине изображение было искажено.
Изображение находится в файле JPG (атрибут feature.properties.icon). Пример: http://exampleserver.com/220/063/353LGN00/353LGN00_thumb_large.jpg
Результат, который я хотел бы получить, выглядит примерно так:
В результате я получил:
Мой код, который добавляет это изображение на карту, следующий:
import ImageLayer from 'ol/layer/Image'
import Static from 'ol/source/ImageStatic'
...
this.olmap = new Map({
target: 'map',
layers: [
baseLayerGroup, rasterLayerGroup, vectorLayer
],
view: new View({
projection: 'EPSG:4326',
center: [ -45.8392, -3.65286 ],
zoom: 8
})
})
...
this.rasterLayerGroup.getLayers().push(
new ImageLayer({
source: new Static({
url: feature.properties.icon,
projection: 'EPSG:4326',
imageExtent: [
feature.properties.bl_longitude, feature.properties.bl_latitude,
feature.properties.tr_longitude, feature.properties.tr_latitude
]
})
})
)
Кто-нибудь знает, как передать ограничивающий прямоугольник изображения, а не только экстент изображения?
Заранее спасибо.
РЕДАКТИРОВАТЬ 1: решение Майка
Благодаря решению Майка мне удалось исправить ошибку, которая есть у некоторых изображений (рядом с линией экватора). По этой причине его ответ решил мою проблему, и он вставил изображение в лучшее положение, которое я ожидал в момент создания вопроса.
Однако, это решение работало со мной с изображениями рядом с линией экватора. Изображения рядом с полюсами остаются искаженными ( Изменить 2 ).
Я отправляю ниже картинку, иллюстрирующую конечный результат:
РЕДАКТИРОВАТЬ 2: Новая проблема?
Я тестировал некоторые изображения и обнаружил новую ошибку. Теперь я обнаружил, что изображение должно помещаться внутри ограничительной рамки. Если изображение не помещается внутри bbox, оно остается искаженным, например отпечаток, который я отправляю ниже для иллюстрации.
Изображение должно помещаться внутри коробки, как показано на рисунке ниже [PS 1] :
Я считаю, что это может быть проблемой перепроецирования, но я не знаю, потому что проекция вида и проекция изображения - это EPSG: 4326.
Я пытался следовать объяснению Raster Reprojection [1.] На сайте Openlayers, однако мне не удалось воспроизвести его, потому что, как я сказал, обе проекции (вид и изображение) одинаковы (или они должны быть ).
Я отправляю ниже GeoJSON, который содержит информацию, относящуюся к изображению выше. Изображение можно найти в «properties.icon» (http://www.dpi.inpe.br/newcatalog/tmp/MOD13Q1/2018/MOD13Q1.A2018017.h13v14.jpg).. Координаты bbox можно найти в «geometry.coordinates» или в «properties.bl_latitude», «properties.bl_longitude», «properties.br_latitude» и скоро.
«bl» означает «нижний левый», «br» означает «нижний правый», «tl» означает «верхний левый», а «tr» означает «верхний правый». Эти координаты внутри «свойств» одинаковы внутри «geometry.coordinates».
{
"geometry": {
"coordinates": [
[
[
-77.7862,
-50
],
[
-100,
-60
],
[
-80,
-60
],
[
-62.229,
-50
],
[
-77.7862,
-50
]
]
],
"type": "Polygon"
},
"properties": {
"alternate": "http://www.dpi.inpe.br/opensearch/v2/granule.json?uid=MOD13Q1.A2018017.h13v14",
"auxpath": null,
"bitslips": null,
"bl_latitude": -60,
"bl_longitude": -100,
"br_latitude": -60,
"br_longitude": -80,
"centerlatitude": -55,
"centerlongitude": -80.0038,
"centertime": null,
"cloud": 0,
"cloudcovermethod": "M",
"dataset": "MOD13Q1",
"date": "2018-01-17T00:00:00",
"enclosure": [
{
"band": "evi",
"radiometric_processing": "SR",
"type": "MOSAIC",
"url": "http://www.dpi.inpe.br/newcatalog/tmp/MOD13Q1/2018/MOD13Q1.A2018017.h13v14.006.2018033223827.hdf"
},
{
"band": "ndvi",
"radiometric_processing": "SR",
"type": "MOSAIC",
"url": "http://www.dpi.inpe.br/newcatalog/tmp/MOD13Q1/2018/MOD13Q1.A2018017.h13v14.006.2018033223827.hdf"
},
...
],
"icon": "http://www.dpi.inpe.br/newcatalog/tmp/MOD13Q1/2018/MOD13Q1.A2018017.h13v14.jpg",
"id": "http://www.dpi.inpe.br/opensearch/v2/granule.json?uid=MOD13Q1.A2018017.h13v14",
"orbit": 0,
"path": 14,
"provider": "OP_CBERS1",
"row": 13,
"satellite": "T1",
"sensor": "MODIS",
"title": "MOD13Q1.A2018017.h13v14",
"tl_latitude": -50,
"tl_longitude": -77.7862,
"tr_latitude": -50,
"tr_longitude": -62.229,
"type": "IMAGES",
"updated": "2018-03-01T18:51:56",
"via": "http://www.dpi.inpe.br/opensearch/v2/metadata/MOD13Q1.A2018017.h13v14"
},
"type": "Feature"
}
Будет ли у кого-нибудь новая идея?
[PS 1]: Исходный код, который соответствует изображению, помещается в bbox, это код Leaflet [2.], и я отправляю его ниже:
var map = L.map('map').setView([-15.22, -53.23], 5)
...
var anchor = [
[feature.properties.tl_latitude, feature.properties.tl_longitude],
[feature.properties.tr_latitude, feature.properties.tr_longitude],
[feature.properties.br_latitude, feature.properties.br_longitude],
[feature.properties.bl_latitude, feature.properties.bl_longitude]
]
layer._quicklook = L.imageTransform(feature.properties.icon, anchor).addTo(map)
[1.] https://openlayers.org/en/latest/doc/tutorials/raster-reprojection.html
[2.] https://github.com/ScanEx/Leaflet.imageTransform