如何将 'Weird' ESRI Tile XYZ 格式转换为 XYZ
How to convert 'Weird' ESRI Tile XYZ-Format to XYZ
我需要访问 Esri REST 服务,该服务具有奇怪的 XYZ 格式。例如:
在普通的 XYZ 服务上,z 为 14,而在此特定服务上,在相同高度上,z 为 8。
有人知道如何转换它们并在 OpenLayers 上使用“怪异”的吗?
这是“正常”服务:
...../15/17122/11081.png
这是“奇怪”的:
...../8/458/170
它们大致位于同一位置,高度相同。
它是 EPSG:25832 投影的自定义图块网格。
在 OpenLayers 中设置网格所需的设置可以在 https://karte.breitbandmessung.de/servertmp/rest/services/Mobilfunkversorgung/MonitoringPortal_DT_4G/Mapserver?f=pjson 中找到 只需要 origin
和 resolutions
,但包括范围将防止请求超出范围的图块 - xmax
的 fullExtent
似乎有点太小并且切断了国家的最东边,所以我根据 0 级 3 格宽
来弥补范围
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" href="https://openlayers.org/en/v6.4.3/css/ol.css" type="text/css">
<script src="https://openlayers.org/en/v6.4.3/build/ol.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.6.1/proj4.js"></script>
<style>
html, body, .map {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="map" class="map"></div>
<script>
proj4.defs("EPSG:25832", "+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs");
ol.proj.proj4.register(proj4);
var origin = [233184, 6120719];
var resolutions = [
1222.9948985513972,
611.4974492756991,
305.7487246378482,
152.87436231920458,
76.43718115960229,
38.21859057966118,
19.109295289886575,
9.5546476449433,
4.7773238224716374
];
//var extent = [280300, 5235800, 912300, 6106300];
var extent = [origin[0], origin[1] - 3 * 256 * resolutions[0], origin[0] + 3 * 256 * resolutions[0], origin[1]];
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM(),
}),
new ol.layer.Tile({
source: new ol.source.XYZ({
url: "https://karte.breitbandmessung.de/servertmp/rest/services/Mobilfunkversorgung/MonitoringPortal_DT_4G/Mapserver/tile/{z}/{y}/{x}",
projection: "EPSG:25832",
tileGrid: new ol.tilegrid.TileGrid({
origin: origin,
extent: extent,
resolutions: resolutions,
tileSize: [256, 256],
}),
}),
opacity: 0.5,
}),
],
view: new ol.View({
projection: "EPSG:25832",
})
});
map.getView().fit(extent);
</script>
</body>
</html>
我需要访问 Esri REST 服务,该服务具有奇怪的 XYZ 格式。例如:
在普通的 XYZ 服务上,z 为 14,而在此特定服务上,在相同高度上,z 为 8。
有人知道如何转换它们并在 OpenLayers 上使用“怪异”的吗?
这是“正常”服务:
...../15/17122/11081.png
这是“奇怪”的:
...../8/458/170
它们大致位于同一位置,高度相同。
它是 EPSG:25832 投影的自定义图块网格。
在 OpenLayers 中设置网格所需的设置可以在 https://karte.breitbandmessung.de/servertmp/rest/services/Mobilfunkversorgung/MonitoringPortal_DT_4G/Mapserver?f=pjson 中找到 只需要 origin
和 resolutions
,但包括范围将防止请求超出范围的图块 - xmax
的 fullExtent
似乎有点太小并且切断了国家的最东边,所以我根据 0 级 3 格宽
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<link rel="stylesheet" href="https://openlayers.org/en/v6.4.3/css/ol.css" type="text/css">
<script src="https://openlayers.org/en/v6.4.3/build/ol.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.6.1/proj4.js"></script>
<style>
html, body, .map {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
</style>
</head>
<body>
<div id="map" class="map"></div>
<script>
proj4.defs("EPSG:25832", "+proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs");
ol.proj.proj4.register(proj4);
var origin = [233184, 6120719];
var resolutions = [
1222.9948985513972,
611.4974492756991,
305.7487246378482,
152.87436231920458,
76.43718115960229,
38.21859057966118,
19.109295289886575,
9.5546476449433,
4.7773238224716374
];
//var extent = [280300, 5235800, 912300, 6106300];
var extent = [origin[0], origin[1] - 3 * 256 * resolutions[0], origin[0] + 3 * 256 * resolutions[0], origin[1]];
var map = new ol.Map({
target: 'map',
layers: [
new ol.layer.Tile({
source: new ol.source.OSM(),
}),
new ol.layer.Tile({
source: new ol.source.XYZ({
url: "https://karte.breitbandmessung.de/servertmp/rest/services/Mobilfunkversorgung/MonitoringPortal_DT_4G/Mapserver/tile/{z}/{y}/{x}",
projection: "EPSG:25832",
tileGrid: new ol.tilegrid.TileGrid({
origin: origin,
extent: extent,
resolutions: resolutions,
tileSize: [256, 256],
}),
}),
opacity: 0.5,
}),
],
view: new ol.View({
projection: "EPSG:25832",
})
});
map.getView().fit(extent);
</script>
</body>
</html>