juaze
路人甲
路人甲
  • 注册日期2007-05-09
  • 发帖数7
  • QQ
  • 铜币136枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:2106回复:1

利用MapX开发_MapInfo教程

楼主#
更多 发布于:2007-05-16 21:01
<P>1. 掌握使用MapX <BR>            MapX是Mapinfo公司最新推出的ActiveX控件产品,目前已经发展到MapX4.5。由于MapX是基于Windows操作系统的标准控件,因而能支持VC、VB、Delphi、PB等标准化编程工具,使用时只需将控件装入开发环境,装入控件后,开发环境ActiveX工具条上会增加一个控件按钮Map,把它拖放到窗体上就可建立一个TMap类型的ActiveX地图对象Map,通过设置或访问该Map对象的属性、调用该Map对象的方法及事件,便能快捷地将地图操作功能溶入到你的应用程序中。 </P>
<P>            MapX由一系列Object(对象)和Collection(对象集合)组成,Map是最基本的对象,每个Map由Layer(层)、Dataset(数据集)和Annotation(标注)这三个对象及对象集合(Layers、Datasets、Annotations)来定义, <BR>            其中Layer用于操作地图图层,Dataset用于访问空间对象的属性数据,Annotation用于在地图上添加文本、符号等标注,掌握上述三个主要对象的特征后,再顺藤摸瓜掌握下一级对象的特征,如每个Layer又由Feature(点、线、面、文本图形目标)对象及对象集合(Features)定义,每个Dataset由Field(属性数据域)对象及对象集合(Fields)定义......,这样很快就能把MapX学到手。 </P>
<P>            2. 定义地图坐标系 <BR>             在MapX开发中需要特别注意地图坐标系问题,MapX地图坐标系分为地图显示坐标系和内部计算坐标系,两者互为独立,在GIS应用开发中根据应用需要设置好这两种坐标系非常重要,因为坐标系一方面影响软件系统的内部坐标处理,另一方面影响地图的外观显示。Map对象的坐标系及投影通过CoordSys对象的Set方法定义: </P>
<P>              Set(Type, [Datum], [Units], [OriginLongitude], [OriginLatitude],  <BR>               [StandardParallelOne], [StandardParallelTwo], [Azimuth], <BR>            [ScaleFactor],  <BR>               [FalseEasting], [FalseNorthing], [Range], [Bounds], <BR>            [AffineTransform]) <BR>            其中主要参数:Type表示投影类型,Type为1时地图坐标以经纬度表示,后面都为可选参数,其中Datum为地球基准面;Units为坐标单位,如Units为7表示以米为单位;OriginLongitude、OriginLatitude分别为起始经度和纬度;StandardParallelOne、StandardParallelTwo为第一、第二标准纬线,该参数与地图投影相关。 </P>
<P>            通过设置Map对象的DisplayCoordSys和NumericCoordSys属性返回的CoordSys对象,就可设定地图显示坐标系和内部计算坐标系。举例如下: </P>
<P>               procedure TMain.DefineMapParam(); <BR>               var <BR>                MapDatum: Variant;//地球基准面 <BR>               begin  <BR>               try <BR>            MapDatum := CreateOleObject('MapX.Datum.4'); //建立基准面对象 <BR>            //定义北京54坐标系基准面 <BR>            // (Ellipsoid, ShiftX, ShiftY, ShiftZ, RotateX, RotateY, RotateZ, <BR>            ScaleAdjust, PrimeMeridian) <BR>            MapDatum.set(3, 24, -123, -94, -0.02, 0.25, 0.13, 1.1, 0); <BR>            //定义北京54坐标系经纬度作为内部计算坐标系  <BR>            Map1.NumericCoordSys.Set_(1, MapDatum); <BR>            //定义北京54坐标系30度标准纬线麦卡托投影作为显示坐标系,单位为米 <BR>            Map1.DisplayCoordSys.Set_(26,MapDatum,7,0,0,30); <BR>            finally <BR>            VarClear(MapDatum); <BR>            end; <BR>            坐标系是GIS系统的基石,正确设置坐标系是系统成败的关键。 <BR>            3. 操纵地图对象 <BR>            你可以简单地加载一个GeoSet文件,给Layers对象集合赋予具体的内容,随之在Map对象中就能看到地图显示,GeoSet文件类似MapInfo中的工作空间,MapX中带有Geoset文件的编辑器GeosetMangater.exe,用户可在编辑器中组合及设置图层,然后保存生成一个 <BR>            *.gst 文件直接调入Map对象,这样可以节省时间。你也可以通过Layers对象的Add 或 Remove <BR>            方法添加或移走地图图层,如: <BR>            Map.layers.Add(FileName); // 添加图层,FileName为文件全路径名 <BR>            Map.Layers.Remove(3); // 移走地图第三层 <BR>            Layers对象由一组Layer对象组成,通过Layer对象的Features和Selection对象集合你可以操纵和选择图层上的图形目标,如: </P>
<P>            Map.Layers.Item(1).AddFeature(Newobj); //将新建对象Newobj添加到图层一 <BR>            4. 地图数据捆绑 <BR>            数据捆绑是将不同来源的数据对应到地图层的过程,捆绑结果会产生一个Dataset对象,Dataset对象的集合组成Datasets <BR>            Collection,它定义了Map对象的数据集属性。 <BR>            你可以通过Datasets将不同来源的数据捆绑到地图上实现图文互动,或创建专题图,如下例ODBC Access数据的捆绑及专题分析: <BR>               procedure TMapForm.ODBC1Click(Sender: TObject); <BR>               var <BR>              param: ODBCQueryInfo ;  <BR>            ds: Dataset; //定义数据集 <BR>            Datafields: Fields; //定义数据域 <BR>            begin <BR>            param.SqlQuery := 'select * from China'; //选择Access数据库中的China表  <BR>            param.DataSource := 'MapChina'; //ODBC 数据源名 <BR>            param.ConnectString := 'ODBC;'; //或是user = ... Pwd = ... , 定义ODBC连接 <BR>            Datafields.Add('GEONAME','GEONAME', miAggregationAuto,miTypeString); <BR>            //添加数据域GEONAME <BR>            Datafields.Add('POPU','POPU', miAggregationAuto,miTypeNumeric); <BR>            //添加数据域POPU <BR>            //将Access数据捆绑到Mapinfo China表 <BR>            ds := Map.Datasets.Add(miDataSetODBC, param, unassigned, unassigned, <BR>            unassigned, 'CHINA', Datafields, unassigned);  <BR>            ds.Themes.Add(miThemeRanged, 'POPU', 'MyTheme'); //添加一个范围专题图  <BR>            end; <BR>            5. 建立客户定制工具 <BR>            你还可以定制自己的地图操作工具,下面通过定制一个名为Info的信息按钮工具简述方法步骤: <BR>            (1)定义客户工具常量  <BR>                Const CUSTOM_INFO_TOOL = 1 <BR>            (2)利用Map对象的CreateCustomTool方法定义客户工具,方法为: <BR>               CreateCustomTool (ToolNumber, Type, Cursor, [ShiftCursor] , <BR>            [CtrlCursor], [InfoTips]) <BR>            其中ToolNumber为工具号,即上面定义的常量;Type为工具类型;Cursor为光标形状,其他参数可选。  <BR>            //定义Info工具为十字光标点触发工具 <BR>             Map.CreateCustomTool(CUSTOM_INFO_TOOL, miToolTypePoint, <BR>            miCrossCursor, miArrowCursor, miArrowCursor, unassigned) <BR>            (3)在Map对象事件ToolUsed中编写工具的Handler(操作内容)  <BR>             procedure TMain.MapToolUsed(Sender: TObject; ToolNum: Smallint; X1, <BR>            Y1, X2, Y2, Distance: Double; <BR>                            Shift, Ctrl: WordBool; var EnableDefault: WordBool); </P>
<P>             begin <BR>             Case ToolNumber of <BR>            CUSTOM_INFO_TOOL : //信息工具Info <BR>            try  <BR>            …… <BR>            end; <BR>            (4)定义信息按钮的Click事件 <BR>            procedure TMain.InfoClick(Sender: TObject); <BR>            begin <BR>            Map.CurrentTool:=CUSTOM_INFO_TOOL; <BR>            end  </P>
喜欢0 评分0
北欧
路人甲
路人甲
  • 注册日期2007-05-21
  • 发帖数3
  • QQ
  • 铜币107枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2007-08-06 18:55
<img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em01.gif" /><img src="images/post/smile/dvbbs/em01.gif" />
举报 回复(0) 喜欢(0)     评分
游客

返回顶部