Skip to content

Commit 08bcefe

Browse files
author
潘卓然-中地数码台式机
committed
补充mapboxgl的地图整饰功能&threejs三维模型示例及其说明
1 parent 0de6c37 commit 08bcefe

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+66151
-953
lines changed

config/config-mapboxgl.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,12 +178,20 @@ var config = {
178178
update: "最后更新时间:2018-06-13"
179179
},
180180
{
181-
name: "layersearch",
181+
name: "图层探查",
182182
file: "layersearch",
183183
diffcult: "3",
184184
detail: "",
185185
icon: "layersearch.png",
186186
update: "最后更新时间:2018-06-13"
187+
},
188+
{
189+
name: "地图整饰",
190+
file: "customprint",
191+
diffcult: "3",
192+
detail: "地图整饰打印输出",
193+
icon: "customprint.png",
194+
update: "最后更新时间:2018-12-27"
187195
}
188196
]
189197
},

demo/mapbox/example/dataview/threebox/model.htm

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
container: 'map',
3434
style: 'mapbox://styles/mapbox/light-v9',
3535
center: origin,
36-
zoom: 18,
36+
zoom: 20,
3737
pitch: 60,
3838
heading: 41,
3939
hash: true
@@ -46,20 +46,20 @@
4646
id: 'custom_layer',
4747
type: 'custom',
4848
onAdd: function (map, mbxContext) {
49-
5049
window.threebox = new Threebox(map, mbxContext);
5150
threebox.setupDefaultLights();
5251

5352
var loader = new THREE.GLTFLoader();
5453

55-
loader.load('../../data/model/threebox/34M_17.gltf', (function (gltf) {
54+
loader.load('../../data/model/cesium/GroundVehicle/GroundVehicle.glb', (
55+
function (gltf) {
5656

57-
// rotate object so it's sitting on its base
58-
gltf.scene.rotation.x = -Math.PI * 1.5
57+
// rotate object so it's sitting on its base
58+
gltf.scene.rotation.x = -Math.PI * 1.5
5959

60-
threebox.addAtCoordinate(gltf.scene, origin);
60+
threebox.addAtCoordinate(gltf.scene, origin);
6161

62-
}).bind(this));
62+
}).bind(this));
6363

6464
},
6565
render: function (gl, matrix) {
Lines changed: 300 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,300 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Mapbox GL JS debug page</title>
5+
<meta charset="utf-8" />
6+
<meta
7+
name="viewport"
8+
content="width=device-width, initial-scale=1.0, user-scalable=no"
9+
/>
10+
<script
11+
include="filesaver,draw,domtoimage"
12+
src="../../libs/zondyclient/include-mapboxgl-local.js"
13+
></script>
14+
<style>
15+
body {
16+
margin: 0;
17+
padding: 0;
18+
}
19+
20+
html,
21+
body,
22+
#map {
23+
height: 99%;
24+
}
25+
</style>
26+
</head>
27+
28+
<body>
29+
<div class="ToolLib" onclick="rectAngle()">
30+
<input type="button" class="ButtonLib" id="export-png" value="拉框选择" />
31+
</div>
32+
<div id="map"></div>
33+
<script>
34+
var extent = {}; //地图范围
35+
var scale; //比例尺
36+
var extent_km = 111.319490793274; //在经线上,相差一纬度约111km
37+
var extent_km_lat; //在纬线上,相差一经度约111cosα(α该纬线纬度),1KM就是该纬线应约1/(111*cosα)=0.009cosα度,度数纬度关,这样就是1公里对应的纬线度数。
38+
39+
function rectAngle() {
40+
draw.changeMode("draw_rectangle");
41+
}
42+
43+
/**
44+
* 将获取的图片路径转成blob
45+
* @param dataURI
46+
* @returns {*}
47+
* @private
48+
*/
49+
function _dataURItoBlob(dataURI) {
50+
var byteString = atob(dataURI.split(",")[1]);
51+
var mimeString = dataURI
52+
.split(",")[0]
53+
.split(":")[1]
54+
.split(";")[0];
55+
var ab = new ArrayBuffer(byteString.length);
56+
var dw = new DataView(ab);
57+
for (var i = 0; i < byteString.length; i++) {
58+
dw.setUint8(i, byteString.charCodeAt(i));
59+
}
60+
return new Blob([ab], {
61+
type: mimeString
62+
});
63+
}
64+
65+
/**
66+
* 获取建议的比例尺,比例尺也可以自己设置
67+
*/
68+
function getRecommendScale() {
69+
var x_min = extent.xmin;
70+
var y_min = extent.ymin;
71+
var x_max = extent.xmax;
72+
var y_max = extent.ymax;
73+
var map_width = (x_max - x_min) * extent_km * 1000 * 1000; //宽度 从 度单位 换算成 毫米单位
74+
var map_height = (y_max - y_min) * extent_km * 1000 * 1000; //高度 从 度单位 换算成 毫米单位
75+
var paper_width = 297; //纸张宽度,默认为横版A4大小 毫米
76+
var paper_height = 210; //纸张高度,默认为横版A4大小 毫米
77+
var r_scale =
78+
map_width / paper_width > map_height / paper_height
79+
? Math.ceil(map_width / paper_width)
80+
: Math.ceil(map_height / paper_height);
81+
var log10 = r_scale.toString().length - 1;
82+
var pow10 = Math.pow(10, log10);
83+
scale = Math.ceil(r_scale / pow10) * pow10; //直接使用推荐的比例尺
84+
console.log(r_scale, log10, pow10, scale); //66400 4 10000 70000
85+
}
86+
87+
/**
88+
* 获取输出版面坐标范围,默认以横版A4大小输出
89+
* @returns {{}}
90+
*/
91+
function layoutSetting() {
92+
var x_min = extent.xmin;
93+
var y_min = extent.ymin;
94+
var x_max = extent.xmax;
95+
var y_max = extent.ymax;
96+
//地图实际宽度
97+
var map_width = (x_max - x_min) * extent_km * 1000 * 1000;
98+
//地图实际高度
99+
var map_height = (y_max - y_min) * extent_km * 1000 * 1000;
100+
//纸张宽度,默认为横版A4大小
101+
var paper_width = 297;
102+
//纸张高度,默认为横版A4大小
103+
var paper_height = 210;
104+
//根据比例尺调整后的地图宽度(mm)
105+
var scale_map_width = Math.round(map_width / scale);
106+
//根据比例尺调整后的地图高度(mm)
107+
var scale_map_height = Math.round(map_height / scale);
108+
109+
//纸张与地图的宽度差值
110+
var differ_width_val = (paper_width - scale_map_width) / 2;
111+
//纸张与地图的高度差值
112+
var differ_height_val = (paper_height - scale_map_height) / 2;
113+
114+
var differ_x_extent =
115+
(differ_width_val * scale) / 1000 / 1000 / this.extent_km; //毫米 换算成 度
116+
var differ_y_extent =
117+
(differ_height_val * scale) / 1000 / 1000 / this.extent_km; //毫米 换算成 度
118+
//版面的左上角x坐标
119+
var layout_l_x = x_min - differ_x_extent;
120+
//版面的左上角y坐标
121+
var layout_l_y = y_max + differ_y_extent;
122+
//版面的右下角x坐标
123+
var layout_r_x = x_max + differ_x_extent;
124+
//版面的右下角y坐标
125+
var layout_r_y = y_min - differ_y_extent;
126+
127+
//输出版面范围
128+
// var bounds = [[layout_l_y, layout_l_x], [layout_r_y, layout_r_x]];
129+
// var Rectangle = L.rectangle(bounds, {
130+
// color: '#ffcc33',
131+
// weight: 2,
132+
// fillColor: 'rgba(255, 255, 255, 0)'
133+
// });
134+
// Rectangle.name = "layoutSetting";
135+
// Rectangle.addTo(map);
136+
var layExtent = {};
137+
layExtent.xmin = layout_l_x;
138+
layExtent.ymin = layout_r_y;
139+
layExtent.xmax = layout_r_x;
140+
layExtent.ymax = layout_l_y;
141+
return layExtent;
142+
}
143+
144+
mapboxgl.accessToken =
145+
"pk.eyJ1Ijoid29ya2luZ2RvZyIsImEiOiJjamQyZmszenczMHRoMzRuczVzaGthbGhnIn0.HTkYTE-R82N3azqscSyHkA";
146+
var osm = {
147+
//来源类型为栅格瓦片
148+
type: "raster",
149+
tiles: [
150+
//来源请求地址
151+
"http://c.tile.openstreetmap.org/{z}/{x}/{y}.png"
152+
],
153+
//栅格瓦片的分辨率
154+
tileSize: 256
155+
};
156+
157+
var map = new mapboxgl.Map({
158+
container: "map",
159+
zoom: 10,
160+
center: [114.514426, 30.562984],
161+
style: "mapbox://styles/mapbox/streets-v9",
162+
preserveDrawingBuffer: true //特别注意,打印的时候必须启动该配置项
163+
});
164+
165+
var modes = MapboxDraw.modes;
166+
modes.draw_rectangle = DrawRectangle.default;
167+
var draw = new MapboxDraw({
168+
modes: modes,
169+
displayControlsDefault: false,
170+
controls: {
171+
polygon: false,
172+
trash: false
173+
}
174+
});
175+
176+
map.addControl(draw);
177+
178+
map.on("draw.create", function(e) {
179+
draw.deleteAll();
180+
181+
var width_extent_map = 9;
182+
var height_extent_map = 10;
183+
var width_extent_layer = 7;
184+
var height_extent_layer = 8;
185+
186+
if (e.features.length <= 0 || e.features[0].geometry.coordinates <= 0) {
187+
draw.deleteAll();
188+
return;
189+
}
190+
191+
var point = e.features[0].geometry.coordinates[0][0];
192+
193+
var xmin = point[0],
194+
xmax = point[0],
195+
ymin = point[1],
196+
ymax = point[1];
197+
198+
e.features[0].geometry.coordinates[0].forEach(element => {
199+
if (element[0] <= xmin) xmin = element[0];
200+
if (element[0] >= xmax) xmax = element[0];
201+
if (element[1] <= ymin) ymin = element[1];
202+
if (element[1] >= ymax) ymax = element[1];
203+
});
204+
205+
extent.xmin = xmin;
206+
extent.ymin = ymin;
207+
extent.xmax = xmax;
208+
extent.ymax = ymax;
209+
210+
getRecommendScale();
211+
212+
var a1 = map.project(new mapboxgl.LngLat(xmin, ymax));
213+
var a4 = map.project(new mapboxgl.LngLat(xmax, ymin));
214+
215+
var mapBounds = map.getBounds();
216+
var lefttop = new mapboxgl.LngLat(mapBounds._sw.lng, mapBounds._ne.lat);
217+
var mapLeftTopPoint = map.project(lefttop);
218+
219+
var startPointX = mapLeftTopPoint.x - a1.x - 7; //得到一个负数
220+
var startPointY = mapLeftTopPoint.y - a1.y - 7; //得到一个负数
221+
222+
var mapParams = {};
223+
mapParams.width = parseInt(a4.x - mapLeftTopPoint.x + width_extent_map); //
224+
mapParams.height = parseInt(
225+
a4.y - mapLeftTopPoint.y + height_extent_map
226+
);
227+
mapParams.startPointX = startPointX; // ?
228+
mapParams.startPointY = startPointY; // ?
229+
230+
var layExtent = layoutSetting(); //获取根据比例尺调整后的版面范围
231+
232+
var b1 = map.project(
233+
new mapboxgl.LngLat(layExtent.xmin, layExtent.ymax)
234+
); //左上
235+
var b4 = map.project(
236+
new mapboxgl.LngLat(layExtent.xmax, layExtent.ymin)
237+
); //右下
238+
239+
var laystartPointX = mapLeftTopPoint.x - b1.x - 9;
240+
var laystartPointY = mapLeftTopPoint.y - b1.y - 9;
241+
242+
var layParams = {};
243+
layParams.width = parseInt(
244+
b4.x - mapLeftTopPoint.x + width_extent_layer
245+
); //输出地图版面宽
246+
layParams.height = parseInt(
247+
b4.y - mapLeftTopPoint.y + height_extent_layer
248+
); //输出地图版面高
249+
layParams.startPointX = laystartPointX; //输出地图版面的x像素坐标
250+
layParams.startPointY = laystartPointY; //输出地图版面的y像素坐标
251+
252+
//以下参数都是在有layParams的前提下,位置已设置为固定
253+
var mapFrameStyleParams = {};
254+
mapFrameStyleParams.strokeStyle = "black"; //图像的边框线颜色
255+
mapFrameStyleParams.lineWidth = 2;
256+
257+
var titleParams = {};
258+
titleParams.font = "30px 微软雅黑";
259+
titleParams.textAlign = "center";
260+
titleParams.textBaseline = "bottom";
261+
titleParams.text = "地图标题";
262+
263+
var leftTextParams = {};
264+
leftTextParams.font = "15px 微软雅黑";
265+
leftTextParams.textAlign = "left";
266+
leftTextParams.textBaseline = "top";
267+
leftTextParams.text = "左下角文字";
268+
269+
var rightTextParams = {};
270+
rightTextParams.font = "15px 微软雅黑";
271+
rightTextParams.textAlign = "right";
272+
rightTextParams.textBaseline = "top";
273+
rightTextParams.text = "右下角文字";
274+
275+
//width和height为必须参数,其他参数为可选参数(扩展参数)
276+
setTimeout(function() {
277+
domtoimage
278+
.toPng(map.getCanvas(), {
279+
width: mapParams.width, //输出地图内容的宽
280+
height: mapParams.height, //输出地图内容的高
281+
startPointX: mapParams.startPointX, //输出地图内容左上角x像素坐标
282+
startPointY: mapParams.startPointY, //输出地图内容左上角y像素坐标
283+
layParams: layParams, //输出版面参数
284+
mapFrameStyleParams: mapFrameStyleParams, //图框参数
285+
titleParams: titleParams, //标题参数
286+
leftTextParams: leftTextParams, //左下角文字参数
287+
rightTextParams: rightTextParams //右下角文字参数
288+
})
289+
.then(function(dataUrl) {
290+
var blob = _dataURItoBlob(dataUrl);
291+
saveAs(blob, "map.png");
292+
})
293+
.catch(function(err) {
294+
console.log(err);
295+
});
296+
}, 500);
297+
});
298+
</script>
299+
</body>
300+
</html>
32.3 KB
Loading
183 KB
Loading

libs/zondyclient/cdn/dom-to-image.js renamed to libs/zondyclient/cdn/dom-to-image/dom-to-image.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,7 @@
513513

514514
function makeImage(uri) {
515515
return new Promise(function (resolve, reject) {
516+
//console.log("makeImage", resolve, reject)
516517
var image = new Image();
517518
image.onload = function () {
518519
resolve(image);

libs/zondyclient/cdn/mapboxgl-plugins/mapbox-gl-draw-mode/rectangle/index.js

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy