`
guotufu
  • 浏览: 35122 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

一个GIS项目开发(采用MapGuide)的简单总结(转载)

阅读更多
2009-12-31
一个GIS项目开发(采用MapGuide)的简单总结
文章分类:Web前端
(草稿)

      今年做了一个GIS项目,基于web的。过程中有不少经验和心得,也有一些挫折和疑惑,做完一直没有认真总结。
      这个项目业务很简单,地图就是核心功能。某局管理着某系统2000多家各级机构,希望这些机构都在地图上标出来,方便查询,快速导航,结合机构信息、管理者信息、经营信息展示出来。具体功能不必多说,我对这个项目总体上还算满意。
      项目选择的GIS引擎是开源的MapGuide。以前没做过GIS,选择MapGuide只是在简单考察之后的判断。事实上选择它并不坏,开源引擎有名的MapServer、GeoServer,许多java程序员都是用GeoServer,也许它们也不错,只是没用过。
      MapGuide提供三种服务端接口,.Net的、PHP的、Java的。咱是Java程序员(&c&ruby:)),就使用Java了。
      顺便讲一下Java的技术。项目采用了Struts2、OpenJPA,Struts2和JPA的组合我是第二次用了,不过上次是Hibernate的JPA。Struts2应用了REST的风格,省了很多配置。开发、调试环境是Eclipse,Maven,调试起来很方便。Maven的Tomcat插件默认是不打开JK监听端口的,我把它的MOJO加一行代码,重新编译就可以了。为了配置一些图层定义的xml我使用了Freemarker,因为Freemarker自己就能包含另一些文件,可以把变化的和不变化的部分分离开而不用写程序。整个Java的技术组合,开发效率很不错,我也比较满意。数据库用的是mysql,保存一些POI数据。因为地理数据不保存在数据库中,mysql就够了。
      MapGuide引擎是通过Apache调用的,cgi把Apache和MapGuide引擎关联起来。Java web服务器使用Tomcat,因为Apache通过JK连接到Web容器,Tomcat比较自然。整个体系结构是Client(http)->Apache,Apache(cgi)->MapGuide,Apache(JK)->Java/Tomcat,Java(MapGuide服务端API)->MapGuide。
      上面最后一个联系是因为,操作Map,Features主要是在服务端完成的。客户端主要是直接从MapGuide查询数据,但不修改Map,Featrues。项目中客户端、服务端处理方式都是MapGuide特有的。
      MapGuide宣称也支持WMS、WFS标准,不过我没这样用。用WMS、WFS方式的话,我倒是想组合MapServer和openlayers试试,也许可以解决一些问题。
      一个GIS应用从下往上可以分成这样的层次,Data->Layer->Map->Layout,Data就是数据层,对应原始的地图数据,包含多个图层;Layer关联某个图层的数据,定义了该层数据如何显示,它是Data图层数据逻辑上的概念,并且包含了图层样式;Map组合了多个Layer,定义了每个Layer的顺序,出现的比例尺等。Layout定义整个应用界面的布局,需要哪些panel,哪些按钮,怎么布局等。
      上面说的Data、Layer、Map、Layout是要在工具里配置的。MapGuide的配置工具有MapGuide Studio、MapGuide Maestro,前者是Autodesk公司官方的,后者是免费的。还有安装就带的基于web的webstudio,不过比较难用。总体上MapGuide Maestro跟MapGuide Studio有差距,不过发展得比较快。我习惯使用MapGuide Maestro,MapGuide Maestro比MapGuide Studio好的就在于它能直接编辑xml。不过MapGuide Maestro好像加不了资源,我有一批png的symbol不知道怎么加上去,这个问题困扰了好几天。后来才安装了MapGuide Studio,终于得到了解决。
      图层样式的配置网上很多地图可以参考。划分好比例尺,每一层在哪个比例尺上出现,不同比例尺上道路要多宽。关键一点是要突出业务上的POI,其他的颜色不要太花。
      MapGuide提供的客户端解决方案是一整套的,它对Layout有很完美的支持。从普通的ajaxpanel到fusion这个重量级的框架。如果你的地图是静态的(不需要修改、增加Feature,不需要加临时层,通过配置工具很快就能部署一个GIS应用)。
      我们的客户端基于普通的方式改造而来,fusion感觉太花哨,把它风格改造得庄重一些是个麻烦。没有使用Layout,这样是为了更好的控制,它对真正定制的应用总是拖累,放不开手脚改造。
      地图的操作包括普通的地图操作(放大、缩小、移动,测距、获取图片等),画一个区域(矩形、圆,以在这个区域内查询),(根据查询结果)定位、标记,地图上点击POI弹出详细信息,等等。
      画区域的方式是,在画形状的回调函数中,把形状信息通过ajax发到服务器(java),在服务端程序中,读取图层配置,给地图生成一个临时层,刷新地图。如果要在区域内查询,则也要调用服务端API来完成。
      web上获取feature的原理是,鼠标悬停时获取鼠标的坐标,计算以鼠标为中心上下几像素的矩形,矩形坐标转换为地图坐标,发送到服务器(到MapGuide Server,不到Tomcat),服务器查询这个区域内的feature(只要一条,最上面的),返回。根据这个原理,我在取回feature的回调函数中加入自己的东西,如果取回了我需要的feture,就在鼠标所在位置加一个div,鼠标变成手形,加上单击事件。于是单击就可以弹出详细信息框(框里包含iframe)。
      最初的地图上没有OverView(鹰眼),于是加了一个,花了两天时间,都可以联动。开始时出现奇怪的问题,后来发现时两个地图都用一个MapGuide的session,两者几乎同时请求Map,时间间隔太短,服务器发给后来的一样的图片。于是改成各自一个session。
      由于不是通过WMS方式访问服务器的,所以都需要先建立session才能连接。可是MapGuide的session在我们应用没有多大意义,我们只需要Java web的session就够了。为了保证MapGuide的session能保持,客户端每隔一段时间就touch服务端一次。
      我们用的MapGuide版本是2.0.2,开发一段时间后发现效率比较成问题,并发支持不好,甚至一个用户访问一段时间后就会无响应。后来把MapGuide服务器配置文件serverconfig.ini一些参数调整了一下,主要是一些MaxConnections和*Size参数适当的调大。基本没问题了。现在2.1版已经正式发布了,效率是它的一个重点,相信应该可以提升不少。
      有两个问题也折腾了几天的时间。一个问题好解决,两个问题缠绕在一起就麻烦了。最初地图上的汉字总是乱码,变成欧洲字符的那种,后来猜想是可能是数据的.DBF文件(feature文件)内部乱码了(事实是地图数据厂商从arcGIS导出成shp造成的),用access打开再保存,重新导入。再看变成框框了。再上网查资料,装了Arial Unicode MS字体(LayerDefinition也要改成这个字体),于是可以了。不明白为什么非要这种字体,换过别的字体不行。
      地图上Label的文字,如果是线型的Label的话,文字会顺着线条的方向,角度会有一些倾斜,看起来不好看,不知道能调整不。
      还有一个重要问题没有提到,就是tile(瓦片)。地图的生成有两种方式,一种是每次请求时(可能是一次请求一个图层)给渲染一整张图片发回客户端,这样每次请求都得渲染一次,因为请求的中心坐标和范围都不一样。另一种是预先渲染一张张小图片,叫tile,组织到文件系统中,客户端在显示地图是自己计算需要哪些tile,分别请求服务器,如果服务器没现成的,渲染它保存,发回来,否则发回现成的。这种方式利用缓存,减轻服务器负担,会越使用越快。另外不需要一个图层一个tile,可以多个图层都渲染到一个tile中。
      我们地图的图层分成3个组(不包括临时层),路、桥、面状层是一个组,地图数据固有的POI层是一个组,我们的业务POI是一个组。开始时3个组都配置成tile,但是出现了路名重复的问题,基本在每个tile重复一次,很难看。想想它应该是这样的,每个tile都是单独渲染的,不能协调路名应该出现在哪个tile中,每个tile都当自己是中心。查查资料,好像几个引擎都没有解决这个问题。为了解决这个问题,我从道路、街道的各层中分出路名层,这些路名层就不要tile了。最后路名重复的问题解决了,但拖动地图的时候,其他都是平移的,只有路名位置也会重新计算,相对位置会变化了,效果不太好。
      后来发现业务POI客户也会随时调整的,于是业务组也不用tile了。给有权限的用户开放重新定位功能,可以由他们来调整。
      关于坐标的收集,原来让各个系统自己报。后来发现,他们获取坐标的方式多种多样,很多都不大准确。有些是用仪器甚至带gps功能的手机测到的,但这些仪器往往本来就会有一定的偏差。后来大部分要求重新报一次,通过Google Earth找坐标,因为我们发现Google Earth的坐标是准确的,和我们地图也是吻合的。我们在坐标数据上花费了很多时间。

      总的来说,GIS对我们是一个新的领域,这个项目毕竟做完了,还算令人满意。通过这个项目,我们学了不少东西,积累了不少经验。把这些写出来,虽然比较粗糙,没什么条理,但总算完了一件心事。

分享到:
评论
1 楼 appache 2017-03-24  
我问一下,MapGuide里面使用的账户验证机制如何能添加自己的用户,或者修改用户名密码呢,或者直接去掉用户名密码,但是还是能使用原来的站点服务机制

相关推荐

    MAPGUIDE6.5中文教程(GIS开源开发必备)

    MAPGUIDE6.5中文教程(GIS开源开发必备)

    使用ASP.NET 开发 Mapguide

    "Create_A_Basic_Web_Mapping_Application.pdf"可能涵盖了从零开始构建一个简单的Mapguide Web应用的步骤。这通常包括创建Web项目、设置地图视图、添加图层控制、实现地图导航和查询功能。ASP.NET MVC或者Web Forms...

    mapguide开发实例

    2. **地图服务**:在MapGuide中,地图是作为一个服务发布的,可以包含多个图层,每个图层可以是矢量数据(如形状文件)或栅格数据(如TIFF、JPEG)。开发者需要了解如何创建、配置和发布地图服务。 3. **图层管理**...

    mapguide 3.0

    MapGuide 3.0 是一个开源的Web GIS(地理信息系统)平台,它允许开发者构建交互式的地图应用。这个安装包包含了一系列组件和工具,用于在Web环境中管理和展示地理数据。以下是对MapGuide 3.0及其相关知识点的详细...

    MapGuide全面培训材料

    MapGuide是一款国际上广泛应用的开源GIS(地理信息系统)软件,它提供了一个灵活的平台,用于构建Web GIS应用程序。本全面培训材料将深入探讨MapGuide的核心功能、架构、开发与应用,帮助用户掌握这一强大工具。 1....

    mapguide安装手册

    MapGuide 是一个 GIS 平台,提供了强大的空间数据管理和可视化功能。为帮助用户快速上手 MapGuide,本文将详细介绍 MapGuide 安装过程中的每一个步骤。 一、安装 MapGuide 服务器 首先,需要下载 MapGuide 的安装...

    mapguide空间数据搜索

    总的来说,Mapguide空间数据搜索是一个强大而灵活的工具,它使GIS用户能够快速定位地图上的特定信息,进行多维度的空间和属性分析。通过理解并熟练运用Mapguide提供的查询机制,开发者可以构建出高效、用户友好的Web...

    mapguide 详细开发文档和案例

    根据提供的文档内容,我们可以归纳出一系列关于MapGuide Open Source...从环境搭建到具体应用开发,每一个环节都需要细致地考虑和实现。希望这些知识点能够帮助您更好地理解和掌握MapGuide Open Source 2.0的开发技巧。

    Mapguide 培训文档(中文)

    10. **社区与支持**:Mapguide作为开源项目,有一个活跃的开发者社区。文档可能提供建议如何获取帮助,参与社区讨论,以及贡献自己的代码和经验。 通过这份中文培训文档,读者可以逐步掌握Mapguide的使用,从基本的...

    Mapguide安装与配置说明

    MapGuide是一款开源的地理信息系统平台,它允许用户创建、管理和发布地图应用。本文将详细介绍MapGuide的安装与配置过程,包括...通过以上步骤,用户可以搭建起一个基础的MapGuide环境,进一步学习和实践GIS应用开发。

    mapguide官方培训资料 autodesk-mapguide-2010-enterprise-and-studio-essentials 上部

    Autodesk MapGuide 是一款由Autodesk公司开发的地理信息系统(GIS)软件,主要用于创建和发布网络地图应用程序。MapGuide软件允许用户利用开放的Web技术如HTML, JavaScript和CSS来构建地图和地理空间应用程序。它...

    mapguide安装及配置使用(英文版)

    发布过程会生成一个地图定义(MDF)文件,这是MapGuide识别地图的基本文件。 7. **创建Web应用程序**:MapGuide提供了几种预定义的Web应用程序模板,如MapGuide Viewer,可以直接使用。你也可以使用MapGuide API...

    MapGuide 汉化包

    MapGuide Open Source 是一个开源的地理信息系统(GIS)平台,它允许开发人员构建交互式的地图应用。这个汉化包是针对MapGuide的一项重要更新,旨在为中文用户提供更友好的界面和操作体验。通过下载并使用这个汉化包...

    MapGuide Viewer Api Help

    MapGuide是一个开源的地理信息系统(GIS)平台,它允许用户通过Web浏览器查看、操作和共享地理空间数据。在本文中,我们将深入探讨MapGuide Viewer API的一些核心概念、功能和应用场景。 1. **MapGuide Viewer API...

    mapguide一个例子可以看看

    MapGuide是一个开源的Web GIS平台,它允许开发者创建交互式的地图应用。这个例子展示了如何使用ASP.NET来开发MapGuide相关的应用程序。在深入讨论这个例子之前,我们先了解一下MapGuide的关键概念和技术栈。 ...

    mapguide官方培训资料 autodesk-mapguide-2010-enterprise-and-studio-essentials 下部

    IDE 为开发者提供了一个集成了代码编写、调试和测试等功能的开发平台,这大大提高了开发效率和质量。 在本章结束时,学习者应该能够决定如何选择MapGuide Enterprise Web Server扩展和开发语言,解释Web Server扩展...

    mapguide open sources 安装手册

    - MapGuide DwfViewer可能是MapGuide提供的一个用于查看DWF格式地图文件的组件,具体的安装方法通常会在文档中详细说明。安装后,用户可以通过DwfViewer查看和交互地图内容。 以上就是MapGuide Open Source的安装...

Global site tag (gtag.js) - Google Analytics