1+ <!DOCTYPE html>
2+ < html xmlns ="http://www.w3.org/1999/xhtml ">
3+ < head >
4+ < meta http-equiv ="Content-Type " content ="text/html; charset=utf-8 "/>
5+ < title > 导出成图片</ title >
6+ < script include ="filesaver,draw,domtoimage "
7+ src ="../../libs/zondyclient/include-leaflet-local.js "> </ script >
8+ < style >
9+ body {
10+ height : 700px ;
11+ }
12+ </ style >
13+ < script type ="text/javascript ">
14+ //定义地图
15+ var map ;
16+ var extent = { } ; //地图范围
17+ var scale ; //比例尺
18+ var extent_km = 111.319490793274 ;
19+ /**初始化地图显示
20+ */
21+ function init ( ) {
22+ //地图容器
23+ map = L . map ( 'leaf_map' , {
24+ //参考坐标系
25+ crs : L . CRS . EPSG3857 ,
26+ //显示中心
27+ center : [ 40 , 116.3 ] ,
28+ //最小显示等级
29+ minZoom : 0 ,
30+ //最大显示等级
31+ maxZoom : 16 ,
32+ //当前显示等级
33+ zoom : 12
34+ } ) ;
35+ //加载瓦片图层数据(OSM)
36+ var tiles = L . tileLayer ( 'http://{s}.tile.osm.org/{z}/{x}/{y}.png' , {
37+ //只显示一个图层,不平铺显示
38+ noWrap : true
39+ } ) . addTo ( map ) ;
40+
41+ //添加绘制图层
42+ var drawnItems = new L . FeatureGroup ( ) ;
43+ map . addLayer ( drawnItems ) ;
44+ //添加绘制控件
45+ var drawControl = new L . Control . Draw ( {
46+ draw : {
47+ //绘制线
48+ polyline : false ,
49+ //绘制多边形
50+ polygon : false ,
51+ //绘制矩形
52+ rectangle : true ,
53+ //绘制圆
54+ circle : false ,
55+ //绘制标注
56+ marker : false ,
57+ //绘制圆形标注
58+ circlemarker : false
59+ }
60+ } ) ;
61+ //添加绘制控件
62+ map . addControl ( drawControl ) ;
63+ //绘制事件
64+ map . on ( L . Draw . Event . CREATED , function ( e ) {
65+
66+ var bounds = e . layer . _bounds ;
67+ //地图边框,已放入绘制接口(dom-to-image)中绘制
68+ // var Rectangle = L.rectangle(bounds, {
69+ // color: '#000',
70+ // weight: 1,
71+ // fillColor: 'rgba(255, 255, 255, 0)'
72+ // }).addTo(map);
73+ // Rectangle.name = "MapFrame";
74+ extent . xmin = bounds . _southWest . lng ;
75+ extent . ymin = bounds . _southWest . lat ;
76+ extent . xmax = bounds . _northEast . lng ;
77+ extent . ymax = bounds . _northEast . lat ;
78+
79+ getRecommendScale ( ) ;
80+
81+ var a1 = map . options . crs . latLngToPoint ( L . latLng ( bounds . _northEast . lat , bounds . _southWest . lng ) , map . getZoom ( ) ) ; //左上
82+ var a4 = map . options . crs . latLngToPoint ( L . latLng ( bounds . _southWest . lat , bounds . _northEast . lng ) , map . getZoom ( ) ) ; //右下
83+ var mapBounds = map . getBounds ( ) ;
84+ var mapLeftTopPoint = map . options . crs . latLngToPoint ( L . latLng ( mapBounds . _northEast . lat , mapBounds . _southWest . lng ) , map . getZoom ( ) ) ;
85+ var startPointX = mapLeftTopPoint . x - a1 . x - 7 ;
86+ var startPointY = mapLeftTopPoint . y - a1 . y - 7 ;
87+ var mapParams = { } ;
88+ mapParams . width = parseInt ( a4 . x - mapLeftTopPoint . x + 9 ) ;
89+ mapParams . height = parseInt ( a4 . y - mapLeftTopPoint . y + 10 ) ;
90+ mapParams . startPointX = startPointX ;
91+ mapParams . startPointY = startPointY ;
92+
93+ var layExtent = layoutSetting ( ) ;
94+ var laya1 = map . options . crs . latLngToPoint ( L . latLng ( layExtent . ymax , layExtent . xmin ) , map . getZoom ( ) ) ; //左上
95+ var laya4 = map . options . crs . latLngToPoint ( L . latLng ( layExtent . ymin , layExtent . xmax ) , map . getZoom ( ) ) ; //右下
96+ var laystartPointX = mapLeftTopPoint . x - laya1 . x - 9 ;
97+ var laystartPointY = mapLeftTopPoint . y - laya1 . y - 9 ;
98+
99+ var layParams = { } ;
100+ layParams . width = parseInt ( laya4 . x - mapLeftTopPoint . x + 7 ) ; //输出地图版面宽
101+ layParams . height = parseInt ( laya4 . y - mapLeftTopPoint . y + 8 ) ; //输出地图版面高
102+ layParams . startPointX = laystartPointX ; //输出地图版面的x像素坐标
103+ layParams . startPointY = laystartPointY ; //输出地图版面的y像素坐标
104+
105+ //以下参数都是在有layParams的前提下,位置已设置为固定
106+ var mapFrameStyleParams = { } ;
107+ mapFrameStyleParams . strokeStyle = "black" ; //图像的边框线颜色
108+ mapFrameStyleParams . lineWidth = 2 ;
109+
110+ var titleParams = { } ;
111+ titleParams . font = '30px 微软雅黑' ;
112+ titleParams . textAlign = 'center' ;
113+ titleParams . textBaseline = 'bottom' ;
114+ titleParams . text = '地图标题' ;
115+
116+ var leftTextParams = { } ;
117+ leftTextParams . font = '15px 微软雅黑' ;
118+ leftTextParams . textAlign = 'left' ;
119+ leftTextParams . textBaseline = 'top' ;
120+ leftTextParams . text = '左下角文字' ;
121+
122+ var rightTextParams = { } ;
123+ rightTextParams . font = '15px 微软雅黑' ;
124+ rightTextParams . textAlign = 'right' ;
125+ rightTextParams . textBaseline = 'top' ;
126+ rightTextParams . text = '右下角文字' ;
127+
128+ //width和height为必须参数,其他参数为可选参数(扩展参数)
129+ domtoimage . toPng ( map . getContainer ( ) , {
130+ width : mapParams . width , //输出地图内容的宽
131+ height : mapParams . height , //输出地图内容的高
132+ startPointX : mapParams . startPointX , //输出地图内容左上角x像素坐标
133+ startPointY : mapParams . startPointY , //输出地图内容左上角y像素坐标
134+ layParams : layParams , //输出版面参数
135+ mapFrameStyleParams : mapFrameStyleParams , //图框参数
136+ titleParams : titleParams , //标题参数
137+ leftTextParams : leftTextParams , //左下角文字参数
138+ rightTextParams : rightTextParams //右下角文字参数
139+ } ) . then ( function ( dataUrl ) {
140+ var blob = _dataURItoBlob ( dataUrl ) ;
141+ saveAs ( blob , 'map.png' ) ;
142+ } ) ;
143+ } ) ;
144+ }
145+
146+ /**
147+ * 将获取的图片路径转成blob
148+ * @param dataURI
149+ * @returns {* }
150+ * @private
151+ */
152+ function _dataURItoBlob ( dataURI ) {
153+ var byteString = atob ( dataURI . split ( ',' ) [ 1 ] ) ;
154+ var mimeString = dataURI . split ( ',' ) [ 0 ] . split ( ':' ) [ 1 ] . split ( ';' ) [ 0 ] ;
155+ var ab = new ArrayBuffer ( byteString . length ) ;
156+ var dw = new DataView ( ab ) ;
157+ for ( var i = 0 ; i < byteString . length ; i ++ ) {
158+ dw . setUint8 ( i , byteString . charCodeAt ( i ) ) ;
159+ }
160+ return new Blob ( [ ab ] , { type : mimeString } ) ;
161+ }
162+
163+ /**
164+ * 获取建议的比例尺,比例尺也可以自己设置
165+ */
166+ function getRecommendScale ( ) {
167+ var x_min = extent . xmin ;
168+ var y_min = extent . ymin ;
169+ var x_max = extent . xmax ;
170+ var y_max = extent . ymax ;
171+ var map_width = ( x_max - x_min ) * extent_km * 1000 * 1000 ;
172+ var map_height = ( y_max - y_min ) * extent_km * 1000 * 1000 ;
173+ //纸张宽度,默认为横版A4大小
174+ var paper_width = 297 ;
175+ //纸张高度,默认为横版A4大小
176+ var paper_height = 210 ;
177+ var r_scale = ( map_width / paper_width ) > ( map_height / paper_height ) ? Math . ceil ( map_width / paper_width ) : Math . ceil ( map_height / paper_height ) ;
178+ var log10 = r_scale . toString ( ) . length - 1 ;
179+ var pow10 = Math . pow ( 10 , log10 ) ;
180+ scale = Math . ceil ( r_scale / pow10 ) * pow10 ; //直接使用推荐的比例尺
181+ }
182+
183+ /**
184+ * 获取输出版面坐标范围,默认以横版A4大小输出
185+ * @returns {{} }
186+ */
187+ function layoutSetting ( ) {
188+ var x_min = extent . xmin ;
189+ var y_min = extent . ymin ;
190+ var x_max = extent . xmax ;
191+ var y_max = extent . ymax ;
192+ //地图实际宽度
193+ var map_width = ( x_max - x_min ) * extent_km * 1000 * 1000 ;
194+ //地图实际高度
195+ var map_height = ( y_max - y_min ) * extent_km * 1000 * 1000 ;
196+ //纸张宽度,默认为横版A4大小
197+ var paper_width = 297 ;
198+ //纸张高度,默认为横版A4大小
199+ var paper_height = 210 ;
200+ //根据比例尺调整后的地图宽度(mm)
201+ var scale_map_width = Math . round ( map_width / scale ) ;
202+ //根据比例尺调整后的地图高度(mm)
203+ var scale_map_height = Math . round ( map_height / scale ) ;
204+ //纸张与地图的宽度差值
205+ var differ_width_val = ( paper_width - scale_map_width ) / 2 ;
206+ //纸张与地图的高度差值
207+ var differ_height_val = ( paper_height - scale_map_height ) / 2 ;
208+ var differ_x_extent = differ_width_val * scale / 1000 / 1000 / this . extent_km ;
209+ var differ_y_extent = differ_height_val * scale / 1000 / 1000 / this . extent_km ;
210+ //版面的左上角x坐标
211+ var layout_l_x = x_min - differ_x_extent ;
212+ //版面的左上角y坐标
213+ var layout_l_y = y_max + differ_y_extent ;
214+ //版面的右下角x坐标
215+ var layout_r_x = x_max + differ_x_extent ;
216+ //版面的右下角y坐标
217+ var layout_r_y = y_min - differ_y_extent ;
218+
219+ //输出版面范围
220+ // var bounds = [[layout_l_y, layout_l_x], [layout_r_y, layout_r_x]];
221+ // var Rectangle = L.rectangle(bounds, {
222+ // color: '#ffcc33',
223+ // weight: 2,
224+ // fillColor: 'rgba(255, 255, 255, 0)'
225+ // });
226+ // Rectangle.name = "layoutSetting";
227+ // Rectangle.addTo(map);
228+ var layExtent = { } ;
229+ layExtent . xmin = layout_l_x ;
230+ layExtent . ymin = layout_r_y ;
231+ layExtent . xmax = layout_r_x ;
232+ layExtent . ymax = layout_l_y ;
233+ return layExtent ;
234+ }
235+ </ script >
236+ </ head >
237+ < body onload ="init() ">
238+ < div id ="leaf_map " style ="width: 100%; height: 95%;position: absolute ">
239+ </ div >
240+ </ body >
241+ </ html >
0 commit comments