本篇博客记录如何将osgb转为slpk并将其发成场景服务以及前端调用。
示例数据:
链接:https://pan.baidu.com/s/1bLOBKxNBIiqEHGD-62LiGw
提取码:enbz
1、osgb转为slpk
其中:
- Pro自带的create integreted mesh scene layer package工具;
- (适用于在arcgispro2.5的环境下运行)https://github.com/xinying180/slpkTools_1.7 ;
- (适用于在arcgispro2.6的环境下运行)https://github.com/xinying180/slpkTools_Pro2.6
这三个工具任意一个都支持坐标转换,例如:utm(32651)转为4326等。
2、发布场景服务
如果slpk不超过1g,可以直接在portal或者arcgisonline将本地的slpk进行加载和发布成场景服务
如果超过1g,可以使用arcgispro自带的share package(分享包)工具将其共享到portal或者arcgisonline。
3、前端调用倾斜摄影的场景服务
前端支持加载4326、3857和4490空间参考的倾斜摄影的场景服务;
如果是自定义坐标系,可以参考这个博客在前端调用自定义坐标系的三维场景服务,链接:http://zhihu.geoscene.cn/article/4030
如果是4326或者3857的,可以参照下述代码,能够成功的在前端加载4326或者3857的场景服务,同时可以显示在线底图。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<title>IntegratedMeshLayer - 4.15</title>
<link
rel="stylesheet"
href="https://js.arcgis.com/4.15/esri/themes/light/main.css"
/>
<script src="https://js.arcgis.com/4.15/"></script>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
#menu {
padding: 1em;
}
</style>
<script>
require([
"esri/Map",
"esri/views/SceneView",
"esri/layers/IntegratedMeshLayer"
], function (Map, SceneView, IntegratedMeshLayer) {
const layer = new IntegratedMeshLayer({
url:
"https://zjq161.esrichina.com/server/rest/services/Hosted/lixiannian/SceneServer"
});
var map = new Map({
basemap: "satellite",
ground: "world-elevation",
layers: [layer]
});
const view = new SceneView({
container: "viewDiv",
map: map
});
view.goTo({
center: [114.515214, 31.1510916],
heading: 10,
zoom: 19,
tilt: 45
});
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
如果是4490的场景服务,并且也需要在线底图的话,需要加载4490的在线底图才行,要不然只能加载显示4490的场景服务,底图不显示。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<title>IntegratedMeshLayer - 4.16</title>
<link
rel="stylesheet"
href="https://js.arcgis.com/4.16/esri/themes/light/main.css"
/>
<script src="https://js.arcgis.com/4.16/"></script>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
#menu {
padding: 1em;
}
</style>
<script>
require([
"esri/Map",
"esri/views/SceneView",
"esri/layers/IntegratedMeshLayer"
], function (Map, SceneView, IntegratedMeshLayer) {
const layer = new IntegratedMeshLayer({
url:
"https://zjq161.esrichina.com/server/rest/services/Hosted/lxn4490/SceneServer"
});
var map = new Map({
ground: "world-elevation",
layers: [layer]
});
const view = new SceneView({
container: "viewDiv",
map: map
});
view.goTo({
center: [114.515214, 31.1510916],
heading: 10,
zoom: 19,
tilt: 45
});
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
当倾斜摄影的场景服务和在线底图的空间参考都是4490时,底图才能显示。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<title>IntegratedMeshLayer - 4.16</title>
<link
rel="stylesheet"
href="https://js.arcgis.com/4.16/esri/themes/light/main.css"
/>
<script src="https://js.arcgis.com/4.16/"></script>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
#menu {
padding: 1em;
}
</style>
<script>
require([
"esri/Map",
"esri/views/SceneView",
"esri/layers/WebTileLayer",
"esri/layers/support/TileInfo",
"esri/layers/IntegratedMeshLayer"
], function (Map, SceneView, WebTileLayer, TileInfo, IntegratedMeshLayer) {
var tileInfo = new TileInfo({
dpi: 90.71428571427429,
rows: 256,
cols: 256,
compressionQuality: 0,
origin: {
x: -180,
y: 90
},
spatialReference: {
wkid: 4490
},
lods: [
{ level: 0, levelValue: 1, resolution: 0.703125, scale: 295497593.05875003 },
{ level: 1, levelValue: 2, resolution: 0.3515625, scale: 147748796.52937502 },
{ level: 2, levelValue: 3, resolution: 0.17578125, scale: 73874398.264687508 },
{ level: 3, levelValue: 4, resolution: 0.087890625, scale: 36937199.132343754 },
{ level: 4, levelValue: 5, resolution: 0.0439453125, scale: 18468599.566171877 },
{ level: 5, levelValue: 6, resolution: 0.02197265625, scale: 9234299.7830859385 },
{ level: 6, levelValue: 7, resolution: 0.010986328125, scale: 4617149.8915429693 },
{ level: 7, levelValue: 8, resolution: 0.0054931640625, scale: 2308574.9457714846 },
{ level: 8, levelValue: 9, resolution: 0.00274658203125, scale: 1154287.4728857423 },
{ level: 9, levelValue: 10, resolution: 0.001373291015625, scale: 577143.73644287116 },
{ level: 10, levelValue: 11, resolution: 0.0006866455078125, scale: 288571.86822143558 },
{ level: 11, levelValue: 12, resolution: 0.00034332275390625, scale: 144285.93411071779 },
{ level: 12, levelValue: 13, resolution: 0.000171661376953125, scale: 72142.967055358895 },
{ level: 13, levelValue: 14, resolution: 8.58306884765625e-005, scale: 36071.483527679447 },
{ level: 14, levelValue: 15, resolution: 4.291534423828125e-005, scale: 18035.741763839724 },
{ level: 15, levelValue: 16, resolution: 2.1457672119140625e-005, scale: 9017.8708819198619 },
{ level: 16, levelValue: 17, resolution: 1.0728836059570313e-005, scale: 4508.9354409599309 },
{ level: 17, levelValue: 18, resolution: 5.3644180297851563e-006, scale: 2254.4677204799655 },
{ level: 18, levelValue: 19, resolution: 2.68220901489257815e-006, scale: 1127.23386023998275 },
{ level: 19, levelValue: 20, resolution: 1.341104507446289075e-006, scale: 563.616930119991375 }
]
});
var tdtUrl = "http://{subDomain}.tianditu.com/vec_c/wmts?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=vec&STYLE=default&FORMAT=tiles&TILEMATRIXSET=c&TILEMATRIX={level}&TILEROW={row}&TILECOL={col}&tk=ac0daf56728bbb77d9514ba3df69bcd3"
//此处天地图的坐标系为CGCS2000
var tiledLayer = new WebTileLayer(tdtUrl, {
subDomains: ["t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"],
tileInfo: tileInfo,
spatialReference: { wkid: 4490 },//重点在这一句,如果不指定,那么默认为102100,在前端就会报坐标系的错误
fullExtent: {
xmin: -180,
ymin: -90,
xmax: 180,
ymax: 90,
spatialReference: 4490
}
});
const layer = new IntegratedMeshLayer({
url:
"https://zjq161.esrichina.com/server/rest/services/Hosted/lxn4490/SceneServer"
});
var map = new Map({
basemap: {
baseLayers: [tiledLayer]
},
ground: "world-elevation",
layers: [layer]
});
const view = new SceneView({
container: "viewDiv",
map: map
});
view.goTo({
center: [114.515214, 31.1510916],
heading: 10,
zoom: 19,
tilt: 45
});
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
参考资料:
https://blog.csdn.net/weixin_44616652/article/details/107532608
https://developers.arcgis.com/javascript/latest/sample-code/layers-integratedmeshlayer/index.html
更多gis方面的内容,请关注微信公众号:gislaozhang