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

MapBasic中文用户手册

楼主#
更多 发布于:2003-07-28 11:19
第八章 从 DBMS 中访问数据
概述
MapX 提供有空间服务器访问功能。这是个强大的功能,它允许开发者连结存储在空间服务器内的动态实时数据,例如运行在 Oracle、Informix、DB2 数据库,或者 Oracle 8i Spatial 数据库上的空间服务器 MapInfo SpatialWare。空间服务器允许各公司在其企业数据库中寄存地图数据,以便于集中管理和确保安全性。空间服务器,如 SpatialWare,为组织的空间数据提供了高级查询处理以及在服务器上增强性能。
第一节 访问远程空间数据

在MapX中可以使用不同的 DBMS 服务器访问地图图层数据。
可以使用 Layers.Add 方法用来自 DBMS 的数据来添加图层。有以下两种方法:
Ÿ 当需要在运行状态下动态计算查询时,随 LayerInfo 对象一起使用 Layers.Add 方法。这适合于有新数据输入的情况。例如,现有一个应用程序,用来确定已产生用户输入税收量的商店的位置。通过该应用程序输入的税收值在程序设计阶段是未知的,因此,只能在运行状态下添加到查询中。这种方法用来取代前面的 AddServerLayer 方法。
Ÿ 当查询在设计阶段已知时,和 .tab 文件一起使用 Layers.Add 方法。例如,如果应用程序要求显示所有在役的火警消防拴,那么就可以设置查询为选择所有消防拴,同时将在役条件设置为真。这个设置在程序设计阶段完成。可以直接将 .tab 文件放到 geoset 中,只要确保当任何使用 geoset 的程序初始化时,都装载了该文件。
说明:MapX 4.0 不支持打开 SpatialWare 3.0 的或者更低版本的表。

对 LayerInfo 对象使用 Layers.Add 方法

使用LayerInfo对象访问DBMS的示例

Dim lInfo As Object
Dim lStr As String
Set lInfo = CreateObject("mapx.layerinfo.4")
lInfo.Type = 4 ' layer type is RDB

lInfo.AddParameter "NAME", "city_125" 'layer name
lInfo.AddParameter "TOOLKIT", "ODBC"   ' use "ORAINET"  for oracle direct access
lInfo.AddParameter "CONNECTSTRING", "DRIVER={SpatialWare 32 Bit _ Driver4.00};HOST=Champagne;UUID=oracle;UPWD=secret;UID=GEORGETOWN; PWD=secret;OSID=DB1;DLG=0"
lInfo.AddParameter "QUERY", "SELECT * FROM CITY_125"
lInfo.AddParameter "CACHE", "ON"
lInfo.AddParameter "MBRSEARCH", "ON"
g_map.Layers.Add lInfo
Set lInfo = Nothing

通过 .tab 文件访问远程表

可以通过创建 .tab 文件,以提供对远程地图的访问。要使用 MapInfo Professional 产生 .tab 文件,请选择文件>打开 命令打开 DBMS 表。
.tab 文件是文本文件,可以使用任何文本编辑器创建 .tab 文件。创建了 .tab 文件后,就可以在编程时通过 Layers.Add 方法或通过 Geoset Manager,像访问任何其它 MapInfo .tab 文件一样访问该文件。
示例(ODBC)
这是一个使用 ODBC 为 SpatialWare 图层建立 .tab 文件的示例。
!table
!version 500
!charset WindowsLatin1

Definition Table
  Type ODBC
begin_metadata
"\IsReadOnly" = "FALSE"
"\DATALINK" = ""
"\DATALINK\Query" = "SELECT * FROM CITY_125"
"\DATALINK\ConnectionString" = DRIVER={SpatialWare 32 Bit Driver4.00};HOST=Champagne;UUID=oracle;UPWD=secret;UID=GEORGETOWN; PWD=secret;OSID=DB1;DLG=0
"\DATALINK\ToolKit" = "ODBC"
"\CACHE" = "OFF"
"\MBRSEARCH" = "ON"
end_metadata
第二节 Oracle8i 支持

MapX 4.0新增了支持 Oracle8i 的功能。可在安装 MapX ODBC Connectivity 组件时加上 Oracle8i。Oracle8i Spatial 是 Oracle 公司新实现的一种空间数据库。MapX 通过 OCI 支持和 Oracle8i 建立同步连接,通过 ODBC 和其它数据库建立连接。

Oracle8i 需求

要想在 MapInfo 内部和 Oracle8i 连接,就必须安装 Oracle8i的客户端。
连接对话工作区
对于 Oracle8i 来说,如果没有指定完整的连接字符串,那么就不能显示连接对话框。“DLG=” 选项将无效。如果不能提供 userID 和口令,则连接失败。由于由 MapInfo Professional 创建的 DBMS 表 .tab 文件不包含口令(为安全起见),那这将引起打开 tab 文件失败。
解决这个问题的途径是写一段简单的连接会话,使用该会话从用户处取得口令,并使用有连接字符串的 layerinfo 定义 DBMS 图层的Layers.Add 对象,该字符串要访问的数据库的 userID/password。Oracle 连接字符串将会指定如下:
"SRVR=superior;UID=user1;PWD=secret;"
添加临时层。这将同时添加在连接池中所期待的连接。由于口令已被识别,所以用此口令打开的同一数据库中的所有 tab 文件都将使用这种连接。就这样,.tab 文件就成功地打开了。
若想在 geoset 中使用这些 tab 文件,就必须在应用程序启动时放置此登录。
 
第三节 DBMS LayerInfo 参数

.tab 文件和 LayerInfo 对象都接受相同的参数。但参数名的命名习惯稍有不同。

 参数 描述
 Query 这是决定数据表内容的 backend DBMS 查询。若想使数据表可以地图化,就必须选定空间对象列(或虚假列 OBJECT)。SpatialWare 的用户可指定返回空间对象的 GISSQL/Server 特定 SQL 字符串/声明。另外,SpatialWare 用户必须包含 SW_GEOMETRY 和 SW_MEMBER 列,SpatialWare 用它们来存储地理对象和 IDs.
 ConnectionString 这是与 DBMS 连接的必要信息。对 ODBC 来说,Connection 指定了 ODBC 连接字符串。如果已指定了完整的连接字符串,则建立了没有对话框的连接。如果未提供连接字符串,则使用默认的带“DLG=0”的字符串,此时,出现 ODBC Data Source 对话框。对 Oracle Spatial 来说,必须用 userid 和口令指定完整的字符串。不会应用 DLG 关键字且不会出现连接对话框。Oracle 直接连接字符串看起来象这样: "SRVR=superior;UID=mapx;PWD=secret"
 Cache 值为 “ON”/“OFF”,默认为 “ON”。此参数控制在绘制图层时,是否隐藏获得的数据。此隐藏有助于提高以后的重画,平移/缩放(在隐藏区内),标注和专题化的性能。巨大图层的隐藏会由于用尽内存而丢失隐藏的值。
 MBRSearch 值为 “ON”/“OFF” 两种,默认是 “ON”。当 MapX 绘制地图时,它从图层中获得地图边界内的数据。为了在 dbms 图层中这样做,要添加空间谓词到表定义查询中去。对于某些类型的查询,或存在 Spatioal 索引问题的 onm 图层,此谓词可能减慢或引起查询失败。此选项使得可以关掉空间谓词。
 Name 这是为图层提供名称/别名的必要字符串。
 ToolKit 值可以是 “ODBC”/“ORAINET”,默认是 “ODBC”。此参数指定了要连接到服务器数据库 的 DBMS 访问组件。对于 Oracle direct,指定为 ORAINET 并使用 ORAINET 连接字符串。其它的则指定为 ODBC。

DBMS 连接字符串格式
ODBC 连接字符串的格式和 MapInfo Professional ODBC/ Linked 表中的相同。该字符串由几个以分号(;)相分隔的子句定义。各子句的格式均为 “Key=Value”。下表列出了一些重要的关键词。
 部件 描述
 DSN= 指定 ODBC 数据源的名称。注意:如果使用了 “DSN=” 语法关键字,那么指定的名字必须和正在使用的用户系统中的数据源的名字相匹配。请注意有时不同的用户可能对同一数据源使用不同的名字。如果不能预先知道使用的数据源名称,则请使用 “DRIVER=” 语法关键词代替 “DSN=” 语法关键词。
 DRIVER= 明确指定所安装的 SpatialWare 的驱动程序名或 IUS 驱动程序。被用来代替 “DSN=” 语法关键词。示例: DRIVER={SpatialWare 32 Bit Driver} 说明:Informix 2.80.0861 根本不支持 “DRIVER=”。
 UID= 如果需要,为数据源指定期望的 UserId。
 PWD= 如果需要,为数据源指定用户口令。
 DLG= 控制连接对话框显示的数值: 0 --取消连接对话框(为 MapX Theme 所要求); 1 --显示连接对话框; 2 --显示连接对话框,但只在需要时才显示(例如,如果没有提供全部要求的信息)[默认]。
 SRVR= 反映在 Oracle8i EasyConfig 中设置的值。此为 Oracle8i 连通时所要求。

第四节 访问属性数据

要使用所有有用的数据列,请指定诸如 “Select * From 数据表名”的查询。可以无须指定 * (星号);而可以特别指明那些要使用的列来代替它。为使执行达到最好的性能,请限制查询使其只在所需要的列中寻找。
要访问在查询中所选择的 DBMS 图层的空间对象,请以类型为 midatasetlayer 的数据集使用 datasets.add 方法(从现有的图层中取得这些属性)。
添加 DBMS 图层时,为优化性能,在查询中最好只指定在应用中所要使用的列。如果未指定,则那些空间列、关键值列、要用来进行标注的列或是要用来创建专题的列会自动添加进来。而对所有可在地图上表示的表都可使用虚拟列 “OBJECT”来引用包含空间数据的列。这是在带有 X/Y 列并使用 MapMarker MDIGEOADDRESS 列的表所需要的。
说明:可以使用任何服务器方表达式/函数来指定列。同样,要避免在实际应用中从表中选择所有。
下面的代码示例将打开 MapInfo *.tab 文件,然后访问远程数据并将它绑定到图层上。现在就可以基于这些列来进行标注或是放置专题。
Dim Lay As Layer
Dim dsname As String
Set Lay = Map1.Layers.Add(filename)
dsname = Lay.Name
Map1.Datasets.Add miDataSetLayer, Lay, dsname  

第五节 MapInfo Map Catalog

如果 MapX 应用程序需要访问远程空间数据,则 DBMS 中必须存在特殊的表,即 MapInfo Map Catalog。在数据库中的所有表可作为 MapX 中的地图图层浏览之前,每个数据库都必须创建一个目录。Map Catalog 必须包含要访问的数据库中每一个可在地图中表示的表中有关空间列的信息。
MapX 应用程序可以使用服务器上已经存在的 Map Catalog(同一个目录被不同的 MapInfo 客户端应用程序分享,包括 MapInfo Professional)。如果服务器上没有 Map Catalog,则需要创建一个。
使用 MapInfo Professional 管理 Map Catalog
如果您是 MapInfo Professional 的用户,就可以使用 MapInfo Professional 创建并管理 Map Catalog 。MapInfo Professional 包含一些 MapBasic 工具,例如 MIODBCAT.MBX,来帮助创建和管理 Map Catalog。
MapX 应用程序能够使用由 MapInfo Professional 创建的 Map Catalog 。例如,在公司设置中,一个用户,或许是数据库管理员,可能使用 MapInfo Professional 创建 Map Catalog,然后大量的最终用户可以运行从 Map Catalog 中读取数据的 MapX 应用程序。
给 DBMS 装载空间数据
如果已经有了 MapInfo 表格式的空间数据,而想把 MapInfo 表导入 SpatialWare,可以使用下面的方法之一完成此任务:
Ÿ MISWUP32.MBX 工具,它由 MapInfo Professional 提供,在 SpatialWare 客户端安装目录下。
Ÿ IUS 的 EasyLoader
Ÿ DB2
Ÿ Oracle Spatial
手工创建 MapInfo Map Catalog
如果您不是 MapInfo Professional 用户,那么就需要手工创建 Map Catalog(或者让数据库管理员创建 Map Catalog),方法如下所述。每个服务器/数据库只要创建 Map Catalog 一次。
1. 在放有可在地图上表示的表的指定数据库中,创建用户 MAPINFO 。
2. 在数据库中创建 MAPINFO_MAPCATALOG 表。Create Table 子句需要和下面的 SQL Create Table 子句相同。
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)


3. 创建关于 TABLENAME 和 OWNERNAME 的唯一索引,使得对于每个所有者只有一张表可被地图化。
create index mapcat_i1
on mapinfo.mapinfo_catalog (OwnerName,TableName)
4. 允许在 MAPINFO_MAPCATALOG 中有选择、更新以及插入的权限。使用户可以把表地图化。而删除权限应当保留给数据库管理员。
第六节 地图化DBMS 表

下表描述了MAPINFO_MAPCATALOG 表中每一列的语法和意义:

 列名 分配值   示例
 SPATIALTYPE 注意:此列描述数据是如何存储和索引,以及此列支持的、不支持的 Spatial Object 类型。   5.3
 TABLENAME 表名 DRAINAGE
 OWNERNAME 表的属主名 GEORGETOWN
 SPATIALCOLUMN 列名,如果包含空间图元:SW_GEOMETRY(使用 SpatialWare Type/IUS 进行地图化标示) NULL_COLUMN(使用 XY 进行地图化标示) MI_SQL_MICODE(使用 MI Code 进行地图化标示) 或者是 IUS、DB2、或数据类型为 ST_SPATIAL 的 Oracle 列的名称。Oracle 8i SDO_GEOMETRY 列的名称。 SW_GEOMETRY
 DB_X_LL 图层边界矩形区左下角的 X 坐标,使用的单位由 COORDINATESYSTEM 指定。 360
 DB_Y_LL 左下角边界的 Y 值。 90
 DB_X_UR 右上角边界的 X 值。 360
 DB_Y_UR 右上角边界的 Y 值。 90
 COORDINATES YS TEM 代表 MapInfo CoordSys 子句的字符串,(但在最开始没有关键词 “CoordSys”),指定地图的投影,坐标单位,等等。对于简单的经/纬度地图,指定为“Earth Projection 1, 0”。 Earth Projection 1, 0
 SYMBOL MapInfo Symbol 子句(如果图层仅包含点);或是 Pen 子句(指定线形图元的样式)之后的 Symbol 子句及Brush 子句后的其它 Pen 子句(指定区域边界的样式)后的 Symbol 子句。 Symbol(35,0,12)  Pen(1,2,0) Pen(1,2,0)  Brush(2,255,255)
 XCOLUMNNAM E 对有 X/Y 数据的可地图化的表,指定包含 X 坐标的列的名称。如果没有这样一列(例如,如果此表使用了单个的空间列,而不是一对 XY 列)则指定为 NO_COLUMN 或让它空着。 NO_COLUMN
 YCOLUMNNAME 对有 X/Y 数据的可地图化的表,指定包含 Y 坐标的列的名称,或指定为 NO_COLUMN。    NO_COLUMN

指定点样式
使用 Symbol 子句来指定点样式。Symbol 子句有三种类型:一种用来指定 MapInfo 3.0-style 符号;一种用来指定 TrueType 字体符号;另一种用来指定位图符号。

Symbol 语法 示例
Symbol(shape, color, size) 或是    Symbol(shape,color,size,font,fontstyle,rotation) 或是 Symbol(bitmapname,color,size,customstyle) Symbol(35,0,12)  Symbol(64,255,12,"MapInfo Weather" ,17,0)  Symbol("sign.bmp", 255, 18, 0)
指定线样式
使用 Pen 子句指定线样式。在 Map Catalog 中,可能需要指定两个 pen 子句:一个用指定线图元的外观,而另一个用来指定区域边界的外观。

 Pen 语法  示例
 Pen(thickness, pattern, color)  Pen(1, 2, 0)
指定填充样式
使用 Brush 子句为闭合图元(区域)指定样式。
 Brush 语法  示例
 Brush(pattern,color,backgroundcolor)  Brush(2, 255, 65535)

喜欢0 评分0
终极无间
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
1楼#
发布于:2003-07-31 10:51
名字搞错了吧 :)
是 mapx 的嘛
以前看了 E 版的
现在看 C 版的
体会有深了一层
举报 回复(0) 喜欢(0)     评分
终极无间
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
2楼#
发布于:2003-07-31 10:52
斑竹是不是你翻译的啊
有一手 :)
举报 回复(0) 喜欢(0)     评分
zhqcn
路人甲
路人甲
  • 注册日期2003-07-28
  • 发帖数68
  • QQ
  • 铜币286枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2003-08-01 13:47
版主,其他章节能否也穿上!
举报 回复(0) 喜欢(0)     评分
cl991036
管理员
管理员
  • 注册日期2003-07-25
  • 发帖数5913
  • QQ14265545
  • 铜币29654枚
  • 威望213点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • GIS帝国铁杆
4楼#
发布于:2003-08-01 18:49
大家需要我们就努力的
没钱又丑,农村户口。头可断,发型一定不能乱。 邮箱:gisempire@qq.com
举报 回复(0) 喜欢(0)     评分
终极无间
  • 注册日期
  • 发帖数
  • QQ
  • 铜币
  • 威望
  • 贡献值
  • 银元
5楼#
发布于:2003-08-02 14:38
他掉你们胃口:)
举报 回复(0) 喜欢(0)     评分
shaoge
路人甲
路人甲
  • 注册日期2003-07-30
  • 发帖数58
  • QQ
  • 铜币330枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2003-08-02 15:21
恩,不错,
强烈要求 共享全部!
当当网络驿站,最新网址: http://gis2003.yeah.net <img src=http://gis.dhs.org/upload/forum/200381101335.gif>
举报 回复(0) 喜欢(0)     评分
yansike
路人甲
路人甲
  • 注册日期2003-07-30
  • 发帖数60
  • QQ
  • 铜币279枚
  • 威望0点
  • 贡献值0点
  • 银元0个
7楼#
发布于:2003-08-20 12:50
支持
举报 回复(0) 喜欢(0)     评分
xiaonai
路人甲
路人甲
  • 注册日期2003-11-27
  • 发帖数87
  • QQ
  • 铜币418枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2003-12-10 19:38
谢谢
举报 回复(0) 喜欢(0)     评分
echo2003
点子王
点子王
  • 注册日期2003-07-28
  • 发帖数2453
  • QQ76947571
  • 铜币5473枚
  • 威望1点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
9楼#
发布于:2003-12-10 20:40
强力要求,
强力支持!
举报 回复(0) 喜欢(0)     评分
游客

返回顶部