`
蓝色飞扬
  • 浏览: 94936 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

web GIS地图打印

阅读更多

最近做了个小的功能,关于web GIS的地图打印功能,最终页就是将信息生成pdf

整个流程如下:

1、在上侧的工具栏中添加一个打印按钮,如下图

2、单击打印按钮,弹出打印设置对话框,设置打印信息,标题,纸张大小,图标,

比例尺这一项没有用上,使用的是当前的地图比例尺,其中纸张大小,图标使用的是自定义标签从数据库中读取出来

3、点击OK按钮后打印对话框关闭,使用鼠标右键画框选定需要打印的区域。

 

4、换框完毕松开鼠标右键弹出pdf预览对话框。.

1、打印设置对话框就是open一个print.jsp

2、在关闭的时候调用父窗体对象中的方法,将所填信息传递给父窗体,这里的父窗体就是显示地图的jsp页面map.jsp.

使用var parentObj = window.dialogArguments;获得模式对话框的父窗体对象,

然后调用js方法

parentObj.selectPrintMap(title,scale,width,height,imgname);

title:地图标题    scale:比例尺

width:纸张宽度    height:纸张高度    imgname:图片名称

this.close();

3、画框选定地图调用了OpenLayers框架中的方法,OpenLayers原本只有拉框放大,拉框缩小地图,这里我小小的修改了一下OpenLayers.js中的代码

调用过程关键代码

 .map.jsp

function selectPrintMap(ptitle,scale,width,height,imgname){

       g_mapPanel.toggleControl("s_print");

}

// g_mapPanel是在另一个js中的地图面板对象。

 

Core.js:

else if(Tools=="s_print"){

    ZoomBoxPrint = new OpenLayers.Control.ZoomBox({out:"print"});

     panelPrint = new OpenLayers.Control.Panel({defaultControl: ZoomBoxPrint});

 panelPrint.addControls([ZoomBoxPrint]);

this.map.addControl(panelPrint);

panelPrint.destroy();

return ;

}

//这段代码是new一些拉框需要的控件

 

OpenLayers.js

OpenLayers.Control.ZoomBox=OpenLayers.Class(

OpenLayers.Control,

{

    type:OpenLayers.Control.TYPE_TOOL,out:"zo",

    draw:function(){this.handler=new OpenLayers.Handler.Box(this,{done:this.zoomBox},{keyMask:this.keyMask});},

    zoomBox:function(position){

       if(position instanceof OpenLayers.Bounds){

           if(this.out == "zo"){

              var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));

              var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));

              var bounds=new OpenLayers.Bounds(minXY.lon,minXY.lat,maxXY.lon,maxXY.lat);

              this.map.zoomToExtent(bounds);

           }else if(this.out == "zi"){

              var pixWidth=Math.abs(position.right-position.left);

              var pixHeight=Math.abs(position.top-position.bottom);

              var zoomFactor=Math.min((this.map.size.h/pixHeight),(this.map.size.w/pixWidth));

              var extent=this.map.getExtent();

              var center=this.map.getLonLatFromPixel(position.getCenterPixel());

              var xmin=center.lon-(extent.getWidth()/2)*zoomFactor;

              var xmax=center.lon+(extent.getWidth()/2)*zoomFactor;

              var ymin=center.lat-(extent.getHeight()/2)*zoomFactor;

              var ymax=center.lat+(extent.getHeight()/2)*zoomFactor;

              var bounds=new OpenLayers.Bounds(xmin,ymin,xmax,ymax);

              this.map.zoomToExtent(bounds);

           }else{

             

              var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));

              var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));

              printPreview(minXY,maxXY);

           }

       }else{

           if(this.out == "zo"){

              this.map.setCenter(this.map.getLonLatFromPixel(position),this.map.getZoom()+1);

           }else if(this.out == "zi"){

              this.map.setCenter(this.map.getLonLatFromPixel(position),this.map.getZoom()-1);

           }

       }

    },

    CLASS_NAME:"OpenLayers.Control.ZoomBox"

    });

// out="zo",表示拉框放大,out="zi",表示拉框缩小,out="print"就表示拉框选定要打印的地图区域,不对地图缩小或放大。OpenLayers源码中outtrue或者false,我改动的也就是这个地方

 

当为拉框选区完毕松开鼠标右键时需要获取矩形框左下角最小点坐标对象 minXY,右上角最大点坐标对象:maxXY,传递给map.jsp中的printPreview(minXY,maxXY)方法

else{

var minXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.left,position.bottom));

var maxXY=this.map.getLonLatFromPixel(new OpenLayers.Pixel(position.right,position.top));

printPreview(minXY,maxXY);

}

 

 

 

4printPreview(minXY,maxXY)这个方法比较关键,来分析一下代码:

因为后台生成pdf的长宽大小单位为像素,打印跟像素也有一定关系,所以这里把一些数值转换成了像素长度。

function printPreview(minXY,maxXY){

       var table_names = "${dataSet}_DATA."+"${tableName}".split(":")[1].split("_")[0]+","+m_inMapLayer;

       var map_scale = g_mapPanel.map.getScale();//当前地图的比例尺

       var p_layers = "";//所有的图层

       var screenPix = Math.round(window.screen.deviceXDPI / 2.54 * 10) / 10;//屏幕像素(像素/厘米)

       if(layers_list == "")

           p_layers = "${tableName}";

       else p_layers = "${tableName},"+layers_list;

       var map_width = maxXY.lon - minXY.lon;//选定区域的地图的实际宽

       var map_height = maxXY.lat - minXY.lat; //选定区域的地图的实际高

       var p_map_width = Math.round((1 / map_scale) * map_width * 1000);//根据比例尺得出图上宽度

       var p_map_height = Math.round((1 / map_scale) * map_height * 1000);// 根据比例尺得出图上高度

       var pix_map_width = Math.round(p_map_width / 10 * screenPix);// 将图上宽度转换为像素单位     var pix_map_height = Math.round(p_map_height / 10 * screenPix);// 将图上高度转换为像素单位

       var pix_width = Math.round(p_width / 10 * screenPix);//纸张的像素宽     var pix_height = Math.round(p_height / 10 * screenPix);// 纸张的像素高

       var url = g_geoserver+"/wms?bbox="+minXY.lon+","+minXY.lat+","+maxXY.lon+","+maxXY.lat+"||styles=||Format=image/png||request=GetMap||version=1.1.1||layers="+p_layers+"||width="+pix_map_width+"||height="+pix_map_height+"||srs=EPSG:${EPSG}";//选定区域的地图图片路径,通过请求geoServer

       var url2 = "${cpath}/webgis/WebGisAction.do?act=print&cpath=${urlPath}&title="+p_title+"&scale=1 : "+p_scale+"&width="+pix_width+"&height="+pix_height+"&mapWidth="+map_width+"&mapHeight="+map_height+"&imgname="+p_imgname+"&realPath=${realPath}&imgUrl="+url;//将一系列参数传递至actionaction转发至printPreview.jsp

       var ar = new Array();

        ar[0] = url2;

        ar[1] = window;

        showModalDialog("${cpath}/common/popinput.htm",ar,"resizable:yes;scroll:yes;dialogHeight:800px;dialogWidth:900px;center=yes");

//打开对话框显示<span style

  • 大小: 2.4 KB
  • 大小: 26.7 KB
  • 大小: 54.6 KB
  • 大小: 33.9 KB
分享到:
评论
2 楼 July01 2017-11-06  
推荐用StratoIO打印控件,支持网页、URL、图片、PD、ZPL和EPL,浏览器和系统的兼容性都很好,
而且不会崩溃。页头页脚、页码都能定制。参考http://www.webprinter.cn/features
1 楼 zwjabcd 2011-11-14  
图片附件没有了啊

相关推荐

    云端Web GIS

    #### 四、Web地图打印出图 Web地图的打印出图功能也是非常重要的一环,特别是对于需要在离线状态下查看地图数据的场景。ArcGIS Online提供了多种打印选项: 1. **使用ArcMap操作**:这是一种较为传统的打印方式,...

    ArcGISServer ADF web打印程序源码 CSharp

    此资源中的"Web打印程序源码"提供了在Web应用程序中实现地图打印功能的方法。CSharp是一种面向对象的编程语言,广泛应用于Windows平台的开发,包括GIS应用。源码注释使用英文,这表明它是面向国际开发者社区的,英文...

    基于Arcengine的地图打印小程序

    【ArcEngine地图打印小程序】是一款基于C#编程语言开发的GIS应用,专为ArcEngine初学者设计。ArcEngine是Esri公司提供的一个强大的GIS开发组件,允许开发者创建各种地理信息系统应用,包括桌面、Web和移动平台。这个...

    SuperMap GIS应用与开发

    5. **地图制作与发布**:SuperMap GIS提供了丰富的符号库和地图样式,你可以学习如何创建美观且信息丰富的地图,并通过打印或Web服务进行发布。 6. **SuperMap iServer与Web GIS**:SuperMap iServer是SuperMap GIS...

    SuperMap Objects .NET 打印地图

    打印地图是GIS应用中的常见需求。在SuperMap Objects .NET中,这个过程通常涉及到以下步骤: 1. 初始化地图对象:首先,我们需要创建一个地图实例,并设置其数据源和初始视图。 2. 创建打印任务:通过`SuperMap)...

    Gis实现的地图浏览

    7. **地图服务**:GIS应用可能需要连接到Web地图服务(如WMS、WFS),获取远程地图数据。MapX支持与这些服务的集成,开发者需要理解服务的协议和调用方式。 8. **自定义样式和符号**:为了更好地展示地理信息,...

    frmPageLayout.rar_arcengine _arcengine 比例尺_地图打印_打印地图_整饰

    3. **地图打印**:地图打印是GIS应用中的常见需求,通过ArcEngine,开发者可以控制打印的布局、比例、方向等参数,实现高质量的地图输出。本项目中,可能使用了ArcEngine的PrintTask类来实现地图的打印功能。 4. **...

    Silverlight For GIs 多例子

    这个主题涵盖了一系列的功能实现,包括图层管理、动态图层控制、地图打印预览与打印功能、地图的拖拽缩放以及定位查询等核心GIS交互操作。 首先,Silverlight是微软推出的一种富互联网应用程序(RIA)框架,它允许...

    arcgis api 3.x for js 入门开发系列十二地图打印GP服务.zip

    除了基本的地图打印,还可以结合其他GIS功能,如动态图层、查询、分析等,实现更复杂的地图应用。例如,根据用户选择的区域动态加载数据,再进行打印。 通过以上知识点,你可以开始使用ArcGIS API 3.x for ...

    三个有关gis的中文文档

    这三份文档为GIS初学者提供了全面的学习资源,不仅讲解了基础的GIS地图绘制技巧,还深入到高级的Web地图服务发布。通过学习这些内容,读者可以掌握使用ArcGIS进行地理数据分析和地图制作的核心技能。

    arcgis api 3.x for js 入门开发系列十二地图打印GP服务源码

    地图打印是GIS应用中的重要功能,尤其在需要将地图数据导出或记录特定区域时非常实用。通过学习和实践这个源码,开发者可以提升自己在WebGIS开发方面的技能,更好地服务于各类地理信息系统的开发需求。

    c++用于GIS二次开发

    5. **地图渲染**:地图的显示和打印是GIS应用的重要部分。开发者需要学习如何使用C++来渲染地图,包括符号化规则、颜色映射、比例尺控制等。 6. **性能优化**:由于GIS数据通常较大,性能优化是必不可少的。这可能...

    arcgis for js加载百度地图高德地图天地图

    在GIS领域,ArcGIS for JavaScript(arcgis for js)是一个强大的Web地图开发库,它允许开发者将地理信息系统功能集成到Web应用中。本教程将详细阐述如何利用ArcGIS for JavaScript API来加载百度地图、高德地图和天...

    基于WEB-GIS的大同市矿山地质环境动态遥感监测系统.pdf

    快速出图模块方便用户打印地图,便于日常工作。 矿山地质环境系统则包含时间轴、遥感解译、地质灾害和二三维一体化模块。时间轴功能能够直观展示不同年份的地质环境变化,用户可以对比不同时间点的地块变化;遥感...

    开源GIS视频课程.rar

    5. **地图制图与可视化**:介绍如何使用GIS软件创建专业地图,包括符号化、标签设置、图层组织等,以及利用QGIS的布局和打印模块制作地图报告。 6. **WebGIS开发**:探讨如何构建基于OpenLayers、Leaflet等...

    大连矢量地图

    因此,矢量地图在缩放时不会出现像素化的模糊现象,非常适合用于高精度的地理分析和地图打印。而大连矢量地图作为城市级别的数据,包含了该市的行政区域、道路网络、建筑物、公共设施等各种地理要素。 在描述中提到...

    arc gis开发

    ArcGIS是Esri公司开发的一套强大的GIS软件系统,它不仅包括桌面GIS应用,如ArcMap、ArcCatalog等,还涵盖了服务器端组件、Web应用以及移动设备上的应用。ArcGIS被广泛应用于资源管理、城市规划、环境保护、灾害管理...

    C#开发GIS应用简明教程

    8. **地图渲染**:学习如何利用C#生成高质地图输出,包括打印、导出、动态图层、图例和标签的创建。 9. **GIS应用实例**:通过实际项目,如人口密度分析、交通网络规划等,深入理解C#在GIS开发中的应用。 10. **...

    基于ArcObjects与C#.NET的GIS应用开发

    6. 服务发布:借助ArcGIS Server,可以将开发的应用程序作为GIS服务发布,实现Web GIS的应用。 在实际项目中,开发者还需要关注性能优化、错误处理、多线程编程等方面的问题。同时,理解GIS的基本概念和原理,如...

    gis png 一套图标

    这些GIS图标在GIS软件开发、Web GIS应用、移动GIS应用等方面都有广泛的应用。 在压缩包“gis_png24”中,很可能包含了上述各类GIS功能的PNG图标,每一种图标都可能有不同的样式和颜色主题,以适应不同的设计需求。...

Global site tag (gtag.js) - Google Analytics