gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15947
  • QQ554730525
  • 铜币25339枚
  • 威望15364点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:2245回复:6

MapX开发中的几点经验

楼主#
更多 发布于:2003-11-14 14:49
MapX开发中的几点经验
标  题: [转]MapX开发中的几点经验
  
写作环境:Pwin98+MapInfo5.0+MapX4.01.49+VB6
声明:文章为个人理解,浅薄之处在所难免。如与权威资料冲突,以权威资料为准

------------------------------------------------------------------------
--------
一、 前言
   我用MapInfo公司的MapX开发过几个项目。在项目的开发过程中,也接触了一些
使用相同技术的的公司和开发人员,感觉到他们的开发过程常常被一些问题所困扰
,却得不到很好的解决。在这里,我把我在开发过程中积累的一些经验写出来,希
望能起到抛砖引玉的作用。
  
二、开发经验
1、 映射数据库中的点信息到地图
  
   实际开发过程中,常常要把数据库中的数据Map到地图上,使之作为一个图层存
在,能够在地图界面中对数据库执行各种操作,如增删查改等。
  
下面假设我们把数据库ht.mdb中Customer表映射地图上,该表记录了一些客户对象
的地理位置和其他信息。假设字段信息如下:
  
{
  
ID Long (AutoInc),
  
X Double,
  
Y Double,
  
Name string(20)
  
}
  
其中X,Y分别纪录点对象的地理坐标。我们现在要使这个数据库表能被映射到地图
上。首先,要为该数据库创建一个纪录映射信息的表,这个表的名称和字段信息是
定死的。可以用SQL创建,如下:
  
  
Create Table MAPINFO_MAPCATALOG (
  
SPATIALTYPE Float,
  
TABLENAME Char(32),
  
OWNERNAME Char(32),
  
SPATIALCOLUMN Char(32),
  
DB_X_LL Float,
  
DB_Y_LL Float,
  
DB_X_UR Float,
  
DB_Y_UR Float,
  
COORDINATESYSTEM Char(254),
  
SYMBOL Char(254),
  
XCOLUMNNAME Char(32),
  
YCOLUMNNAME Char(32)
  
)
  
   也可以有mapinfo带的一个小mapbasic程序实现。打开mapinfo,在工具管理器
中加载Map Catalog工具,文件名为Miodbcat.mbx。执行操作 工具 | ODBC目录,
在弹出的对话框中选择性将连接,如下图:
  
  
      为系统创建一个ODBC数据源,此处创建驱动程序为microsoft access,
DSN=”DemoDB”,Filename=”c:\windows\desktop\ht.mdb”。确定返回后,点击
“创建目录”,系统会提示你“表MAPINFO_MAPCATALOG已被创建”。
  
   这时用Access打开ht.mdb就会发现已经创建了一个MAPINFO_MAPCATALOG表,且
字段信息就是前面叙述的。
  
   下一步就是设置表MAPINFO_MAPCATALOG的值,这些字段值的设置也必须严格按
照规定来。下面简单介绍一下我的设置值:(详细的说明可参看帮助)
  
SPATIALTYPE:4 表示映射后的图层全部都是有X/Y坐标的点数据,
  
TABLENAME:customer 表示将被映射的数据库表,此处为customer
  
OWNERNAME:OWNER 表示该表的所有者,一般意义不大
  
SPATIALCOLUMN:NULL_COLUMN 表示包含了空间实体的列名,NULL_COLUMN表示由
X/Y坐标值进行映射
  
DB_X_LL:0 图层边界左下角的X值,单位由下面的COORDINATESYSTEM给出
  
DB_Y_LL:0 图层边界左下角的Y值
  
DB_Y_UR:0 图层边界右上角的Y值
  
DB_Y_UR:0 图层边界右上角的Y值
  
COORDINATESYSTEM:NonEarth Units "m" Bounds (0, 0) (700,500),映射图层坐
标系定义,此处表示为非地理坐标系,单位为米,(0,0)为左下角坐标,(700,
500)为右上角坐标
  
SYMBOL:Symbol ("12.bmp",16744448,12,2),映射时用来标识点的图符信息,此
处表示用custsymb目录下的12.bmp文件来标识,颜色的BGR值为1674448,大小为
12。共有上形式的设置格式,要注意区别。
  
XCOLUMNNAME:X 对于含X/Y坐标进行映射的数据表的X坐标子段,否则填
NO_COLUMN
  
YCOLUMNNAME:Y 对于含X/Y坐标进行映射的数据表的Y坐标子段,否则填
NO_COLUMN
  
   到此为止,映射的准备工作就完成了。下面我们写一段代码,将数据库表
customer映射到地图上。
  
***************************************************************
  
'从数据库中映象客户图层信息
  
Sub initialshop()
  
Dim LayerInfo As New MapXLib.LayerInfo
  
'新图层的数据存取类型,必须为miLayerInfoTypeServer才能动态更新
  
'这是访问大型spatialware图形数据库的方法
  
LayerInfo.Type = miLayerInfoTypeServer
  
'以下为图层创建信息和ODBC连接信息
  
'图层的名称,以后可以map1.layers("客户")进行访问
  
LayerInfo.AddParameter "Name", "客户"
  
'ODBC连接信息
  
LayerInfo.AddParameter "ConnectString", "DSN=htgis;UID=Admin;
driver=Access"
  
'如何retrive数据
  
LayerInfo.AddParameter "query", "Select * from Customer"
  
LayerInfo.AddParameter "cache", "on"
  
LayerInfo.AddParameter "MBRSearch", "on"
  
LayerInfo.AddParameter "toolkit", "ODBC"
  
'如果对应dataset不存在,则自动创建dataset图层,位于最顶端
  
LayerInfo.AddParameter "AutoCreateDataset", 1
  
'dataset名称,为“客户”,以后可以map1.datasets("客户")进行访问
  
LayerInfo.AddParameter "datasetname", "客户"
  
Map1.Layers.Add LayerInfo, 1
  
'设置新图层的表字段及标签样式
  
With Map1
  
.AutoRedraw = False
  
.InfotipSupport = False
  
.InfotipSupport = True
  
Set ds = .Datasets("客户")
  
Set .Layers("客户").LabelProperties.Dataset = ds
  
Set .Layers("客户").LabelProperties.DataField = “name”
  
.Layers("客户").LabelProperties.Position = miPositionCR
  
With .Layers("客户").LabelProperties.Style.TextFont
  
.Name = "宋体"
  
.Size = 9
  
.Bold = False
  
.Strikethrough = False
  
.Underline = False
  
.Italic = False
  
End With
  
.Layers("客户").LabelProperties.Style.TextFontColor = &HFF0000
  
.Layers("客户").AutoLabel = True
  
.Layers("客户").Selectable = True
  
.Layers("客户").Refresh
  
.AutoRedraw = True
  
End With
  
Set LayerInfo = Nothing
  
End Sub
  
***************************************************************
  
   这样,在程序执行后,数据库表就被映射到了地图上,位于最上层。对于它的
操作,与普通的图层时一样的,都是用Feature对象访问图层中的实体。关于它的
其他操作就不介绍了。
  
2、 如何在读取属性值
  
选定一个实体后,我们需要读取它的属性值,怎么办呢?
  
有三种方法:
  
a. 由Layer对象的KeyField属性来设立要读取属性值的字段名。
  
接着,由Feature对象的keyValue读取此行的属性值。
  
b. 将图层加入到Datasets, 由Dataset对象的Value(x,y)属性,通过设置行号
,列号来获得属性值。
  
c. 将图层加入到Datasets,之后由RowValues(ftr)获取整行的值。
  
Dim ds As MapXLib.Dataset, lyr As MapXLib.layer
  
Dim ftrs As Features
  
Dim ftr As Feature
  
Dim rv As RowValue
  
Dim rvs As RowValues
  
Dim DsName As String ‘数据集名
  
Dim DsRows As Long, DsCols As Long
  
Dim i As Long, j As Long
  
Set ds = Formmain.Map1.Datasets.Item(DsName)
  
Set lyr = ds.layer
  
Set ftrs = lyr.AllFeatures
  
DsCols = ds.Fields.Count
  
DsCols = DsCols + 1
  
DsRows = ftrs.Count
  
Grid1.Rows = DsRows + 1
  
Grid1.Cols = DsCols
  
Grid1.Row = 0
  
For i = 0 To DsCols - 1
  
Grid1.Col = i
  
Grid1.Text = ds.Fields.Item(i + 1).Name
  
Next i
  
Grid1.Col = DsCols - 1
  
Grid1.Text = "Fkey"
  
lyr.BeginAccess miAccessRead
  
i = 1
  
For Each ftr In ftrs
  
Set rvs = ds.RowValues(ftr)
  
j = 0
  
For Each rv In rvs
  
If Not IsNull(rv.Value) Then Grid1.TextArray(i * DsCols + j) = Trim(rv.
Value)
  
j = j + 1
  
Next
  
Grid1.TextArray(i * DsCols + j) = ftr.FeatureKey
  
i = i + 1
  
Next
  
lyr.EndAccess miAccessEnd
  
Set ftr = Nothing
  
Set ftrs = Nothing
  
Set ds = Nothing
  
Set rv = Nothing
  
Set rvs = Nothing
  
Set lyr = Nothing
  
   注意:BeginAccess,以及EndAccess可以明显的提高属性读取的速度。
  
3、 为要打印的地图画一个边框
  
如果你想让要打印的地图漂亮一点,给它加上一个边框,可以参看下面的代码:
  
  
Option Explicit
  
Dim rect As New MapXLib.Rectangle
  
Dim ftr As Feature
  
Dim ftrs As Features
  
Dim Styl As New Style
  
Dim lyr As Layer
  
Private Sub cmdPrint_Click()
  
ScaleMode = 6 'set mode to mm
  
Printer.CurrentX = 0
  
Printer.CurrentY = 0
  
Printer.Print " "
  
Map1.PrintMap Printer.hDC, 0, 0, Map1.Width * 100, Map1.Height * 100
  
Printer.NewPage ' Send new page.
  
Printer.EndDoc 'Printing is finished.
  
Exit Sub
  
End Sub
  
Private Sub Form_Load()
  
'画一个地图边界大小的矩形
  
Map1.NumericCoordSys = Map1.DisplayCoordSys
  
Set lyr = Map1.Layers.CreateLayer("Temp", , 1)
  
' 设置该矩形属性
  
With Styl
  
.RegionTransparent = True
  
.RegionBorderColor = miColorBlack
  
.RegionBorderWidthUnit = miStyleUnitPixel
  
.RegionBorderWidth = 5
  
.RegionPattern = miPatternNoFill
  
End With
  
'Set the rectangle
  
rect.Set Map1.Bounds.XMin, Map1.Bounds.YMin, Map1.Bounds.XMax, Map1.
Bounds.YMax
  
' 创建矩形并添加到实体中
  
Set ftr = Map1.FeatureFactory.CreateRegion(rect, Styl)
  
lyr.AddFeature ftr
  
End Sub
  
4、 MapX开发系统的发行
   我一直用破解的MapX进行开发,软件开发完成后的发行曾使我很恼火,后来采
用了Wise Install,一切迎刃而解。需要打包的东西很多,软件的支持文件、数据
库和数据库引擎,mapx支持文件、自己定义的图符、字体文件、注册表设置、还有
ODBC设置等,这些工作用Visual Stadio自带的打包程序是难以完成,推荐使用
Wise 6.0。系统运行时需要那些文件支持,可使用dllshow的小工具跟踪,而且
Wise本身也提供了监测应用程序运行环境的功能。
  
三、结语
   在写这篇东东之前,似乎脑子里充满了要写下的经验,但写的时候感觉很多都
是可意会不可言传的东西,所以写的不多,希望以后有机会能慢慢整理。如果你采
用Mapinfo公司系列产品开发地理信息型系统的话,我们可以进行深入的探讨,虽
然我不是靠GIS吃饭的。
喜欢0 评分0
sjf_2003
路人甲
路人甲
  • 注册日期2003-12-05
  • 发帖数145
  • QQ
  • 铜币165枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2003-12-06 18:07
哪位大侠有OPENGL的三维GIS开发示例代码?
举报 回复(0) 喜欢(0)     评分
3S助跑员
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
2楼#
发布于:2003-12-07 08:11
写的真的是不错
举报 回复(0) 喜欢(0)     评分
chaimin1400
路人甲
路人甲
  • 注册日期2003-10-11
  • 发帖数315
  • QQ
  • 铜币533枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2003-12-11 21:39
受益匪浅
举报 回复(0) 喜欢(0)     评分
echo2003
点子王
点子王
  • 注册日期2003-07-28
  • 发帖数2453
  • QQ76947571
  • 铜币5473枚
  • 威望1点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
4楼#
发布于:2004-01-10 17:29
顶!
举报 回复(0) 喜欢(0)     评分
杜杜先生
路人甲
路人甲
  • 注册日期2004-01-02
  • 发帖数137
  • QQ
  • 铜币574枚
  • 威望0点
  • 贡献值0点
  • 银元0个
5楼#
发布于:2004-01-15 13:07
好!有了这位同仁的支持这个网站会越来越好的
举报 回复(0) 喜欢(0)     评分
zhuishujuku
路人甲
路人甲
  • 注册日期2004-02-06
  • 发帖数13
  • QQ
  • 铜币134枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2004-04-04 18:01
这位先生(也许是位漂亮的MM)真是好,谢谢
xiexie谢谢
举报 回复(0) 喜欢(0)     评分
gh803
路人甲
路人甲
  • 注册日期2004-02-25
  • 发帖数15
  • QQ
  • 铜币100枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2004-04-10 22:17
谢谢这位前辈了。
值得大家学习。
举报 回复(0) 喜欢(0)     评分
游客

返回顶部