我正在尝试使用 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:迈克的解决方案
通过 Mike 的解决方案,我能够修复一些图像存在的错误(靠近赤道线)。出于这个原因,他的回答解决了我的问题,并将图像插入到我在创建问题时所期望的更好位置。
然而,这个解决方案对我来说适用于赤道线附近的图像。两极旁边的图像保持扭曲(编辑 2)。
我在下面发送了一张说明最终结果的图片:
编辑2:新问题?
我正在测试一些图像,我发现了一个新错误。现在我发现图像应该适合边界框。如果图像不适合 bbox,它会保持失真,例如我在下面发送的打印说明。
该图像应适合 bbox 内,如下图[PS 1]所示:
我相信这可能是重投影的问题,但我不知道,因为视图投影和图像投影都是EPSG:4326。
我试图按照 Openlayers 网站上关于 Raster Reprojection[1.] 的解释进行操作,但是我无法重现它,因为正如我所说,两个投影(视图和图像)是相同的(或者它们应该是相同的)。
我在包含与上图相关信息的 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”表示“右上”。“properties”中的这些坐标在“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 的原始代码是传单代码 [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