5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

急用,怎么读取地图文件(.tab)的数据

楼主xlfsprite(小丰)2002-04-11 20:57:21 在 Delphi / VCL组件开发及应用 提问

本人正在做一个GIS的毕业设计,也是首次接触GIS,本人是用  
  DELPHI开发工具,和MAPX控件和MAPINFO地画图软件开进行开发系统的,  
  但不知怎么与地图文件数据库相联(通过ODBC或其它都可以)并读取数据,对数据进行 简单的操作,如修改,查询的,望知道的朋友请告之,急盼! 问题点数:100、回复次数:6Top

1 楼milpas(我带着我的影子去流浪)回复于 2002-04-11 21:21:30 得分 0

先要知道格式吧,不知道你说的是不知道格试还是不知道访问数据库的方法?Top

2 楼xlfsprite(小丰)回复于 2002-04-11 21:45:10 得分 0

我用MAPINFO先建好几张图表(.tab)文件,我是说不知道访问数据的方法,还有对数据的一些操作!望告诉之,谢谢Top

3 楼mksnoopy(一起来)回复于 2002-04-11 21:51:01 得分 0

在mapx中,将地图和数据进行数据绑定.具体操作请看mapx的help文件.有关dataset的部分!Top

4 楼xlfsprite(小丰)回复于 2002-04-14 21:16:54 得分 0

照着MAPX的帮助不行,怎么联都联不起来!Top

5 楼xlf_boy(小猪)回复于 2002-05-07 15:32:50 得分 100

在MapX中,属性数据与几何数据的关联是通过数据绑定实现的。    
    (1)、   什么叫数据绑定    
    数据绑定是将外部数据引入MapX的过程。    
    可以绑定的数据源包括以下类型:    
   
  类型   描述    
  ADO   使用ADO(Active   data   objects)    
  DAO   DAO对象,可以是VB中的data   control、Access表格等,也可自己创建    
  Delphi   使用Borland   BDE数据源    
  Global   Handle   lets   you   pass   in   a   block   of   tab-delimited   data    
  Layer   创建一个Dataset,使用MapInfo表字段    
  Notes   View/NotesQuery   专门用于Lotus   Notes    
  ODBC   可以使用ODBC从任何ODBC数据源中获取数据    
  OLE   Data   用于containers,如PowerBuilder    
  RDO   MS   Remote   Data   Objects和RDO结果集对象    
  safeArra   COM数据集,与safearray中的数据进行静态绑定    
  Unbound   兼容其它    
   
    (2)、   数据绑定的强大作用    
    数据绑定主要有两个作用。    
    Ø   以地图中的图形对象来显示数据    
    通过数据绑定,可以将BindLayer对象作为一个参数,使用Datasets.Add方法将自己的表转变为一个DataSet。这将在地图中创建一个新的图层,并且将表中的数据以点等图形对象表示。一旦将数据引入地图,就可以很容易地使用MapX创建应用程序,并实现多种地图功能。    
    Ø   将属性数据绑定到地图中,并创建专题图    
    如果地图对象中包含相应的属性信息,也可以使用Datasets.Add方法将某个属性字段添加到地图中,进而就可以按照需要创建相关的专题图。    
    (3)、   数据绑定的实现方法    
    使用Datasets.Add可以将用户数据绑定到地图中。    
    在MapX中,每张地图对应多个图层(Layers),每一个图层(Layer)都有一个Datasets,其中包含DataSet对象。Datasets拥有一些属性和方法,用来在集合中添加和删除Dataset   对象,主要方法包括Add和Remove。    
    使用Datasets.Add绑定的最终结果是Dataset对象的创建。这个Dataset对象被加入到Datasets集合中,包含了被绑定图层的对象的计算结果。比如说,如果数据被绑定到US_States地图,每一个州将对应一个新的数据值,这个数据值被用来控制地图的绘制。如果数据源中含有某个州的多个记录,则这些记录的值可以进行累加、平均值等计算。使用Dataset的Value方法可以取得地图中每一个对象的计算结果。    
    DataSets.Add方法详解    
    Datasets.Add方法的使用主要需确定所绑定数据源的类型、绑定到地图的哪一层以及与地图之间关联的字段。语法如下:    
    Datasets.Add   Type,   SourceData,   [Name],   [Geofield],   [SecondaryGeofield],   [BindLayer],   [Fields],   [Dynamic]    
    []中的参数是可选的,程序中可以省略或传递EmptyParam。EmptyParam在Delphi中已定义的OleVariant类型参数,表示未用参数。    
    Ø   Type    
    Type的取值范围为DatasetType常量,对应于可绑定的数据类型,   DatasetType的定义如下:    
    DatasetType=[miDatasetADO,miDatasetDelphi,……,miDatasetLayer,miDatasetODBC,miDatasetUnbound]    
    其中miDatasetLayer表示绑定的是MapInfo表(.TAB),miDatasetODBC表示绑定的是ODBC   数据源中的表。    
    Ø   SourceData    
    根据DatasetType的不同,SourceData有不同的取值,如miDatasetLayer对应MapInfo表,miDatasetODBC对应ODBCQueryInfo对象等等。因此,在引如ODBC数据时,需要首先创建ODBCQueryInfo对象,并为其参数ConnectString、Datasource和SqlQuery赋值。    
    Ø   Name    
    String类型,唯一标识Dataset,默认名称为Dataset1、Dataset2……。    
    Ø   Geofield    
    指定数据源中包含地理信息的字段名称或索引。如果不指定,则MapX会自动在GeoDictionary中搜索,看哪个字段包含地理信息。比如在“世行项目”中,表T_DJQH的xzqybh字段其实就是用来标识地图中地级行政区划的,因此在调用Datasets.Add时Geofield参数即传递xzqybh。    
    如果要将数据表示为地图上的图形对象,数据源中GeoField所表示的字段必须唯一,并且被用来命名新的图层中的对象。非唯一值将在新的图层中以一点代替,重复记录对应的数据值将被求和。    
    如果定义了Fields,则Geofield参数将表示Fields中的字段,而不是sourcedata。    
    可以看到,Geofield在几何数据与属性数据关联中起了绝对关键的作用。    
    Ø   Secondary   Geofield    
    只有当被绑定的数据集有非唯一主键时才定义该参数。    
    Ø   BindLayer    
    指明外部数据应该绑定到地图中的哪一层。.该参数可选,未指定时MapX自动在GeoDictionary中查找相匹配的图层。但是从性能考虑,在肯定的情况下应当明确指定。    
    Ø   Fields    
    描述外接数据源中的哪些字段被引用,以及当数据源中有多条记录对应一个地图对象时使用哪些集合函数,默认的集合函数是SUM(求和)。    
    如果该参数有定义,则Geofield和SecondaryGeofield参数均将其作为参照。    
    Ø   Dynamic    
    布耳类型参数,用于控制数据绑定是否动态,默认为False,表示静态绑定,即当数据库被打开时MapX将拷贝所需数据;如果设定为True,MapX会以实时的方式访问数据。    
   
    三、   专题图的生成    
    1、   专题地图的概念    
    MapInfo的一个显著特征就是能将数据库中的信息进行直观的可视化分析。专题地图就是用于分析和表现数据的一种强有力的方式。用户可以通过使用专题地图的方式将数据图形化,使数据以更直观的形式在地图上体现出来。当使用专题渲染在地图上显示数据时,可以清楚地看出在数据记录中难以发现的模式和趋势,为用户的决策支持提供依据。专题地图是MapInfo中的一个重要概念,是用户使用好MapInfo的一种体现。    
    制作专题地图是根据某个特定专题对地图进行“渲染”的过程。所谓的专题渲染,就是以某种图案或颜色填充来表明地图对象(点、线、区域)的某些信息(例如人口、大小、年降雨量、日期等等),也就是说,这类渲染存在着主题,经过这样渲染的地图就是专题地图。利用MapInfo,可根据数据库表中特定的值来赋给地图对象颜色、图案或符号,从而创建不同的专题地图。    
    2、   专题图的六种类型    
    MapInfo为创建专题地图提供了强有力的支持。用户可以使用范围值、等级符号、点密度、独立值、直方图和饼图等多达六种方式来创建不同的专题地图。    
    (1)、   范围值    
    按照设置的范围显示数据。这些范围用颜色和图案进行渲染。范围专题地图能够通过点、线和区域来说明数值,在反映数值和地理区域的关系(如销售数字,家庭收入),或显示比率信息如人口密度(人口除以面积)时是很有用的。    
    (2)、   等级符号    
    等级符号为表中每条记录显示一个符号,符号大小与数据值成比例。等级符号地图用特定的数值来显示数据点,对于阐明定量信息(如由高到低依次变化)很有用处。符号的大小与该点对应的数值成比例,数值越大点就越大,数值越小点就越小。因此,等级符号最适合数据值数据。    
    (3)、   点密度    
    在地图上用点来显示数据,每一点都代表一定数量,某区域中点的总数与该区域数值成比例。每个点代表一定数量的单元,该数乘以区域内总的点数,就等于该区域的数据值。    
    (4)、   独立值    
    按独立数值渲染地图,可以表达多个变量。根据独立值绘制地图对象的专题地图有助于强调数据的类型差异而不是显示定量信息(如给定区域内的商店类型、分区类型等等)。    
    (5)、   直方图    
    将表中每条记录的专题变量显示为一个直方图。使用直方图可分析地图中每条记录的多个变量。比较每个直方图中各直方条的大小可考察表中某条记录,比较所有直方图中某一条的大小可考察所有记录的某个变量,而比较各直方图的高度可考察整张表。用直方图来表达负值时,该条会沿直方图反方向伸展。在叠加直方图中不显示负值。    
    (6)、   饼图    
    以饼图显示表中各记录的专题变量。饼图可包含多个变量。在地图上使用饼图可一次分析多个变量,比较每个图中饼扇的大小可考察表中某条记录,比较所有饼图中某一个饼扇,可考察所有记录中某个变量的变化,比较各饼图的直径可考察整张表。    
    3、   MapX对专题图的支持    
    MapX中使用Themes集合与Theme对象来实现对专题图的支持,每个Themes集合中可以包含多个Theme对象,也就是说,针对一个Dataset,可以创建多幅不同的专题地图。    
    每个Dataset都拥有一个Themes集合,并以其属性的形式存在,即Dataset.Themes。使用Themes的Add、Remove、RemoveAll等方法可以控制专题的添加和删除。    
    Ø   Add方法:创建一个专题并将其加入到某个特定的DataSet的Themes集合中,    
      Map1.Datasets(1).Themes.Add(miThemeRanges,’’’area’,’Myranges   Theme’)    
    Ø   Remove方法:从集合中删除某一特定的专题图    
      Map1.Datasets(1).Themes.Remove   "My   Ranges   Theme"    
    Ø   RemoveAll方法:从集合中删除所有的的专题图    
      Map1.Datasets(1).Themes.RemoveAll    
    Theme对象用于设置每个专题图的属性。    
    比较重要的有    
    Ø   Layer:返回一个Layer对象,表示该专题图所在的图层    
    Ø   Legend:控制   对专题地图的说明,即图例    
    Ø   ComputeTheme   控制是否可以对原始数据进行计算,默认为True    
    Ø   Type   即专题图类型,取值范围为ThemeTypeConstants    
    Ø   Fields   只读属性,返回该专题图所基于的Dataset中的字段集合    
    ThemeProperties   复合型属性,对应ThemeProperties对象,包含了专题图详尽的定义信息,如范围定义、显示风格设置等。    
    4、   专题图的规划    
    在创建专题图的过程中,有几个关键因素,包括专题图变量的确定、属性数据的获取以及专题图层的显示与控制。    
    (1)、   确定专题图变量    
    在专题图中显示的数据就是专题图变量。例如在行政区面积专题图中,表示面积的字段“area”就是这个Top

6 楼xlf_boy(小猪)回复于 2002-05-07 15:33:02 得分 0

 
    5、   控制专题地图    
    有两种方法可以控制专题地图。    
    (1)、   使用Theme.ThemeDlg方法    
    该方法显示一个对话框,用户可以直接修改专题图特性。语句如下:    
      curmap.Datasets(1).Themes(1).ThemeDlg;    
    这种方法虽然简单,但是而且很难与自己的程序风格相一致,用户界面不友好,而且在这个默认的对话框中,用户可以随意改变任何设置,使得程序的控制难度加大。    
    (2)、   改变ThemeProperties对象属性    
    通过设置ThemeProperties对象属性,可以使用自己定制的界面,给用户有限的修改能力,实现起来也非常简单,而且对用户的操作有全部的控制权。    
    ThemeProperties对象是Themes集合中的一员,主要用于定义专题地图的显示,包括颜色、符号等。不同类型的专题图有自己与众不同的一些特性,在ThemeProperties中有其分别的定义。如DotSize专用于设定点密度专题图中点的大小,NumRanges专用于设定范围值专题图中的范围分布,SymbolStyle控制等级符号专题图使用的符号类型,ValuePerDot用于在点密度专题图中每个点所代表的值。    
    ThemeProperties对象的属性中有许多又属于其他对象,如RangeCategory、IndividualValue、Style   等,可进行更深层次的设定。    
    6、   自定义图例    
    专题地图被创建后,MapX会自动生成一个图例来解释颜色、符号或大小所代表的含义。同ThemeDlg一样,可以直接用LegendDlg   方法调用默认的Legend对话框,但更常用的依旧是访问Theme.Legend   属性来进行一些个性化的设置。    
    如在程序中可以做如下设置:    
       var   lgd:   CMapXLegend;    
        lgd:=curmap.datasets.item(1).themes.item(1).legend;    
        with   lgd   do    
        begin    
        title:=´面积专题图´;    
        subtitle:=´图例´;    
        ShowCount   :=   false;//去掉默认生成的结果个数    
       end;    
    需要注意的是,Legend的Width和Height属性是只读的,显示位置应该由Top和Left改变,单位为屏幕象素点。    
    7、   代码分析    
    以下是面积专题图的实现代码:    
       procedure   Tmainform.Ntheme1Click(Sender:   TObject);    
        var    
        par   :   Variant;    
        ds   :   CMapXdataset;    
        fields:   CMapXFields;    
       begin    
       try    
       curmap.datasets.removeall;//清空数据集中的所有Dataset对象    
       par   :=   CreateOleObject(´MapX.ODBCQueryInfo.4´);//创建ODBCQueryInfo对象    
        //设定ODBCQueryInfo的参数    
       par.SqlQuery   :=   ´select   *   from   T_DJQH´;    
       par.DataSource   :=   maindm.MYDB.AliasName;    
        //par.ConnectString   :=   ´ODBC;user=user1;pwd=aaa;dlg=2´;    
        //对应ODBC表将要使用的字段引入fields    
       fields   :=   CoFields.Create;    
       fields.Add(´xzqybh´,´xzqybh´,miAggregationIndividual,miTypeNumeric);    
       fields.Add(´area´,   ´area´,   miAggregationIndividual,miTypeFloat);    
        //生成Dataset,并建立关联    
       ds   :=   Map1.Datasets.Add(miDataSetODBC,   par,   EmptyParam,    
       ´xzqybh´,   EmptyParam,   ´Djqh´,   fields,   EmptyParam);    
        //专题图    
       ds.Themes.Add(miThemeIndividualValue,   ´area´,   ´mytheme1´,true);    
        //自定义图例    
       with   ds.Themes.Item(1).legend   do    
       begin    
        title:=´面积专题图´;    
        subtitle:=´图例´;    
        ShowCount   :=   false;    
       end;    
       except    
        on   E:   EOleException   do    
         Application.MessageBox(PChar(E.Message),    
        ´错误´,   MB_OK   or   MB_ICONERROR);    
       end;    
       end;    
   
    说明:    
    (1)、   curmap是主界面中的地图变量;    
    (2)、   ds也可定义成variant类型变量,但这时无法使用ds.Themes.Item(1).legend,而且,定义为CmapXdataset后可使用Delphi中的智能代码功能,激活实时帮助系统,编程更方便;    
    (3)、   当使用Datasets.Add方法连接ODBC数据源数据时,第一个参数dataset类型应为miDatasetODBC,同时需要使用ODBCQueryInfo对象作为Datasets.Add方法的第二个参数,    
    Ø   DataSource属性    
    用于设置ODBC数据源的名字。如果保留不写,则在程序运行时会出现一个对话框,要求用户选择。ODBC数据源可以在Windows控制面板中设置。    
    Ø   SqlQuery属性    
    即从ODBC数据库中选取数据的SQL字符串。    
    Ø   ConnectString属性    
    包含与ODBC数据源连接的信息,通常包括"ODBC;"、"uid=",   "pwd=",   or   "DLG="。"uid="表示登录名,   "pwd="表示登录密码,"DLG="   控制登录对话框的显示:    
          DLG=0表示不显示对话框    
          DLG=1表示总显示对话框    
          DLG=2只有当信息不完整时显示登录对话框。    
   
   
   
  mapX的基本   性  
  MapX的基本属性    
  每个Map对象主要包括Datasets、Layers、Annotations三个对象集合。    
  Map对象有一些主要的属性,如Zoom用来设置放大级别(在地图上显示的大小),Rotation控制地图的旋转角度,CenterX和CenterY用于设置x和y的坐标系,这要取决于地图的投影。    
  Map对象的许多属性本身又是一个对象,比如说一幅地图由多个图层组成,则在一个Map对象中存在一个单独的layers集合,其中包含所有图层的信息。    
  Ø   Layers    
  在MapX中,每张单独的地图都被表示成单独的一个图层,所有的图层存储在layers集合中。Layers集合由Layer对象组成,按顺序编号为0到n。Layer对象由features对象组成,features对象又是由Feature对象组成,对应于地图中的点、线、区域或符号。    
  最上面一层为Layers(1),Layers(2)位于Layers(1)的下面,以次类推。最下面的图层最先绘制,最上面的图层最后绘制。在应用程序中,合理地安排好每层在Layers中的顺序是至关重要的。比如说有两个图层,一层为点,一层为区域,则应将点层放到区域层的上方,否则区域会将点覆盖。    
  另外,在进行地图选择操作时,根据要求调整图层的顺序也是十分重要的。MapX中的选择工具总是从可选择图层中的最上层开始选择,如果在地图上的同一位置存在多个位于不同层的地图对象,其结果是很难精确地选择到目标对象。因此,最好将被选择图层提到最上层显示。    
  Ø   GeoSets    
  GeoSet是在GeoManager中建立好的.GST文件,类似MapInfo中的WorkSpace概念,是图层及其设置的集合,控制程序中显示的地图。也可以在运行阶段设置GeoSet,此时将导致已经加载的所有图层和DataSet被删除而由GeoSet中定义的图层所代替。如果单纯地想删除所有图层,只需给GeoSet赋一个空字符串即可。    
  可以使用GeoSet   Manager程序来管理GeoSet   文件(*.GST)。默认情况下.GST文件存储在…\mapxmaps目录下,可以调用GeoDictionary   Manager程序进行修改,指向用户程序数据所在的位置。    
  Ø   Datasets    
  Datasets用于实现地图与数据的绑定。举例说明,有一个关于城市销售情况的MSAccess   数据库和一张该城市的地图,则可以将二者绑定,在地图上形象地显示出各城市销售业绩的趋势,这一点是表格数据无法做到的。    
  建立地图信息与属性数据之间联系的过程称之为自动绑定或自动匹配(autobinding   /automatching)。要实现这一过程,必须首先将地图在GeoDictionary   中注册。    
  属性数据表示的可视化使得创建专题地图成为可能。    
  数据绑定"Putting   Your   Data   on   the   Map"    
  专题地图"Theme   Mapping   and   Analysis"    
  Ø   Annotations    
  Annotations集合提供了操纵地图中文字和符号的简单方法。Annotations位于所有其它图层的上方并且不与任何数据连接,有点儿象MapInfo中的透明图层。    
  Annotations包括以下主要的属性与方法:AddSymbol在Annotations中增加符号,符号类型使用Map.DefaultStyle定义;AddText在Annotations中增加文本;Remove删除特定的标注.;Type取值为miSymbolAnnotation或miTextAnnotation。    
  Annotations还有一个非常重要的属性Graphic,其定义为Graphic对象,在该对象中包含了符号或文本的样式、位置等信息,即Graphic的Caption、Position、Style   、X、Y属性。如Annotations的Type属性定义为miTextAnnotation,则可以定义Graphic的Caption属性设置标注的字符串。    
  Ø   可创建对象    
  在MapX对象模型中,以下对象是可以被创建的:    
  AffineTransform、BindLayer、BitmapSymbols、CoordSys、Datum、Feature、Fields、LayerInfo、Map、   ODBCQueryInfo、   Parts、Point、Points、Rectangle、RowValue、RowValues、Style、Variables、NotesQueryInfo、NotesViewInfo。    
  在Delphi中创建这些对象需要注意一点,即在后面注明MapX的版本。如在本课题实现过程中,由于使用的是MapX   4.0版本,因此创建语句要写成    
  s   :=   CreateOleObject(´MapX.Style.3´);Top

相关问题

  • 如何让TC3.0读取特殊键(“例如shift → ← ↑↓等”)《急用》
  • 怎么用vb读取,编写,修改.ini文件,急用
  • 一个XSLT读取数据的问题?急用,谢了
  • 怎样读取excel里某个行列的值 ,急用!!1
  • 求助:label读取数据库内容时的不换行的问题? 急用!
  • 急!用net读取具体节点中的具体的值,怎么写呢?
  • 再次提问!!!希望高手帮忙!!急用!!关于读取xml的问题
  • 在COM里如何读取数据库中的表的数据?(急用,在线等候!)
  • “公文包”模式的数据读取,来者给分,解决问题者500分,不是催牛,我急用!!!
  • 急急急!!用C#如何读取EXCEL表格中的数据,再导入我数据库中!!

关键词

  • 数据
  • 属性
  • 字段
  • 地图
  • 对象
  • mapx
  • 绑定
  • 专题
  • theme
  • geofield

得分解答快速导航

  • 帖主:xlfsprite
  • xlf_boy

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问