资源描述
GIS,开发与应用,芮小平,2008.1,中科院研究生院,MapX,专题图的制作,发布应用程序,地图的复杂编辑,鹰眼图的制作,空间查询与空间分析,MapX,地图符号样式的定制,第,8,章,MapX,的二次开发高级技术,1,MapX,专题图,专题制图是一种用来分析和表现数据的强有力的方式。以图形来表示数据,使您可以在地图上看到数据。使用专题渲染在地图上显示数据时,在数据列表中几乎无法显现的样式和趋势可以清晰地展现在您眼前。,专题通常使用数据集中的一组或多组数据。专题利用颜色渲染、填充图案、符号、直方和饼图表示数据。,根据数据中的特定值指派这些颜色、图案或符号,可以创建不同的专题地图。,设计专题图,专题变量 :,专题地图上显示的数据称为专题变量。根据所执行的专题分析类型,地图可以显示一个或多个专题变量。,范围、格网渲染、等级符号、点密度、独立值都只检查一个变量。,直方图和饼图一次可以显示多个专题变量。,也可以创建双变量专题地图,在这里一个地图对象(例如符号)表示两组不同数据。例如符号颜色代表一个专题变量,符号大小代表另一个专题变量。,数据来源位置:,开始应用专题地图前,需要决定要显示哪些信息以及信息驻留的位置。创建专题所用的数据来自数据集的,Field,对象或,Fields,集合。这些字段作为,Themes,集合的,Themes.Add,方法的,Fields,参数来传递。,方法,描述,代码示范,Add,创建专题并将它添加到特定数据集的,Themes,集合中。,Map1.Datasets(1).Themes.Add,miThemeRanges,“,TotPop,”,“,My _Ranges Theme,”,Remove,从集合中删除指定专题。,Map1.Datasets(1).Themes.Remove,“,My _Ranges Theme,”,RemoveAll,从集合中删除所有专题。,Map1.Datasets(1).Themes.RemoveAll,Themes,集合,每个数据集都有专题集合。,Themes,集合从专题集合中创建、计数、添加或删除,Theme,对象。,创建专题,Map1.Datasets(1).Themes.Add,miThemeRanges,“,TotPop,”, “My Ranges Theme”,上面一行代码使用字段“,TotPop,”,为,Datasets,集合中的第一个数据集创建范围专题。,Themes.Add,方法描述如下。可选参数位于方括号“,”,中。,语法,Themes.Add,Type, Field, Name,部 件,描 述,Type,指定要创建的专题地图类型。采用,ThemeTypeConstants,。,为可选参数,如果没有指定该参数(或者指定为,miThemeAuto,),,那么,MapX,将根据接受的字段数量和已显示的其它专题类型来选择合适的默认类型。如果,MapX,无法选择默认专题类型,将产生错误。,Field(S,),指定专题地图中要使用的字段。可以通过名称、索引或,Field,对象指定字段。如果使用多个变量创建专题,将接受一组字段名称、索引或,Field,对象。这是可选参数,如果没有指定该参数,那么,MapX,将使用,DataSet,的第一个数值字段。,Name,指定专题地图名称。这是字符串类型的参数。它是可选参数,如果没有指定该参数,,MapX,将生成一个名称,诸如,StatesBySales,。,类 型,对应整数,描 述,MiThemeRanged,0,范围,专题,MiThemeBarChart,1,直方图,专题,MiThemePieChart,2,饼图,专题,MiThemeGradSymbol,3,等级符号,专题,MiThemeDotDensity,4,点密度,专题,MiThemeIndividualValue,5,独立值,专题,MiThemeAuto,6,MapX“best,guess”,专题,专题类型常量,专题对象,属性,描 述,AutoRecompute,控制当专题属性更改时何时重新计算专题范围(如范围数量)。,默认为,True,。,ComputeTheme,控制是否计算专题。默认为,True,。,值为,True,时将通过原始数据计算专题。如果值被设为,False,,,那么将创建不可见的,Theme,对象,并且,对于独立值专题具有,20,个范围,对于范围专题具有,5,个范围。接着可以设置最大、最小值来定义专题。,DataMax,确定最大值以设置专题范围,或者计算当,ComputeTheme,设为,False,时范围专题同等大小的范围。,DataMin,确定最小值以设置专题范围或计者计算当,ComputeTheme,设为,False,时范围专题同等大小的范围。,Theme,对象设置,Themes,集合中专题的属性。修改,Theme,对象方法和属性确定了如何查看专题以及专题类型等。,Fields,返回只读,Fields,集合,该集合表示由此专题所依据的数据集使用的字段集合。,Layers,返回,Layer,对象的只读属性,该属性表示专题所依据的图层。,Legend,每个,Theme,对象都有,Legend,对象(,Theme.Legend,)。,legend,对象包含控制专题图例显示的属性。每个,ThemeCategory,对象(,RangeCategory,、,IndividualCategory,或,MultiVarCategory,),在图例中都有条目,条目保存在,LegendText,对象中。,Name,专题名称。在,Themes,集合中必须唯一。可读,/,写属性,或者被指定为,Themes.Add,方法的参数,或者在创建专题时由,MapX,创建。这是,Theme,对象的默认属性。,ThemeProperties,ThemeProperties,对象包含定义专题的信息(范围定义、显示样式设置等)。,Type,专题对象的专题类型。这是,ThemeTypeConstants,值,只读属性。,Visible,指定专题是否可见。默认为,True,。,独立值专题图,范围专题图,等级符号专题图,点密度专题图,直方图专题图,饼图专题图,同时创建两个专题,图,专题图类型,1.,独立值专题图,独立值地图显示通过特定数据集字段包含的独立值渲染点、线或边界。在独立值地图中可以使用数值和名词性值。,MapX,赋予每个唯一值自己的颜色或符号。当独立值地图使用样式类型时,采用地图的默认样式。,使用名词性数据渲染点、线或边界时,只能用独立值进行渲染。,名词性数据可以是非数值数据(例如,名称、菜系或销售的汽车品牌),也可以是其数字代表非数值数据的数值数据。,日期被作为数值数据,它可以用于范围和独立值地图。,独立值专题地图设置受,IndividualValueCategories,集合影响,该集合是,IndividualValueCategory,对象的集合,专题中的每个唯一值有一个对象。要取得,IndividualValueCategories,集合,请参考,ThemeProperties.IndividualValueCategories,属性。,Private Sub Command1_Click(),Dim,ds,As,MapXLib.Dataset,Dim,MapData,As Database,DBName,=,GetSetting(App.Title, Settings, _,MapDatabasePath, App.Path + ,Mapstats.mdb,),判断文件是否存在,If,Dir(DBName,) Then ,如果存在,Set,MapData,=,OpenDatabase(DBName,),End If,Dim,rs,As,Recordset,Set,rs,=,MapData.TableDefs(USA).OpenRecordset,Dim,BindLyr,As New,BindLayer,BindLyr.LayerType,=,miBindLayerTypeNormal,BindLyr.LayerName,= USA,Set,ds,= Map1.DataSets.Add(miDataSetDAO,rs,rs.Name, , ,BindLyr,),ds.Themes.Add,miThemeIndividualValue, GEONAME,End Sub,创建范围专题图时,,MapX,将所有数据集组合到各范围中,并且依据每个行对象的对应范围为它们指派颜色、符号或线。,范围类型,MapX,使用五种分配方法自动创建范围:,等计数、等范围、自然划分、标准偏差,和,分位数,。通过,ThemeProperties,对象的,DistMethod,属性可以设置范围。,2.,范围专题图,Private Sub Command1_Click(),Dim,ds,As,MapXLib.Dataset,Dim,MapData,As Database,DBName,=,GetSetting(App.Title, Settings, ,MapDatabasePath, App.Path + ,Mapstats.mdb,),判断文件是否存在,If,Dir(DBName,) Then ,如果存在,Set,MapData,=,OpenDatabase(DBName,),End If,Dim,rs,As,Recordset,Set,rs,=,MapData.TableDefs(world).OpenRecordset,Dim,BindLyr,As New,BindLayer,BindLyr.LayerType,=,miBindLayerTypeNormal,BindLyr.LayerName,= World Countries,Set,ds,= Map1.DataSets.Add(miDataSetDAO,rs,rs.Name, , ,BindLyr,),ds.Themes.Add,miThemeRanged, TOTPOP,ds.Themes(1).AutoRecompute = False,ds.Themes(1).ThemeProperties.DistMethod =,miNaturalBreak,ds.Themes(1).ThemeProperties.NumRanges = 10,ds.Themes(1).AutoRecompute = True,ds.Themes(1).Visible = True,End Sub,等级符号地图使用符号表示不同值。等级符号和所使用的数据类型无关。例如,可以使用等级符号显示各州的销售排名。在等级符号专题中,,MapX,根据销售排名字段中的值改变每个符号的大小。也可以使用代表客户兴趣大小的不同的符号来表示每个客户对给定产品所表现的兴趣。,3.,等级符号专题图,Private Sub Command1_Click(),Dim,ds,As,MapXLib.Dataset,Dim,MapData,As Database,DBName,=,GetSetting(App.Title, Settings, _,MapDatabasePath, App.Path + ,Mapstats.mdb,),判断文件是否存在,If,Dir(DBName,) Then ,如果存在,Set,MapData,=,OpenDatabase(DBName,),End If,Dim,rs,As,Recordset,Set,rs,=,MapData.TableDefs(Asia).OpenRecordset,Dim,BindLyr,As New,BindLayer,BindLyr.LayerType,=,miBindLayerTypeNormal,BindLyr.LayerName,= Asia,Set,ds,= Map1.DataSets.Add(miDataSetDAO,rs, _,rs.Name, , ,BindLyr,),ds.Themes.Add,miThemeGradSymbol, TOTPOP,End Sub,4.,点密度专题图,点密度地图使用点表示一范围或区域内的数据值。,Private Sub Command1_Click(),Dim,ds,As,MapXLib.Dataset,Dim,MapData,As Database,DBName,=,GetSetting(App.Title, Settings, _,MapDatabasePath,App.Path,+ ,Mapstats.mdb,),判断文件是否存在,If,Dir(DBName,) Then ,如果存在,Set,MapData,=,OpenDatabase(DBName,),End If,Dim,rs,As,Recordset,Set,rs,=,MapData.TableDefs(World).OpenRecordset,Dim,BindLyr,As New,BindLayer,BindLyr.LayerType,=,miBindLayerTypeNormal,BindLyr.LayerName,= World Countries“,Set,ds,= Map1.DataSets.Add(miDataSetDAO,rs,rs.Name, , ,BindLyr,),ds.Themes.Add,miThemeDotDensity, TOTPOP,ds.Themes(1).AutoRecompute = False,ds.Themes(1).ThemeProperties.ValuePerDot = 5000000,ds.Themes(1).ThemeProperties.DotSize =,miDotSizeLarge,ds.Themes(1).ThemeProperties.DotColor =,vbRed,ds.Themes(1).AutoRecompute = True,ds.Themes(1).Visible = True,End Sub,5.,直方图专题图,与一个变量的专题地图(例如范围或可变符号地图)不同,直方图专题图一次可以反映几个专题变量。在对象中心,针对每个地图对象(图元)建造直方图,通过比较直方高度可以分析特定图表中的专题变量。也可以检查地图中所有图表的同一变量。,Private Sub Command1_Click(),Dim,ds,As,MapXLib.Dataset,Dim,MapData,As Database,DBName,=,GetSetting(App.Title, Settings, _,MapDatabasePath, App.Path + ,Mapstats.mdb,),判断文件是否存在,If,Dir(DBName,) Then,如果存在,Set,MapData,=,OpenDatabase(DBName,),End If,Dim,rs,As,Recordset,Set,rs,=,MapData.TableDefs(USA).OpenRecordset,Dim,BindLyr,As New,BindLayer,BindLyr.LayerType,=,miBindLayerTypeNormal,BindLyr.LayerName,= USA,Set,ds,= Map1.DataSets.Add(miDataSetDAO,rs,rs.Name, , ,BindLyr,),Dim cols(1 To 2) As String,cols(1) = FEMPOP,cols(2) = MALEPOP,ds.Themes.Add,miThemeBarChart, cols,End Sub,6.,饼图专题图,使用饼图的专题图,您也可以一次对每行中多个变量进行检查。类似于比较直方图中的直方,在饼图中可以比较单个饼图中饼扇的大小,也可以拿单个饼扇和其它饼图比较。使用饼图可以比较部分与整体的关系。,Private Sub Command1_Click(),Dim,ds,As,MapXLib.Dataset,Dim,MapData,As Database,DBName,=,GetSetting(App.Title, Settings, ,MapDatabasePath, App.Path + ,Mapstats.mdb,),判断文件是否存在,If,Dir(DBName,) Then ,如果存在,Set,MapData,=,OpenDatabase(DBName,),End If,Dim,rs,As,Recordset,Set,rs,=,MapData.TableDefs(World).OpenRecordset,Dim,BindLyr,As New,BindLayer,BindLyr.LayerType,=,miBindLayerTypeNormal,BindLyr.LayerName,= World Countries“,Set,ds,= Map1.DataSets.Add(miDataSetDAO,rs,rs.Name, , ,BindLyr,),Dim cols(1 To 2) As String,cols(1) = TOTFEMPOP,cols(2) = TOTMALPOP,ds.Themes.Add,miThemePieChart, cols,End Sub,Set,ds,= Map1.DataSets.Add(miDataSetDAO,rs,rs.Name, , ,BindLyr,),ds.Themes.Add,miThemeIndividualValue, ,GEONAME,Dim cols(1 To 2) As String,cols(1) = FEMPOP,cols(2) = MALEPOP,ds.Themes.Add,miThemePieChart, cols,7.,同时创建两个专题图,控制专题图,所有专题图的属性都可以在运行期间进行调整,有两种办法可以控制专题图:,1.,使用,Theme.ThemeDlg,方法,2.,使用专题对象的,ThemeProperties,对象属性,专题对象可以使用,ThemeDlg,方法,此方法显示对话框使用户可以修改专题。,以下代码行显示了如何调用该方法。,Map1.Datasets(1).Themes(1).ThemeDlg,ThemeDlg,方法,当用户双击一专题图的图例时,触发地图控件的,ThemeModifyRequested,事件,可以在该事件响应函数中编写代码,让用户修改专题图或图例的属性。,例:,Private Sub Map1_ThemeModifyRequested(ByVal Theme As Object),Theme.ThemeDlg,End Sub,ThemeProperties,对象,通过设置,ThemeProperties,对象,可以使用自己定制的界面,给用户有限的修改能力。,ThemeProperties,对象是,Themes,集合中的一员,主要用于定义专题地图的显示(颜色、符号等)。,自定义专题图例,在创建专题地图时,,MapX,自动创建图例,解释颜色、符号或大小的意义。,Legend,对象,每个专题都有,Legend,对象(,Theme.Legend,),Legend,对象包含可以控制图例显示的属性。,使用,Legend,对象的,LegendDlg,方法可以很容易地进行修改。,Map1.Datasets(1).Themes(1).Legend.LegendDlg,2,发布应用程序,当把,MapX,应用程序交付给客户,需要安装以下项目。它们是:,(1),已开发的应用系统软件。,(2)MapX,控件,以及与它相关的文件。,(3),在应用系统中用到的地图文件,(,栅格图像和矢量电子地图,),和地图集,Geoset,。,如果把,MapX,的各个部分的安装都集成到应用程序的安装过程中,则用户就不必单独进行,Mapx,的安装了。那么我们制作的安装程序需要完成以下工作:,(1),将必需的文件安装到用户计算机上。包括应用程序和,Mapx,相关程序以及数据,(,库,),。,(2),运行实用工具,(,例如,regsvr32.exe),把特定的文件注册到用户的系统中。,(3),将特定键值添加到,windows,注册表中。,(4),在应用程序运行时接受,MapX,许可字符串。针对,Microsoft Visual C+,。,我们可以利用安装工具,Installshield,等来制作安装程序。,Installshield,在,MapX,的安装光盘上附带有。,安装,MapX,OCX,控件,MapX,的必需文件,包括:,Windows,公用,DLL,文件和,MapX,程序文件。,1)Windows,公用动态链接库,DLL,文件,2)MapX,程序文件,3)MapX,字体文件,可选文件,1)NADCON,支持文件,2),位图符号,3),栅格图像支持,4)ODBC,支持,5)Notes,文档支持,安装数据集驱动程序,由于数据集驱动程序是,MapX,应用的重要组成部份,因此,,MapX,数据集驱动程序的必须安装正确。,地图数据的安装,首先,利用安装程序将所有的地图文件,即与应用程序的地图集,Geoset,相关的表都放在指定的目录下。,注意如果使用了多个,Geoset,则必须检查每一个,Geoset,中的表的路径是否正确,是否完整。,Maplnfo,建议将所有的表放到同一个目录下,可以防止意外的发生。实际上,在注册,Geoset,的过程中,,Geoset,的路径名要有驱动器号。,其次,注册,Geoset,。,注册,Geoset,是把和此,Geoset,有关的每一张,Maplnfo,表注册到,GeoDictionary,中的简便方法。通过把,MapInfo,表注册在,GeoDictionary,中,就可以用此表来作自动绑定了。,GeoDictionary,管理器的应用程序是,GeoDictionaryManager40.exe,,当注册,Geoset,时,,GeoDictionaryManager40.exe,就会将合适的项添加到,GeoDictionary,中,(,geodict.dct,),。,如果,GeoDictionary,不存在,管理器就会创建它。,注册的命令行如下:,GeoDictionaryManager40,Exe ,。,MapX,默认使用了,3,个系统注册表键值。如果在系统中安装了:,MapX,,则,MapX,会创建这,3,个键值。如果对于未安装,MapX,的系统,要靠应用系统的安装程序来注册这些键值。,这些键值如表所示。,添加系统注册表信息,键 值,描述信息,HKEY_LOCAL_MACHINESoftwareMapInfoMapX5.0GeoDictionary,字符串类型。该键值中有,GeoDictionary,文件的指定文件路径,HKEY_LOCAL_MACHINESoftwareMaplnfokMapX5.0SearchPaths,字符串类型。该键值中有用分号隔开的可能存在地图文件和,Geoset,的指定文件。默认为”,HKEY_LOCAL_MACHINESoftwareMaplnfoMapX5.0CommonDLLDir,字符串类型。该键值中有,OCX,及支持文件所在的位置,MapX,使用的系统注册表键值,安装栅格图像处理程序,在地理信息系统的应用中,地图为了直观,一般会采用扫描的或者航拍的栅格地图作为底图来显示。为了使,MapX,可以打开和修改这些各种栅格图像,在发布应用程序时必须包含一些图像处理的驱动程序。,MapX,对于不同格式的栅格图像有不同的驱动程序,(,dll,文件,),。在加载栅格图像时,,MapX,会查找这些,dll,文件,并询问此,dll,文件是否可以读取给定的图像文件。如果回答是确定,则,MapX,就知道了该,dll,驱动程序与该类型栅格图像文件的对应关系。,栅格图像处理程序命名为,XXXXXXXXX.RHX,。扩展名以,RH,开始,任意字母作结束符。在搜索处理程序时,,MapX,以,RHA,开始,接着是,RHB,,一直到,RHZ,。这样的搜索顺序具有一定的好处,例如,SPOT,卫星影像文件需要在其他所有格式之前检查,因为它是未经处理的原始数据,有可能与其他格式混淆。因此将其靠前排列:,RHD,。而,Halo,格式则是标准的内置格式,因此放在靠后的位置上:,RHY,。,对于,LeadTools,驱动程序,是将整幅的栅格地图加载到内存中,因此加载过程比较慢,但是在用户平移和缩放地图时,速度比较快。而,Halo,驱动程序则使将要显示的部分地图加载到内存中,因此加载速度比较快,但平移和缩放时就比较慢。由于,Halo,驱动在,MapX,中,的命名后缀为,RHV,,而,LeadTools,的后缀为,RHX,。,因此,一般首先使用的是,Halo,驱动程序。,图元的动态绘制,图元的移动和伸缩,图元的合并、相交和擦除,图元的复制、剪切和粘贴,图元空间数据的获取,3,地图的复杂编辑,在,MapX,中用户可以在地图的特定图层上绘制图元,并动态的更新。具体的方法有:,1,、使用,MapX,内置图元编辑工具,2,、使用,FeatureFactory,方法,图元的动态绘制,通过使用,MapX,内置图元编辑工具,miAddLineTool,、,miAddPolyLineTool,、,miAddRegionTool,和,miAddPointTool,可以分别实现直线、折线图元、多边形区域图元和点图元的动态绘制。方法如下:,首先,设置待编辑图层,Editable,属性使之可编辑,并设置图层集合的,InsertionLayer,属性,例如:,Dim,lyrInsertion,as,MapXlib.Layer,Set,lyrInsertion,= Map1.Layers(2),lyrInsertion.Editable,= True,Set Map1.Layers.InsertionLayer =,lyrInsertion,MapX,内置图元编辑工具,然后当用户选择添加某种类型的图元时,设置,Map.CurrentTool,属性为相应工具,例如当用户选择添加折线图元时:,Set Map1.CurrentTool =,miAddPolylineTool,这样用户就可在地图上通过单击鼠标完成折线图元的绘制,(,用户双击鼠标或按回车键结束输入,),。图元绘制完毕后,,MapX,会将新图元添加到当前地图的,InsertionLayer,中。,MapX,内置图元编辑工具,使用,MapX,内置图元编辑工具所提供的图元绘制功能非常有限,而使用,FeatureFactory,方法可以实现更灵活的图元绘制。,在程序中首先声明自定义工具:,Public Const,MyAddLineTool,= 106 ,直线绘制工具,Public Const,MyAddPolyTool,= 107 ,折线绘制工具,然后,在地图窗体加载过程中生成各自定义图元绘制工具:,使用,FeatureFactory,方法,Private Sub,Form_Load,( ),生成直线绘制工具,Map1.CreatCustomTool,MyAddLineTool,miToolTypeLine,miCrossCursor,生成折线绘制工具,Map1.CreatCustomTool,MyAddPolyLineTool,miToolTypePoly,miCrossCursor,End Sub,接着,在,Map1_ToolUsed,事件中完成直线图元、矩形图元、圆形图元、椭圆图元、矩形区域图元、圆形区域图元、椭圆形区域图元、符号图元和文本图元的绘制。,图元的移动和伸缩,在绘制和编辑地图的过程中,用户常常需要改变已经绘制的图元,例如将图元移动位置,或者将图元的大小变化一下,这些功能都能通过,MapX,提供。,MapX,中提供了两种地图编辑模式:图元编辑模式和节点编辑模式。通过设置,Map.FeatureEditMode,属性来控制地图的编辑模式。,设置地图编辑模式为,图元编辑模式,Map1.FeatureEditMode =,miEditModeFeature,设置地图编辑模式为,节点编辑模式,Map1.FeatureEditMode =,miEditModeNode,1,、图元编辑模式,图元编辑模式下,在设置图层的,Editable,属性为,True,后,可以使用,MapX,内置的,miSelectTool,工具对选中的一个或多个图元进行移动和伸缩操作。,1),移动图元,用,miSelectTool,工具在选中图元的四个编辑柄,(,选中图元四周出现的小方块,),所组成的矩形区域那的任一位置处按下鼠标并拖动到指定位置即可。,2),改变图元大小,用,miSelectTool,工具在选中图元的四个编辑柄,(,选中图元四周出现的小 方块,),其中的一个,按下鼠标,会出现虚线表示伸缩的大小,拖动鼠标到指定的大小即可。,注意:如果设置图层的,Editable,属性为,True,,按,Delete,键还可以从图层中删除使用,miSelectTool,工具选中的图元。,2,、节点编辑模式,在节点编辑模式下,用户可以对组成图元的节点进行编辑。例如用户可以移动图元的部分节点,而保持其他节点位置不变。,1),移动图元节点,设置图层的,Editable,属性为,True,,使用,MapX,内置的,miSelectTool,工具选中图元后,该图元节点将被亮显。选中待移动的图元节点后,单击选中节点处并拖动鼠标即可对图元节点进行移动。,注意:在移动图元节点时,如果希望和选中节点重叠、但属于同图层其他图元 的节点一起移动,可以设置地图编辑属性如下:,Map1.FeatureEditMode =,miEditModeNode,or,miMoveDuplicateNodes,在节点编辑模式下,结合,miEditModeNode,和,miEditModeAddNode,属性值可以实现图元节点的添加操作。,首先,设置地图编辑属性:,Map1.FeatureEditMode =,miEditModeNode,or,miEditModeAddNode,然后使用,miSelectTool,工具单击图元即可完成图元节点的添加。,使用,Delete,键能删除使用,miSelectTool,工具选中图元的一个或多个节点。,注意:在删除图元节点时,如果希望和选中节点重叠、但属于同图层其他图元 的节点一起被删除,可以设置地图编辑属性如下:,Map1.FeatureEditMode =,miEditModeNode,or,miDeleteDuplicateNodes,2),节点的增删,MapX,中,,FeatureFactory,对象的,CombineFeatures,、,IntersectFeatures,和,EraseFeature,方法可完成多个图元的合并,(Combine),、求多个区域图元的交集,(Intersect),和图元的部分擦除,(Erase),。,1),图元的合并,调用方法如下:,Feature = OBJECT.CombineFeatures(feature1,feature2),CombineFeatures,方法只能对同一图层的线图元和区域图元进行合并,并合并的图元类型必须一致。线图元合并产生一个新的独立线图元,区域图元合并产生一个新的独立的区域图元。,图元的合并、相交和擦除,调用方法如下:,Feature = OBJECT.IntersectFeatures(feature1,feature2),IntersectFeatures,方法对多个图元进行交集操作,并产生一个新的独立图元代表该交集,该方法仅适用于线图元和区域图元。,图元交集操作的结果有如下几种情况:,a:,存在重叠的区域图元相交产生一个新的独立区域图元。,b:,交叉的线图元相交产生一个新的独立线图元,(,交叉点,),。,c:,存在重叠的线图元和区域图元相交的结果产生一个新的独立线图元,(,线图元包含在区域图元内的部分线段,),。,d:,不存在重叠的线图元和线图元,或不重叠的线图元和区域图元进行相交操作,结果是产生一个新的独立“零节点”线图元。,e:,不存在重叠的区域图元和区域图元进行相交操作,其结果是产生一个新的独立“零节点”区域图元。 “零节点”图元不能被添加到图层中。,2),图元的交集操作,调用方法如下:,Feature = ,OBJECT.EraseFeatures(Sourcefeature,Erasefeature,),EraseFeature,方法可擦除一个图元和其他图元重叠的部分,其结果是产生一个新的独立图元。被擦除的图元,(,Sourcefeature,),可以是线图元或区域图元,而用来擦除的其他图元的图元,(,Erasefeature,),必须是区域图元。,3),图元的擦除操作,图元的复制、剪切和粘贴,利用图元的,Clone,方法可以实现图元编辑中的复制、剪切和粘贴功能 。,MapX,本身提供的空间分析功能有限,所以在大型的,GIS,系统中,往往需要借助外部空间数据库,(,如,Oracle Spatial),来实现复杂的空间分析功能。利用空间数据库进行空间数据存储和空间分析的关键是获取图元的空间位置信息,方法如下。,图元空间数据的获取,1),定义图元空间信息数据类型,2),获取图元空间位置坐标的函数实现如下:,文本图元和符号图元的空间位置由图元的,CenterX,和,CenterY,属性获得,线型图元和区域图元的空间位置有图元的,Nodes,属性获得。另外一种获得线型图元和区域图元的方法是利用图元的,Parts,属性。,鹰眼图是,GIS,中的一个基本功能,它是为方便用户浏览地图而设的,其作用是,显示地图框中所显示的地图在图幅地图中的位置。,用户可以通过鼠标在鹰眼图任一位置处指定任意大小的矩形,则地图窗口将同步显示用户指定矩形区域内的地图,从而实现地图的快速定位和浏览。此外,鹰眼图还能方便、直观的表示出当前的浏览区域在整个地图区域中所处的位置。,4,鹰眼图的制作,鹰眼图功能的实现,首先,制作相应的鹰眼图集合,(.,gst,),文件。,鹰眼图集合文件中要包含一个鹰眼图层,,并在鹰眼图层中绘制一个代表主图显示区域的矩形框。为了使鹰眼图层中的矩形框能够指示当前主图区域在整幅地图的位置,还需要在鹰眼图集合文件中加入显示地理区划边界的若干图层作为鹰眼图的地理背景。,要通过一个单独的,MapX,控件来显示鹰眼图,与主地图的,MapX,控件独立。该控件可以与显示主图的,MapX,控件放在同一窗体中,也可以在一个单独的窗体中,来显示鹰眼图。,在主图的,MapViewChanged,事件中实现鹰眼图和主图的同步显示,即,当主图的视野区域发生变化时,鹰眼图中指示主图区域的矩形框相应的随之改变。,核心问题:,主图边界赋给鹰眼图,(,矩形框,),1,、鹰眼图与主图的同步显示,鹰眼图与主图的同步显示,Private Sub Map1_MapViewChanged(),Dim,ftr,As,MapXLib.Feature,Dim,ftrs,As,MapXLib.Features,Dim,rctMap,As New Rectangle,Dim,pnts,As New Points,Dim pnt1 As New Point,Dim pnt2 As New Point,Dim pnt3 As New Point,Dim pnt4 As New Point,Dim,styLine,As New Style,如果地图文件不存在,退出,If Map1.GeoSet = Then,Exit Sub,End If,接下页,Set,rctMap,= Map1.Bounds,pnt1.Set,rctMap.XMin,rctMap.YMax,pnt2.Set,rctMap.XMax,rctMap.YMax,pnt3.Set,rctMap.XMax,rctMap.YMin,pnt4.Set,rctMap.XMin,rctMap.YMin,pnts.Add,pnt1,将主图视野范围边界点加入点集合,pnts.Add,pnt2,pnts.Add,pnt3,pnts.Add,pnt4,pnts.Add,pnt1,styLine.LineColor,=,vbRed,定义样式的线条颜色,styLine.LineWidth,= 2,定义样式的线条宽度,接下页,将鹰眼层所有对象清空,Set,ftrs,= Map2.Layers.Item(,鹰眼,).,AllFeatures,For Each,ftr,In,ftrs,Map2.Layers.Item(,鹰眼,).,DeleteFeature,ftr,Next,在鹰眼层增加矩形框对象,框出对应的主图视野范围的边界,Set,ftr,= Map2.FeatureFactory.CreateLine(pnts,styLine,),Map2.Layers.Item(,鹰眼,).,AddFeature,ftr,End Sub,问题:,“,鹰眼”从何而来,?,怎样实现鹰眼图的功能,支持用户的两种导航操作方式:,a),当用户在鹰眼图中通过单击鼠标导航主图,将主图的中心坐标设为鼠标单击处的坐标;,b),当用户在鹰眼图中通过指定鹰眼矩形框来导航主图时,根据矩形框的坐标位置设定主图的边界。,鹰眼图导航功能的实现,鹰眼图上按下鼠标左键时,Private Sub Map2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single),If Button =,vbLeftButton,Then,在鹰眼图上单击鼠标,设置鼠标状态为,Begin,strMouseState,= Begin,获得鼠标单击位置的窗体坐标,PreX,= X,PreY,= Y,End If,End Sub,接下页,在鹰眼图上移动鼠标,时,Private Sub Map2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single),If Button ,vbLeftButton,Then,Exit Sub,End If,Dim,ftrmap,As Feature,Dim,ftr,As Feature,Dim,ftrs,As Features,Dim,rctMap,As Rectangle,Dim,pnts,As New Points,在鹰眼图上移动鼠标时,Dim pnt1, pnt2, pnt3, pnt4 As New Point,Dim,styLine,As New Style,Dim,sngX,sngY,As Single,Dim dblMapX1, Y1 As Double,Dim dblMapX2, Y2 As Double,接下页,得到鼠标单击点的地理坐标,sngX,=,PreX,sngY,=,PreY,Map2.ConvertCoord,sngX,sngY, dblMapX1, dblMapY1,miScreenToMap,得到鼠标当前点的地理坐标,Map2.ConvertCoord X, Y, dblMapX2, dblMapY2,miScreenToMap,设置矩形的四角,pnt1.Set dblMapX1, dblMapY2,pnt2.Set dblMapX2, dblMapY2,pnt3.Set dblMapX2, dblMapY1,pnt4.Set dblMapX1, dblMapY1,接下页,将矩形的四角加入点集中,pnts.Add,pnt1,pnts.Add,pnt2,pnts.Add,pnt3,pnts.Add,pnt4,pnts.Add,pnt1,styLine.LineColor,=,vbBlue,定义样式的线条颜色,styLine.LineWidth,= 2,定义样式的线条宽度,styLine.LineStyle,= 3,设置线条为虚线,接下页,将鹰眼层所有对象清空,Set,ftrs,= Map2.Layers.Item(,鹰眼,).,AllFeatures,For Each,ftr,In,ftrs,Map2.Layers.Item(,鹰眼,).,DeleteFeature,ftr,Next,Map2.GeoSet = Map1.GeoSet,在鹰眼层画虚线矩形框,框出用户欲选择的范围,Set,ftrmap,= Map2.FeatureFactory.CreateLine(pnts,styLine,),Map2.Layers.Item(,鹰眼,).,AddFeature,ftrmap,设置鼠标状态为,Move,strMouseState,= Move,End Sub,接下页,在鹰眼图上抬起鼠标,时,Private Sub Map2_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single),用户单击导航图上某点时的处理,If,strMouseState,= Begin Then,Dim dblMapX1 As Double,Dim dblMapY1 As Double,求出该点的地理坐标,Map2.ConvertCoord X, Y, dblMapX1, dblMapY1,miScreenToMap,设置主图中心为该点,Map1.CenterX = dblMapX1,Map1.CenterY = dblMapY1,End If,接下页,用户在导航图上框出矩形区域时的处理,If,strMouseState,= Move Then,Dim,sngXMax,sngYMax,As Single,Dim,sngXMin,sngYMin,As Single,If,strMouseState,= Move Then,If,PreX, X Then,sngXMax,= X,sngXMin,=,PreX,Else,sngXMax,=,PreX,sngXMin,= X,End If,If,PreY, Y Then,sngYMax,= Y,sngYMin,=,PreY,Else,sngYMax,=,PreY,sngYMin,= Y,End If,接下页,Dim,dblXMax,As Double,Dim,dblXMin,As Double,Dim,dblYMax,As Double,Dim,dblYMIn,As Double,求出矩形边界点的地理坐标,Map2.ConvertCoord,sngXMin,sngYMin,dblXMin,dblYMIn,miScreenToMap,Map2.ConvertCoord,sngXMax,sngYMax,dblXMax,dblYMax,miScreenToMap,Dim,rect,As New Rectangle,建立矩形对象,rect.Set,dblXMin,dblYMIn,dblXMax,dblYMax,将主图边界设置为矩形边界,Set Map1.Bounds =,rect,End If,处理完毕,重新设置鼠标状态为,Stop,strMouseState,= Stop,End Sub,鹰眼图开发时注意的问题,在定义鹰眼图的地图集合时,值得注意的是合理的取舍图层,因为它一个影响美观和效率的关键问题。,由于鹰眼图一般显示窗口较小,因此不易放置很多的细节图层,例如点类图层,标注图层等,一来这些图层在小区域中显示不易分辨,其次这类图层信息一般较多,影响程序的效率。要尽量放置一些区域图层,例如行政区划、水域陆地等图层,在鹰眼图中的效果很好。,5,空间查询与空间分析,空间查询既包括属性查询,也包括图形查询,还可以实现,图形与属性的交叉查询。,空间数据分析实际上就是对空间数据进行一系列的运算和查询。不同的应用具有不同的运算和查询的内容、方式和过程,也就是说,有不同的应用模型。,应用模型是在对具体对象与过程进行大量专业研究的基础上总结出来的客观规律抽象象。将它们归结成一系列典型的运算与查询命令,从而可解决某一类专业的空间分析任务。由于各种专业研究的对象、方法以及复杂程度有很大的差异,因而工具型的,GIS,只提供几种最通用最基本的分析模型,,常见的有地形分析、迭置分析、缓冲分析、网络分析、领域分析和重类分析等。,而各专业的应用模型有待于专业人员进行二次开发。,简单的空间查询与分析,1),根据图元查询属性,地图图元的属性数据以,Maplnfo,文件的形式存储,(,图层对应的,.tab,和,.,dat,文件,),。这里的属性不是指图元的地理属性,而是指和图元所代表的地理对象相关的抽象属性数据,例如城市图层中每一个城市的名称、人口、建立年代等属性数据。,注意:图元的每一项属性都对应一个字段,同一图层中的图元具有相同的字段。图元的每一项属性值即为图元所在图层中相应数据字段中的字段值。,以下示例代码给出了“图元属性数据提取工具”,InfoTool,的实现。当用户使用该工具选择一个图元时,系统就显示该图元所有
展开阅读全文