地理信息系统二次开发

合集下载

采用二次开发方法的成果管理GIS系统设计与实现

采用二次开发方法的成果管理GIS系统设计与实现

采用二次开发方法的成果管理GIS系统设计与实现二次开发方法指的是在现有系统的基础上进行二次开发,以适应更多的需求和功能。

在成果管理GIS系统中,二次开发方法可以帮助系统更好地满足用户的需求,提高系统的效率和便利性。

本文将从设计与实现两个方面,介绍采用二次开发方法的成果管理GIS系统的相关内容。

一、设计1.需求分析在进行二次开发之前,首先需要进行详细的需求分析,充分了解用户的需求和期望。

成果管理GIS系统通常包括地图管理、数据管理、成果分析等功能,因此在需求分析阶段需要明确每一个功能模块的具体需求,并根据实际情况进行调整和优化。

用户可能需要在地图上标注多种类型的成果点,需要进行数据的快速查询和统计分析等。

2.架构设计在设计阶段,需要考虑系统的整体架构,包括前端界面设计、后端数据库设计和系统整体的交互流程。

由于成果管理GIS系统需要处理大量的地理信息数据,因此前端界面设计需要考虑到用户体验和交互性,后端数据库设计需要考虑到数据的存储和管理,系统整体的交互流程需要考虑到用户操作的便捷性和系统的稳定性。

3.功能设计根据需求分析的结果,对系统的功能进行设计。

功能设计需要考虑到用户的操作习惯和使用场景,尽可能地让系统变得简单易用。

地图管理功能需要支持多种地图图层的叠加和切换,数据管理功能需要支持数据的导入和导出,成果分析功能需要支持多种统计分析方法的应用等。

4.安全性设计在设计阶段需要考虑系统的安全性,包括用户权限管理、数据的加密传输和存储等。

成果管理GIS系统通常涉及到重要的地理信息数据,因此需要做好数据的安全保护工作,防止数据泄露和不法操作。

因此在设计阶段需要考虑到系统的安全性设计。

二、实现1.技术选型在实现阶段需要选择合适的开发技术和工具。

成果管理GIS系统通常需要采用地理信息系统相关的开发技术,例如地图API、空间数据库等。

在选择技术的同时需要考虑到系统的可扩展性和性能,尽量选择成熟可靠的技术和工具。

第1章 地理信息系统二次开发.ppt

第1章 地理信息系统二次开发.ppt

GIS开发模式
三种开发模式的比较
独立开发难度太大;单纯二次开发受GIS工具提供的 编程语言的限制差强人意;
集成二次开发方式成为GIS应用开发的主流。
优势:既可以充分利用GIS工具软件完备的空间数据 库管理、分析功能,又可以利用其他面向对象可视 化开发语言具有的高效、方便等编程特点,集二者 之所长,不仅大大提高应用系统的开发效率,而且 使用可视化软件开发工具开发出来的应用程序具有 更好的外观效果,更强大的数据库功能,可靠性好, 易于移植,便于维护,尤其是利用组件进行集成开 发,更能表现这些优势。
1.4 创建多个模块的项目文件
一个比较复杂的程序可能包含上万行代码,如 果把他们写在一个文件里,则很难找到特定的 部分,难以管理、排错。
可以把一个大的应用程序分成多个小的文件, 每个文件实现特定的功能,然后建立一个工程 文件来把这些独立的模块链接成一个可执行文 件。
例:建立项目文件过程 (example\muiti_modules)
1.1 MapBasic的主要特点:
(2)MapBasic支持OLE和DDE技术,能够实 MapInfo与其他应用程序的链接。能够在VB、VC、 Delphi等开发工具中集成地图窗口。
(3)MapBasic能扩展MapInfo功能。 MapBasic是一种多平台、过程化、事件驱动的、兼容 性很强的MapInfo开发工具,其语言结构允许用户定 制附加功能。它具有功能很强的内含地理特性的语句 和函数。
(4)MapBasic具有强大的数据库访问工具。 使用一条MapBasic语句就可以执行复杂而先进的数据 库查询。
(5)具有较好的兼容性。 MapBasic与所有支持MapInfo的平台相兼容, MapBasic应用程序可以在这些平台上运行。

采用二次开发方法的成果管理GIS系统设计与实现

采用二次开发方法的成果管理GIS系统设计与实现

采用二次开发方法的成果管理GIS系统设计与实现成果管理GIS系统设计与实现是一个基于二次开发方法的地理信息系统,主要用于管理和展示各种地理信息数据的成果。

本文将详细介绍该系统的设计思路和实现方式,包括系统的功能模块、数据结构设计、界面设计以及系统的性能优化方案。

一、系统功能模块设计1. 数据导入模块:用于将各种地理信息数据导入系统,并进行预处理和格式转换。

2. 数据管理模块:用于对导入的数据进行管理,包括增加、删除、修改和查询等操作。

3. 数据展示模块:用于将管理的数据以地图的形式展示出来,并支持缩放、平移和浏览等操作。

4. 数据分析模块:用于对地理信息数据进行分析和统计,包括空间分析、属性统计和点线面的拓扑关系等。

5. 报表生成模块:用于根据分析结果生成各种报表,以供决策参考和业务展示。

二、数据结构设计1. 数据库设计:采用关系数据库来存储地理信息数据,通过表和字段的方式进行组织和管理。

2. 空间数据结构设计:采用矢量数据模型来存储和处理地理信息数据,包括点、线、面等要素类型。

3. 属性数据结构设计:采用属性表的方式来存储和管理地理信息数据的属性信息。

三、界面设计1. 系统主界面:采用地图为主的界面设计,将地理信息数据以地图的形式展示出来,并提供相关操作按钮和工具栏。

2. 数据管理界面:采用表格的形式展示和管理数据,包括增加、删除、修改和查询等操作。

3. 数据分析界面:采用图表和统计表格的形式展示分析结果,以及各种分析工具的操作界面。

四、系统性能优化方案1. 数据索引优化:对数据库中的数据进行索引优化,以提高数据查询和检索的速度。

2. 数据压缩优化:对地理信息数据进行压缩处理,以减少数据存储空间和传输带宽。

3. 算法优化:对系统中的算法进行优化,以提高系统的运行速度和响应时间。

通过采用二次开发方法设计和实现成果管理GIS系统,可以有效地管理和展示地理信息数据,并提供丰富的分析和报表生成功能,同时通过系统性能优化方案,提高系统的运行效率和用户体验。

gis二次开发实训总结

gis二次开发实训总结

gis二次开发实训总结GIS(地理信息系统)二次开发实训总结一、引言GIS(地理信息系统)是一种将地理空间信息与属性信息相结合的技术系统,广泛应用于地理信息管理、地理空间分析、空间决策支持等领域。

在GIS软件应用过程中,二次开发能够满足特定需求,提高工作效率和数据处理能力。

本文将总结我在GIS二次开发实训中的学习经验和体会。

二、实训内容实训内容主要包括GIS软件的基本操作、二次开发的常用工具和技术、以及实际项目的开发。

在实训中,我通过学习和实践,掌握了GIS软件的基本操作技巧,如数据导入、地图绘制、属性查询等。

同时,我还学习了GIS二次开发的常用工具和技术,如ArcGIS Engine、ArcObjects、ArcPy等,这些工具和技术能够帮助我们进行地理空间数据的处理和分析。

在实训的最后阶段,我还参与了一个实际项目的开发,通过对项目需求的分析和编码实现,完成了一个基于GIS的地理空间分析系统。

三、学习经验1. 系统学习GIS基础知识:在进行GIS二次开发之前,充分了解GIS的基本概念和原理非常重要。

只有对GIS的基础知识有清晰的认识,才能更好地进行二次开发工作。

2. 熟悉GIS软件的操作:熟练掌握GIS软件的操作是进行二次开发的基础。

通过反复练习和实践,我逐渐熟悉了GIS软件的各种功能和操作方法,提高了工作效率。

3. 深入学习GIS二次开发工具和技术:GIS二次开发涉及到一些专门的工具和技术,如ArcGIS Engine、ArcObjects、ArcPy等。

通过深入学习这些工具和技术,我能够更好地进行地理空间数据处理和分析,并实现特定需求。

4. 学会利用网络资源:在进行GIS二次开发过程中,遇到问题时,学会利用网络资源进行查找和解决是非常重要的。

通过查阅相关文档和论坛,我解决了许多开发中的问题。

5. 多实践、多项目参与:只有不断地实践和参与项目,才能真正掌握GIS二次开发的技巧和经验。

在实践中,我遇到了许多问题,但通过不断尝试和摸索,最终都找到了解决方法。

地理信息系统二次开发

地理信息系统二次开发

常见错误(如前例)
Dim pRace As IRace Set pRace = New RaceCar
这虽然会得到IRace接口,但却指向了一个完全不同的RaceCar对象。
要引用由pCar所指向的同一个RaceCar对象必须为:
Set pRace=pCar
这样,两个变量就都指向同一个RaceCar对象,两个变量控制同一个 RaceCar的不同方面。
'Must use Set!
Set pLayer.FeatureClass = pMoresbyData
ArcObjects地理信息系统二次开发
几个关键类
ArcObjects地理信息系统二次开发
Geometry objects
Geometry *
Geometry collection
Curve
Envelope
ArcObjects地理信息系统二次开发
Getting other interfaces

QueryInterface (QI)
接口查询的概念是指在同一个对象上使用附加的接口。 在本课中常用到这个概念,缩写为“QI”
Dim A As IInterfaceA Set A = New SomeObject object variable (A) 'This instantiates the
ArcObjects地理信息系统二次开发
COM classes have interfaces


对象拥有一个或多个接口
接口是定义了一组方法和属性的逻辑关系 与对象的通信是通过接口来进行的
GarbageTruck IDrive Fuel Accelerate Brake IGarbage Dump Pickup IRace IDrive

地理信息系统二次开发 精品

地理信息系统二次开发 精品

1 gis软件技术经理了五个阶段:集成式GIS、模块式GIS、核心式GIS、组件式GIS、万维网GIS2 gis由4个要素组成:硬件、软件、数据、人员3 gis分为工具性软件(GIS二次开发平台、am/fm专用开发平台软件、其他工具性软件)应用型软件(制图软件、资源调查、信息管理、空间分析与预测)4 gis用户分为:最终用户、GIS专业人员、GIS开发商/系统集成商5 gis自身的特点:(1)GIS处理的是空间数据,具有数据量庞大、实体种类繁多、实体间的关联复杂等特点(2)GIS设计以空间数据为驱动(3)GIS工程投资大、周期长、风险大、涉及部门繁多6 gisS设计的理论思想:GIS工程学思想7GIS工程学体系主要由任务(运用系统论的理论和方法实现GIS工程的最优设计、最优管理和最有运行,以求得到系统总体的最优化)、基础理论(系统学、地理信息科学、系统工程学)和方法论组成8地理信息科学是研究地球信息的本质和运动规律的一门学科,其研究对象是地理信息。

他通过对地理信息技术中的一般性问题和规律性问题进行研究,对GIS工程学提供指导。

9 地理信息科学体系划分为三个层次:;理论地理信息科学、市局地理信息科学和应用地理信息科学10gis设计与一般信息系统设计的差异:设计重心(GIS处理的是海量空间数据,数据库设计在GIS设计中尤其重要,一般系统设计的中心是软件功能)数据库建设(gis不仅要进行属性数据库的设计,更要进行空间数据库的设计,包括空间数据结构、存储方式、管理机制。

而一般的只需要建立属性数据库)设计方法(GIS以业务需求为导向、异空间数据为驱动进行系统设计,而一般的以业务需求为导向,以功能为驱动进行系统设计)11gis设计包括软件设计和数据库设计12 实现地理信息资源共享,必须具备:(啊)数据资源储备(2)有技术支撑系统的保障(3)共享规则的制定,被广泛采纳和遵循13标准化是空间信息共享和系统集成的重要前提,也是GIS产业化和社会化的必经之路。

Chapter0_GIS二次开发技术概述

Chapter0_GIS二次开发技术概述

2-4
资源与环境科学学院 地理信息科学系
地理信息系统二次开发技术
二、宿主型开发——GIS平台脚本

指采用GIS平台自己提供的脚本语言进行二次开发。

如MapInfo Professional提供MapBasic 语言 ESRI 的ArcInfo 提供了Avenue 语言。

优势:以GIS 软件脚本语言开发应用程序,简单、快速。 劣势:脚本语言功能较弱,不能脱离 平台软件,效率不



实现自定义命令、工具、菜单 具备GIS的数据管理,如打开、保存地图文档、添加数据等 空间数据编辑功能 空间数据查询与分析 图形显示与空间数据符号化 空间查询与空间分析 地图布局设计
2-21
资源与环境科学学院 地理信息科学系
地理信息系统二次开发技术
练习、思考与讨论

体验不同的GIS编程方式
ArcToolbox)的基本操作;

理解ArcGIS Desktop的系统结构 了解数据组织模式,如Geodatabase、ArcSDE基本概念; 会用C#或其他面向对象的语言进行程序设计。
2-20
资源与环境科学学院 地理信息科学系
地理信息系统二次开发技术
课程考核
基于ArcObjects的程序设计书面考核 完成几个相对独立的功能开发案例 完成一个简单、完整的GIS应用系统,按GIS软件工程的 要求进行设计,具体要求如下:

通过课程学习,掌握应用型GIS开发的基本思路、技术方 法,并能够顺利转换至开源GIS、SuperMap、MapInfo或 其它GIS应用开发包和集成开发环境
2-2
资源与环境科学学院 地理信息科学系
地理信息系统二次开发技术

qgis 二次开发案例

qgis 二次开发案例

qgis 二次开发案例QGIS是一个开源的地理信息系统软件,它的二次开发案例非常丰富。

以下是一些常见的QGIS二次开发案例:1. 插件开发,QGIS允许开发者通过Python或C++等编程语言编写插件,以扩展软件的功能。

插件可以用于地图制图、数据处理、空间分析等方面。

例如,有开发者开发了用于地图标注、数据导入导出、地图投影转换等功能的插件。

2. 定制化应用开发,开发者可以使用QGIS的API和开发工具,基于QGIS定制化开发专业的地理信息系统应用。

这些应用可以满足特定行业或用户的需求,例如土地利用规划、环境监测、城市规划等。

3. 空间分析工具开发,QGIS提供了丰富的空间分析工具,但有时候用户需要特定的空间分析功能。

开发者可以通过QGIS的二次开发,开发符合特定需求的空间分析工具,例如基于某种算法的路径分析工具、地形分析工具等。

4. 数据库集成,QGIS支持与各种数据库的集成,包括PostGIS、Spatialite等。

开发者可以通过二次开发,实现QGIS与特定数据库的无缝集成,使得用户可以方便地在QGIS中进行空间数据的编辑和分析。

5. Web地图开发,QGIS提供了QGIS Server等工具,可以将地图发布到Web上。

开发者可以通过二次开发,定制化Web地图应用,实现在线地图浏览、查询、分析等功能。

总的来说,QGIS的二次开发案例非常丰富,开发者可以根据自己的需求和兴趣,利用QGIS提供的丰富API和开发工具,进行各种定制化开发和功能扩展。

这些二次开发案例丰富了QGIS的功能,也为用户提供了更多个性化的地理信息解决方案。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告课程名称:地理信息系统设计名称:MapObjects的二次开发院(系):海洋科学与工程学院专业班级:100532姓名学号:指导教师:2013年1 月17 日一、设计目的:(1)、实习类型:课程设计;(2)、了解VB的软硬件环境、MapObjects数据类型;(3)、初步掌握该软件的基本操作技能;(4)、能够熟练的操作VB6.0软件,并能应用该软件简单的与MO进行开发(5)、掌握产品的输出设计。

(6)、培养利用GIS方法解决实际问题的能力。

二、设计主要仪器设备,器材,药品,软件等(1)软件准备:VB6.0(2)硬件准备:PC机500M内存,128M显卡(最低)(3)资料准备:MapObjects控件、USA等SHP文件三、设计原理和内容:(1)设计题目:MapObjects的二次开发(2)具体要求:应用VB软件与MO控件进行结合,实现MO的二次开发。

(3)功能描述:✓MapObjects是可以允许用户向应用程序中添加地图的制图软件控件集合。

✓MapObjects 可以在多种符合工业标准的开发环境下使用,比如Visual Basic,PowerBuilder,Visual C++等。

MapObjects 可以直接嵌入到这些开发环境中使用,允许用户快捷地创建应用程序。

✓MapObjects运行于Windows XP或Windows NT 4.0或更高版本。

✓MapObjects 包括一个ActiveX 控件(OCX) 也就是Map控件,还包括45个ActiveX 自动对象。

可用于符合IT行业标准的Windows编程环境。

✓MapObjects主要功能:显示一张包含多个图层的地图(道路,河流,边界)。

放大,缩小,漫游。

创建新的几何图形,如点,线,圆,多边形。

为图层添加注释。

识别地图上被选中的要素(点,线,面)。

可以通过线,矩形,多边形,圆来选择要素可以选取距某参照物一定距离范围内的要素。

可以通过SQL语句来选择要素。

对选择的要素进行统计。

查询与更新被选择的要素的属性数据制作专题地图。

根据字段的值标注图层要素。

显示从航片或卫星图片上获取的图像。

动态显示实时或时间系列数据。

通过输入地址在地图上定位。

将数据投影到不同的坐标系下✓MapObjects对象模型(具体见附录)数据通道对象组(Data Access Objects)地图显示对象组(Map Display Objects)几何图形对象组(Geometric Objects)地址匹配对象组(Address Match Objects)地理坐标对象组(Projection Objects)四、设计步骤1、下载MO与VB并安装,搭建开发环境安装MO:点击Mo22Setup.exe安装Mo,在VB6.0中加载MapObjects控件:2、系统功能设计打开文件、图层管理、地图放缩工具、右菜单、属性表信息、图层信息、动态图层实现、分析与查询、专题制图等3、系统界面设计4、系统功能实现4.1(1)对所要实现的功能进行菜单编辑,在窗体空白处点击右键,打开菜单编辑器,在菜单编辑器的标题框中输入菜单名称,名称框输中入对应的菜单名称,通过下方的方向键可以添加新菜单和二级、三级菜单,根据需要,我们设计了文件、图层、编辑和查询四个主菜单以及数个二级菜单。

如下图所示:结果如下:(2)添加图层显示窗口:在工具栏中双击Map工具,窗体中出现的一个白色图层即为图层显示窗口,根据需要调整窗口大小和位置。

我们添加一大一小两个显示窗口。

以同样的方法可添加用于显示图层名称的lstLayers窗口,用于显示比例尺的ScaleBar窗口以及用于显示时间的StatusBar窗口条,StatusBar工具条可右键打开属性页,在属性页中修改相应参数。

(3)添加按钮:双击工具栏中的CommandButton工具,窗体中会出现一个按钮,调整按钮的大小和位置,并在属性表中的Caption一栏修改按钮上显示的名称,我们添加了上移、下移、置顶和删除四个按钮。

如下图所示:(4)添加工具栏:先双击工具栏中的ImageList工具,右键打开该工具的属性页,选择图像->插入图片,选择需要的图片,如下图所示:(5)再在工具栏中双击ToolBar工具,右键打开属性页,在图像列表中选择ImageList1,再点击按钮->插入按钮,选择按钮样式和值,在图像输入框中输入之前在ImageList1中插入的图片的位所对应的数值,如图所示:(6)添加Timer工具和CommonDialog工具,这样就可以通过相应的代码显示时间和添加文件。

窗体布局如下:4.2主要程序及操作步骤(1)添加shape文件和栅格数据文件:添加、保存文件,添加文件并在窗体中显示图层信息:'添加shape文件Private Sub Add_shpFile_Click()On Error GoTo err2CommonDialog1.Filter = "ESRI Shapefiles (*.shp)|*.shp" '打开访问路径CommonDialog1.InitDir = App.Path + "\data"CommonDialog1.ShowOpenIf Len(CommonDialog1.FileName) = 0 Then Exit SubDim dc As New DataConnection '返回文件名字并打开文件dc.Database = CurDirIf Not dc.Connect Then Exit SubDim name As Stringname = Left(CommonDialog1.FileTitle, Len(CommonDialog1.FileTitle) - 4)Dim gs As GeoDatasetSet gs = dc.FindGeoDataset(name)If gs Is Nothing Then Exit SubSet g_layer = New MapLayer '加载图层monDialog1.ShowColorg_layer.Symbol.color = monDialog1.colorSet g_layer.GeoDataset = gsyers.Add g_layeryers.Add g_layeryers.Add g_layeryers.Add g_layerMe.legend1.setMapSource Map1 '显示标签legend1.LoadLegend TrueSet Rectsel = NothingIf dc.Connect Then '显示图层信息lstLayers.ClearFor Each lyr In yerslstLayers.AddItem Next lyrEnd IfIf lstLayers.ListCount > 0 ThenAdd_shpFile.Enabled = TruelstLayers.Selected(0) = TrueEnd Ifform1.Map1.Refresh '更新地图form1.Map2.RefreshMap1.MousePointer = moArrowExit Suberr2:MsgBox "对不起,打开出错!"End Sub'添加栅格数据文件Private Sub shange_Click()*******CommonDialog1.Filter = "Windows Bitmap (*.bmp)|*.bmp|TIFF Image(*.tif)|*.tif|JPG图片(*.jpg)|*.jpg"CommonDialog1.FilterIndex = 1CommonDialog1.InitDir = App.PathCommonDialog1.ShowOpenIf CommonDialog1.FileName <> "" TheniLayer.file = CommonDialog1.FileName' move the existing layer to the topIf yers.Add(iLayer) Thenyers.MoveToTop 1End If' Form12.Caption = CommonDialog1.FileNameEnd IfExit Suberr2:MsgBox "对不起,打开出错!"End Sub'保存图片Private Sub Save_bmp_Click() '保存图片CommonDialog1.InitDir = App.PathCommonDialog1.Filter = "Windows Bitmap (*.bmp)|*.bmp|TIFF Image(*.tif)|*.tif|JPG图片(*.jpg)|*.jpg|png图片(*.png)|*.png"CommonDialog1.DialogTitle = "Export Bitmap(*.bmp)|*.bmp|TIFF Image(*.tif)|*.tif|JPG图片(*.jpg)|*.jpg|png图片(*.png)|*.png" CommonDialog1.FileName = "untitled.bmp"CommonDialog1.ShowSaveIf Len(CommonDialog1.FileName) = 0 Then Exit Subform1.Map1.ExportMap moExportBMP, CommonDialog1.FileName, moAllSymbologyScaledEnd Sub(2)放大、缩小、漫游、全景等功能:Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)Dim Response As VariantIf Toolbar1.Buttons(1).Value = tbrPressed Then '放大If flag = 1 ThenResponse = MsgBox("地图处于绘制状态,是否继续进行放大操作", vbYesNo, "取消操作")If Response = vbYes ThenMap1.MousePointer = moZoomInElseMap1.MousePointer = moDefaultEnd IfElseMap1.MousePointer = moZoomInEnd IfElseIf Toolbar1.Buttons(2).Value = tbrPressed Then '缩小If flag = 1 ThenResponse = MsgBox("地图处于未完全绘制状态,是否继续进行缩小操作", vbYesNo, "取消操作")If Response = vbYes ThenMap1.MousePointer = moZoomOutElseMap1.MousePointer = moDefaultEnd IfEnd IfElseIf Toolbar1.Buttons(3).Value = tbrPressed Then '漫游If flag = 1 ThenResponse = MsgBox("地图处于未完全绘制状态,是否继续进行漫游操作", vbYesNo, "取消操作")If Response = vbYes ThenMap1.MousePointer = moPanElseMap1.MousePointer = moDefaultEnd IfEnd IfElseMap1.MousePointer = moArrowEnd IfEnd SubPrivate Sub Toolbar1_DblClick()Toolbar1.Visible = FalseEnd SubPrivate Sub Command1_Click() '全景显示Set Map1.Extent = Map1.FullExtentEnd Sub(3)图层操作,包括选定图层的上移、下移、置顶、删除以及所有图层清空Private Sub toplayer0() '图层至顶If lstLayers.ListIndex <> -1 Thenyers.MoveToTop lstLayers.ListIndexMap1.RefreshlstLayers.ClearFor Each lyr In yerslstLayers.AddItem Next lyrEnd IfEnd SubPrivate Sub uplayer0() '上移图层Dim i As IntegerIf lstLayers.ListIndex <> -1 And lstLayers.ListIndex > 0 Theni = lstLayers.ListIndex - 1yers.MoveTo lstLayers.ListIndex, iMap1.RefreshlstLayers.ClearFor Each lyr In yerslstLayers.AddItem Next lyrlstLayers.Selected(i) = TrueEnd IfEnd SubPrivate Sub downlayer0() '下移图层Dim i As IntegerIf lstLayers.ListIndex <> -1 And lstLayers.ListIndex < lstLayers.ListCount - 1 Theni = lstLayers.ListIndex + 1yers.MoveTo lstLayers.ListIndex, iMap1.RefreshlstLayers.ClearFor Each lyr In yerslstLayers.AddItem Next lyrlstLayers.Selected(i) = TrueEnd IfEnd SubPrivate Sub cancel_layer_Click() '删除图层Dim i As IntegerIf lstLayers.ListIndex <> -1 Theni = lstLayers.ListIndexyers.Remove iyers.Remove iMap1.RefreshMap1.RefreshlstLayers.ClearFor Each lyr In yerslstLayers.AddItem Next lyrEnd IfMe.legend1.setMapSource Map1 '删除标签legend1.LoadLegend FalseEnd SubPrivate Sub 清空_Click() '清空图层On Error GoTo err1 '如果map1和map2已经清除不操作yers.Clearyers.ClearlstLayers.ClearMe.legend1.setMapSource Map1 '删除标签legend1.LoadLegend Falseerr1:MsgBox "没有图层!"End Sub(4)右键功能实现Private Sub 放大_Click() '右键放大Set rt = Map1.Extentrt.ScaleRectangle (0.5)Set Map1.Extent = rtEnd SubPrivate Sub 缩小_Click() '右键缩小Set rt = Map1.Extentrt.ScaleRectangle (1.5)Set Map1.Extent = rtEnd SubPrivate Sub 显示各层信息_Click() '右键显示图层信息* * * * * *lyrCount = yers.CountForm4.MSFlexGrid1.Rows = 1Form4.MSFlexGrid1.Cols = 3Form4.MSFlexGrid1.Row = 0: Form4.MSFlexGrid1.Col = 0 Form4.MSFlexGrid1.Text = "图层序号"Form4.MSFlexGrid1.Col = 1: Form4.MSFlexGrid1.Text = "名称"Form4.MSFlexGrid1.Col = 2: Form4.MSFlexGrid1.Text = "类型"For i = 0 To lyrCount - 1Select Case yers.Item(i).shapeTypeCase moPointstrtype = "点图层"Case moLinestrtype = "线图层"Case moPolygonstrtype = "多边形图层"Case Elsestrtype = "?"End SelectForm4.MSFlexGrid1.AddItem Str$(i + 1) & Chr(9) & yers.Item(i).name & Chr(9) & strtype Next iForm4.Show vbModalEnd Sub(5)状态栏实现从状态栏属性添加文本“海技地信课设钱为陈瑞瑞吴运涛代长波”,并设置属性Private Sub Timer1_Timer() '显示当前时间Timer1.Interval = 1000 '时间以毫秒记Timer1.Enabled = TrueStatusBar1.Panels.Item(5).Text = "当前时间:" & Now()End SubPrivate Sub Form_Load() '显示登录时间Timer1.Interval = 1000Timer1.Enabled = TrueStatusBar1.Panels.Item(4).Text = "登陆时间:" & Now()************End SubPrivate Sub refreshScale() '状态栏信息ScaleBar1.MapExtent.MaxX = Map1.Extent.RightScaleBar1.MapExtent.MinX = Map1.Extent.LeftScaleBar1.MapExtent.MaxY = Map1.Extent.BottomScaleBar1.MapExtent.MinY = Map1.Extent.TopScaleBar1.PageExtent.MinX = Map1.Left / Screen.TwipsPerPixelXScaleBar1.PageExtent.MinY = Map1.Top / Screen.TwipsPerPixelYScaleBar1.PageExtent.MaxX = (Map1.Left + Map1.Width) / Screen.TwipsPerPixelXScaleBar1.PageExtent.MinY = (Map1.Top + Map1.Height) / Screen.TwipsPerPixelYScaleBar1.RefreshStatusBar1.Panels(6).Text = "比例1 :" & Format$(ScaleBar1.RFScale, "###,###,###,###,###")End SubPrivate Sub Map1_AfterLayerDraw(ByVal Index As Integer, ByVal canceled As Boolean, ByVal hDC As stdole.OLE_HANDLE) ******Call refreshScale******End Sub(6)旋转,复位Private Sub xuanzhuan_Click() '右转Map1.RotationAngle = 90Map1.RefreshEnd SubPrivate Sub Command6_Click()Map1.RotationAngle = -90Map1.RefreshEnd SubPrivate Sub Command4_Click() '复位Map1.RotationAngle = 0Map1.RefreshEnd Sub(7)图层编辑Private Sub Map1_AfterLayerDraw(ByVal Index As Integer, ByVal canceled As Boolean, ByVal hDC As stdole.OLE_HANDLE) *********'设置点格式If Not Pts Is Nothing Thensym.color = moRedsym.SymbolType = moPointSymbolsym.Size = 5Map1.DrawShape Pts, symEnd If'设置线格式If Not g_line Is Nothing Thensym.color = moBlackMap1.DrawShape line_pts, symIf line_pts.Count > 1 Thensym.color = moRedsym.SymbolType = moLineSymbolsym.Size = 3Map1.DrawShape g_line, symEnd IfEnd If'设置面的格式If Not r Is Nothing Thensym.SymbolType = moFillSymbolsym.style = moDiagonalCrossFillsym.color = moBlueMap1.DrawShape r, symEnd IfIf Not elp Is Nothing Thensym.SymbolType = moFillSymbolsym.style = moDiagonalCrossFillsym.color = moRedMap1.DrawShape elp, symEnd IfIf Not ply Is Nothing Thensym.SymbolType = moFillSymbolsym.style = moDiagonalCrossFillsym.color = moGreenMap1.DrawShape ply, symEnd IfEnd SubPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim whichButton As MSComctlLib.Button************'画点If flagp = 1 ThenSet p = Map1.ToMapPoint(X, Y)Pts.Add pMap1.TrackingLayer.Refresh TrueEnd If'画线If flagl = 1 ThenIf g_line Is Nothing ThenSet g_line = New MapObjects2.LineEnd IfIf line_pts Is Nothing ThenSet line_pts = New PointsEnd IfSet p = Map1.ToMapPoint(X, Y)line_pts.Add pIf line_pts.Count = 1 Theng_line.Parts.Add line_ptsSet line_pts = g_line.Parts(0)End IfMap1.TrackingLayer.Refresh TrueMap1.RefreshEnd If'画面If flagpl = 1 ThenIf opt = 1 ThenSet ply = Map1.TrackPolygon ElseIf opt = 2 ThenSet r = Map1.TrackRectangle ElseIf opt = 3 ThenSet elp = Map1.TrackCircleEnd IfMap1.TrackingLayer.Refresh True End IfMap1.Refresh*******End SubPrivate Sub Command5_Click() '画点flagp = 1flagl = 0flagpl = 0End SubPrivate Sub Command7_Click() '画线flagl = 1flagp = 0flagpl = 0End SubPrivate Sub Command8_Click() '画多边形flagpl = 1flagp = 0flagl = 0opt = 1End SubPrivate Sub Command9_Click() '画矩形flagpl = 1flagp = 0flagl = 0opt = 2End SubPrivate Sub Command10_Click() '画圆flagpl = 1flagp = 0flagl = 0opt = 3End Sub(8)动态图层实现Private Sub Command3_Click()If OP = 0 ThenOP = 1Command3.Caption = "停止"Else: OP = 1OP = 0Command3.Caption = "开始"End IfEnd SubPrivate Sub Command2_Click()Dim rx As SingleDim ry As SingleDim i As Integer, j As IntegerDim Ent As IntegerConst Dx = 1Const Dy = 1Ent = Map1.TrackingLayer.EventCountIf Ent = 0 ThenMsgBox "请点击地图!"Exit SubEnd IfFor i = 1 To 50For j = 1 To Entrx = 2 * Rnd - 1ry = 2 * Rnd - 1Map1.TrackingLayer.Event(j - 1).Move rx * Dx, ry * DyDelay (Int(100 / Ent))Map1.TrackingLayer.Refresh TrueNext jNext iEnd SubPrivate Sub Map1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ********************If OP = 1 ThenDim oPoint As MapObjects2.PointSet oPoint = Map1.ToMapPoint(X, Y)Map1.TrackingLayer.Symbol(0).CharacterIndex = 101Map1.TrackingLayer.AddEvent oPoint, 0End IfEnd SubSub Delay(ss As Integer) '延时过程Dim start, checkstart = TimerDocheck = TimerLoop While check < start + ss * 0.001End Sub(9)鹰眼功能实现Private Sub Map2_AfterTrackingLayerDraw(ByVal hDC As stdole.OLE_HANDLE) '缩略图******Map2.DrawShape Map1.Extent, symMap2.RefreshEnd SubPrivate Sub Map2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Set pt = Map2.ToMapPoint(X, Y)Map1.CenterAt pt.X, pt.YEnd Sub(10)查询与分析1>.空间关系查询与分析部分代码如下:Private Function GetRecordsetBounds(recs As MapObjects2.Recordset) As MapObjects2.Rectangle' Get the bounds of the recordsetSet GetRecordsetBounds = NothingIf Not recs Is Nothing ThenDim bounds As MapObjects2.RectangleSet bounds = NothingSet Fld = recs("Shape")' For each feature in recordset...recs.MoveFirstDo While Not recs.EOF' get shape boundsDim shapeBounds As MapObjects2.RectangleIf Fld.Type = moPoint ThenDim pt As MapObjects2.PointSet pt = Fld.ValueDim ptBounds As New MapObjects2.RectangleptBounds.Left = pt.XptBounds.Top = pt.YptBounds.Right = pt.XptBounds.Bottom = pt.YSet shapeBounds = ptBoundsElseIf Fld.Type = moLine ThenDim l As MapObjects2.LineSet l = Fld.ValueSet shapeBounds = l.ExtentElseIf Fld.Type = moPolygon ThenDim p As MapObjects2.PolygonSet p = Fld.ValueSet shapeBounds = p.ExtentElseMsgBox "Invalid shape in GetRecordsetBounds!"End If' add shape bounds to totalIf bounds Is Nothing ThenSet bounds = shapeBoundsElsebounds.Union shapeBoundsEnd Ifrecs.MoveNextLoopSet GetRecordsetBounds = boundsEnd IfEnd Function***************Sub ExecuteSearch()On Error Resume Next' We're either searching with a single shape or a' record set. The search routines don't care so,' put the search shape(s) in a single variable' called shapes.Dim shapes As ObjectSet shapes = NothingIf Not g_searchShape Is Nothing Then Set shapes = g_searchShape If Not g_searchSet Is Nothing Then Set shapes = g_searchSetIf shapes Is Nothing Then Exit Sub' reset the selection and execute the searchScreen.MousePointer = 11Set g_selectedFeatures = NothingIf StrComp(List1.List(List1.ListIndex), "shape is within [Search Distance] of feature") = 0 Then ' Execute the SearchByDistance method on selected layerSet g_selectedFeatures = yers(Combo2.ListIndex).SearchByDistance(shapes, Text1.Text, "") Else' Execute the selected SearchByShape method on selected layerSet g_selectedFeatures = yers(Combo2.ListIndex).SearchShape(shapes, List1.ListIndex, "") End IfSet g_selectedBounds = GetRecordsetBounds(g_selectedFeatures)Map1.TrackingLayer.Refresh TrueScreen.MousePointer = 0End Sub2>.空间对象属性查询部分代码如下:Private Sub Combo1_Click()List1.ClearSet Rect = yers(Combo1.Text).RecordsFor Each Fld In Rect.FieldsIf Fld.Type = moString Then'Combo2.AddItem List1.AddItem ElseIf Fld.Type < 21 Then' Combo2.AddItem List1.AddItem End IfEnd IfNext FldPrivate Sub Command1_Click()Text1.Text = ""End SubPrivate Sub Command2_Click()On Error Resume NextSet Rectsel = NothingSet Rectsel = yers(Combo1.Text).SearchExpression(Text1.Text) 'Form1.Map1.FlashShape Rectsel.Fields("Shape").Value, 4Set Symsel = New MapObjects2.SymbolSymsel.SymbolType = yers(0).Symbol.SymbolTypeSymsel.color = moRedform1.Map1.RefreshEnd SubPrivate Sub Command3_Click()Set Rectsel = NothingForm5.HideEnd SubPrivate Sub Command4_Click(Index As Integer)If mand4(0) ThenText1.Text = Text1.Text & mand4(0).CaptionElseIf mand4(1) Then********End IfEnd SubPrivate Sub Form_Load()Combo1.ClearFor Each l In yersCombo1.AddItem NextCombo1.Text = Combo1.List(0)End SubPrivate Sub Form_Unload(Cancel As Integer)Set Rectsel = Nothingform1.Map1.RefreshEnd SubPrivate Sub List1_Click()Set Rect = yers(Combo1.Text).RecordsDo While Not Rect.EOFList2.AddItem Rect.Fields(List1.List(List1.ListIndex)).ValueAsString Rect.MoveNextLoopText1.Text = Trim(Text1.Text & Trim(List1.Text))End SubPrivate Sub List2_Click()Text1.Text = Trim(Text1.Text & " '" & Trim(List2.Text) & " ' ")End Sub2>.空间对象属性查询代码如下:Private Sub Combo1_Click()List1.ClearList2.ClearSet Rect = yers(Combo1.Text).RecordsFor Each Fld In Rect.FieldsList1.AddItem Next FldEnd SubPrivate Sub Command1_Click()Form6.HideEnd SubPrivate Sub Combo2_Change()Text1.Text = Text1.Text & Combo1.TextEnd SubPrivate Sub Form_Load()Combo1.ClearFor Each l In yersCombo1.AddItem NextCombo1.Text = Combo1.List(0)'Combo2.Text = Combo2.List(0)End SubPrivate Sub List1_Click()On Error Resume NextList2.ClearSet oSta = yers(Combo1.Text).Records.CalculateStatistics(List1.List(List1.ListIndex)) List2.AddItem "最大值: " & oSta.MaxList2.AddItem "最小值: " & oSta.MinList2.AddItem "平均值: " & oSta.MeanList2.AddItem "总计: " & oSta.SumList2.AddItem "数目: " & oSta.CountList2.AddItem "标准差: " & oSta.StdDevEnd Sub(11)属性表Private Sub Combo1_Click()List1.ClearListView1.ColumnHeaders.ClearListView1.ListItems.ClearDim K As IntegerSet Rect = yers(Combo1.Text).RecordsFor Each Fld In Rect.FieldsList1.AddItem Set Col = ListView1.ColumnHeaders.Add()Col.Text = Next FldDo While Not Rect.EOFSet Lisit = ListView1.ListItems.Add(, , Rect.Fields(List1.List(0)).ValueAsString)For K = 1 To List1.ListCount - 1Lisit.SubItems(K) = Rect.Fields(List1.List(K)).ValueAsStringNext KRect.MoveNextLoopEnd SubPrivate Sub Form_Load()Combo1.ClearFor Each l In yersCombo1.AddItem NextCombo1.Text = Combo1.List(0)End SubPrivate Sub Form_Unload(Cancel As Integer)Combo1.ClearListView1.ColumnHeaders.ClearListView1.ListItems.ClearEnd SubPrivate Sub List1_Click()ListView1.ColumnHeaders.ClearListView1.ListItems.ClearSet Col = ListView1.ColumnHeaders.Add()Col.Width = 3000Col.Text = List1.TextSet Rect = yers(Combo1.Text).RecordsDo While Not Rect.EOFSet Lisit = ListView1.ListItems.Add(, , Rect.Fields(List1.List(List1.ListIndex)).ValueAsString) Rect.MoveNextLoopEnd Sub(12)图层信息显示代码见右菜单实现处(13)专题制图此部分功能包括唯一值法、分类着色法、点密度法、图标渲染法、组合着色法和地图标注,部分代码如下:Private Sub wyzf_Click() '唯一值法*****Set lyr = yers.Item(0)Set recs = lyr.RecordsDo While Not recs.EOFstrings.Add recs("STATE_NAME").Value recs.MoveNextLoopSet lyr.Renderer = New ValueMapRenderer lyr.Renderer.Field = "STATE_NAME" lyr.Renderer.ValueCount = strings.Count For i = 0 To strings.Count - 1lyr.Renderer.Value(i) = strings(i)Next iMap1.RefreshEnd SubPrivate Sub flzsf_Click()********Set lyr = yers.Item(0) '分类着色Set lyr.Renderer = cbrWith cbr.Field = "pop1990".BreakCount = 3.Break(0) = 100000.Break(1) = 1000000.Break(2) = 10000000.Symbol(0).color = moRed.Symbol(1).color = moGreen.Symbol(2).color = moBlueEnd WithMap1.RefreshEnd SubPrivate Sub dmdf_Click() '点密度法******Set lyr = yers.Item(0)Set lyr.Renderer = ddrWith ddr.Field = "pop1990".DotV alue = 120000End WithMap1.RefreshEnd SubPrivate Sub tbxrf_Click() '图标渲染********Set lyr = yers.Item(0)Set lyr.Renderer = crWith cr.ChartType = moBar.FieldCount = 2.Field(0) = "white".color(0) = moRed.Field(1) = "black".color(1) = moGreenEnd WithMap1.RefreshEnd SubPrivate Sub zhzsf_Click() '组合着色********With cbr.Field = "pop1990".BreakCount = 3.Break(0) = 100000.Break(1) = 1000000.Break(2) = 10000000End WithWith cr.ChartType = moBar.FieldCount = 2.Field(0) = "white".Field(1) = "black"End Withgr.Add cbrgr.Add crSet lyr = yers.Item(0)Set lyr.Renderer = grMap1.RefreshEnd SubPrivate Sub dtbz_Click() '地图标注**************Set lyr = yers.Item(0)Set lyr.Renderer = lrlr.Field = "state_name"Map1.RefreshEnd Sub四、实验总结4.1、实验中遇到的困难1、在刚开始做实验的时候,由于文件的保存路径不一样,导致加载图层的时候出现错误2、在下面一个实验中,程序时的代码出错,导致程序无法运行3、在第三个实验中,无法加载图标或者加载按钮图像的时候,没有显示图像;在加载shape文件后按按钮进行放大、缩小的操作的时候,无法对图像进行放大缩小等操作。

相关文档
最新文档