MAPGIS二次开发讲义

更新时间:2023-12-10 11:11:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

MAPGIS二次开发简明讲义 一、MAPGIS二次开发的基本概念

成熟实用的地理信息系统(GIS)的重要标志就是它提供给用户的二次开发能力。MAPGIS提供完整的二次开发函数库。用户完全可以在MAPGIS平台上开发面向各自领域的应用系统。 操作系统、MAPGIS开发库及MAPGIS应用程序的相互关系如下图所示: MAPGIS MAPGIS应用程序 空间分析 窗口操作 … 图库操作 图形、图象I/O 开发库工作区管理 MAPGIS二次开发函数库包括下表所列部分,这些库函数都支持Windows3.x,Windows95和NT操作系统。MAPGIS二次开发函数库支持的语言包括Borland c++,Visual c++,Visual basic等高级语言程序设计环境。

函数库名称 动态库文件 32位函数库(支持Windows95,NT) c,c++连接 文件 工作区基础函数 图形显示输出 工作区管理函数 图形窗口操作 空间分析函数 地图库读取显示 图形编辑函数 bas32.dll Mapdsp32.dll w32_area.dll W32_oper.dll W32_anly.dll D32_view.dll Maped32.dll Bas32.lib Mapdsp32.lib W32_area.lib W32_oper.lib W32_anly.lib D32_view.lib Maped32.lib 表1 MAPGIS函数库

c,c++说明 文件 Win_area.h Map_out.h Win_area.h Win_oper.h Spc_anly.h Dbs_view.h Mapedit.h vb说明 文件 W32_area.bas Mapdsp32.bas W32_area.bas W32_oper.bas W32_anly.bas Maped32.bas Windows 3.x、Windows 95、Windows NT 基于MAPGIS平台的应用程序

MAPGIS二次开发函数采用匈牙利命名法,即动宾结构命名法,并且所有函数都以下横线开始,以便和Windows函数以及其他语言函数明显区别开来,如_GetLin表示取线实体;在Visual Basic环境下,由于Visual Basic语言不能识别以下横线开始的函数名,所以库函数都以字母b开始,如bGetLin表示取线实体。

上述动态函数库提供了从最基本数据单元的读取、保存、更新和维护到MAPGIS地图库的建立和漫游,以及空间分析,图象处理等一系列功能,MAPGIS应用程序可以根据需要在任何层次上进行开发。 除了上述 API函数外,MAPGIS还为基于MFC(Microsoft Foundation Class)的开发者提供多个可重用基类,将应用程序所需的常见基本功能作了封装,使用便利,改动灵活。

MAPGIS正在向组件化迈进,已推出一系列组件,这将使得二次开发更为快捷便利。但与此同时MAPGIS仍将不断完善其API函数库,以多种开发手段满足不同层次、不同应用的需求。

二、MAPGIS的数据组织

工作区

MAPGIS数据管理的核心就是对工作区的操作。

工作区是MAPGIS提出的一个概念,简单地说,工作区就是一个数据池,存放实体的空间数据、拓扑数据、图形数据和属性数据,每个工作区都对应于一个MAPGIS数据文件。MAPGIS开发函数库提供对工作区实施操作的一系列函数,如将工作区中的内容存盘,从盘上将数据装入工作区,对工作区中内容进行添加、修改、删除、检索等等。对硬盘数据的存取及虚拟内存的管理等等复杂繁琐的工作无需应用程序的编写者去关心,而是由MAPGIS工作区管理模块自动完成。如图1-2所示。由此可见,深入了解工作区的逻辑结构和工作区操作函数的使用,是进行成功的二次开发的关键。 MAPGIS应用程序

工作区管理模块的地位

工作区API函数界面 工 作 区 管 理 模 块 工作区(空间数据、图形数据及属性数据)

MAPGIS将工作区分为点、线、区、网、表五种类型,它们的差别主要表现在其中包含

的空间实体的类型不同。详见下表:

工作区类型 点工作区(.WT文件) 线工作区(.WL文件) 区工作区(.WP文件) 网工作区(.WN文件) 表工作区(.WB文件)

实体类型 点(PNT) 线(LIN)、结点(NOD) 线(LIN)、结点(NOD)、区(REG) 线(LIN)、结点(NOD)、网(NET) 无空间实体,仅有表格记录 各类工作区中可以包含的实体类型

由于不同种类的工作区中空间实体的类型不同,各类型的工作区所适用的数据操作函数

也就不同。例如,对点工作区只能使用操作点实体数据的函数;而对区工作区则可对线、结

点和区实体的数据进行操作。

空间实体及其数据组织

空间实体是MAPGIS数据操作的基本单位,在一个工作区中,一类实体可有多达2G的个

体,每个个体都有唯一的序号,称为实体号(点号、线号、区号、网号、记录号等)。对实体数据的存取主要依据实体号。

每个实体在工作区中都存储有对应的空间数据、拓扑数据、图形参数及属性记录。当然,实体类型不同,上述几方面的数据就有不同的特点,见下表。

实体类型 空间数据及拓扑数据 图形参数 点PNT 位置(x,y)D_DOT 位置(x0,y0),?,(xn,yn) 线LIN 拓扑LIN_TOP 位置(x,y)D_DOT 连接的弧段(l0,l1,?,ln) 结点NOD PNT_INFO,也可没LIN_INFO 缺省属性 PNT_INFO(字符串、文本、子图、圆、弧、ID(长整型) 图象) ID(长整型) 长度(双精度型) 附加数据:连通方阵、中心数有图形参数 据、站点数据、转角数据等 ID(长整型) ID(长整型) 区REG 区数据:边界弧段号 REG_INFO 周长(双精度型型) 面积(双精度型型) 网NET 网数据:组成网的弧段号 NET_INFO ID(长整型) 不同类型实体的相关数据

说明:

1. 2.

F_DOT是描述二维空间位置的数据结构,就是(x,y)座标对。见后边“宏定义及数据结构”。 LIN_INFO是描述线的拓扑关系的数据结构,主要记录线两端的结点、线两边的区等信息。见后边

“宏定义及数据结构”。 3.

PNT_INFO、LIN_INFO、REG_INFO、NET_INFO分别是描述点、线、区、网图形特征(用于显示

或输出)的数据结构,其定义见后边“宏定义及数据结构”。

4. 上表中仅列出不同类实体的缺省属性域,它们是最基本的。用户可以在此基础上任意扩充新的各种数据类型的数据域以满足自己的需要。

对每种空间实体的空间数据、拓扑数据、图形参数及属性记录,MAPGIS都提供相应的

函数来实施获取、修改、删除等操作。

下面以例子来详细说明线实体、结点实体、区实体在工作区中的数据组织。

L1 n4

n2

n1 R1 R2 L3

L4 L2 n3 一个区工作区中的空间实体

图1-3给出了一个区工作区中的空间实体。在这个工作区中有四条线(线号分别用L1、L2、L3、L4表示),有四个结点(结点号分别用n1、n2、n3、n4表示),有两个区(设区号分别为R1、R2)。

1、线实体

MAPGIS中的线由多个座标点组成,线实体的空间数据就是存放在工作区中的座标点序列(D_DOT结构)。如果线L1由8个点组成,它的空间数据就如下所示:

(x0,y0)

n3

起始结点

终止结点 左区 右区

而L4的拓扑数据如下: n4 n4 R1 R 2 0 0 n1 0 R1 0 0 (x1,y1) ? (x7,y7) 线拓扑(LIN_TOP结构)记录线两端的结点和线两旁的区。如线L2的拓扑数据如下:

2、结点实体

结点的空间数据与点实体一样,是二维座标点,其拓扑数据记录它所连接的线,如n1的拓扑数据是:

L1

而n4的拓扑数据是:

L4

3、区实体

区由线实体(在区工作区中又被称为弧段)围成,它的空间数据主要记录这些线的序号。如果线L1、L2、L3、L4的方向如图1-3所示,且所含座标点的数目分别为d1、d2、d3、d4,假设我们将顺时针方向定为R1的方向(这并不是硬性的规定,也可以将一个区的方向定为逆时针),则区R1的空间数据如下:

d1+d2+d3+d4+2 注意:

1. 第一个单元存放的并不是线号,而是全部线的座标点数目的总和加上区边界的圈数;

2. 边界各圈的线号用0相隔;

3. 在数据中与区方向一致的线用正数表示,与区方向相反的线则存储线号的相反数。

4、属性记录

图1-3中各个实体对应的属性记录都具有如下结构:

偏移字节 0 1 1+sizeof(long)

flag

删除标记(0: 存在;1:已删除)

*(double*)(att+5)

字段1:ID(长整型) 字段2 … 字段m L1 -L3 L2 0 L4 L2 三、工作区数据操作

下面介绍对工作区实施管理及对工作区中实体进行查询、检索和修改的一系列函数,相关头文件:Win_Area.h。

1、初始化和关闭工作区实例

工作区实例可以认为是工作区的一个集合,要实施工作区的各项操作,首先要建立一个工作区实例(相当于先建立一个空的工作区集合),再在这个实例的基础上创建一个工作区(相当于把一个工作区加入工作区集合)。在使用完工作区实例对应的(即这个工作区集合中的)全部工作区之后,应该关闭(撤消)工作区实例。

工作区数据操作的一般次序是:创建工作区实例——>使用工作区实例打开工作区——>将数据文件或数据库中的数据表装入工作区——>对工作区中的实体实施添加、删除、修改、查询等操作——>将工作区存盘——>关闭工作区——>关闭工作区实例。

初始化工作区,创建工作区实例

AREA_HINST _InitWorkArea(HINSTANCE hInst); 参数:入口 hInst-进程实例句柄 出口

返回值 成功则返回值大于0,该值表示合法的工作区实例,使用该工作区实例,MAPGIS应用程序可以打开多个属于该实例的工作区;失败则返回0。

说明:每一个工作区都应该对应于一个工作区实例。

关闭所有工作区

int _CloseAllArea(AREA_HINST ahInst);

参数:入口 ahInst - 工作区实例,由_InitWorkArea函数创建。若ahInst=0则关闭所有实例的所有工作区;若ahInst合法,则只释放ahInst实例及其所属工作区。 出口

返回值 成功返回1,失败返回0,取消则返回IDCANCEL。

说明:该函数检查所有属于ahInst实例的工作区,并且关闭这些工作区。若某一工作区的内容已经被修改,则该函数弹出对话窗如图2.3,询问是否保存,若:

图4-1文件是否保存提示窗

选择 选择 选择

按钮,则保存该文件。 按钮,则不保存文件。

按钮,则立即返回IDCANCEL。

询问完所有被修改的工作区,该函数将关闭所有工作区,若成功则返回1,否则0。

为了使MAPGIS应用程序在结束时,立即释放相关工作区所占用的内存空间,应该调用该函数。若该函数调用成功,则清除与ahInst实例相关的内存,并释放该实例。

释放工作区实例

int _FreeWorkArea(AREA_HINST ahInst);

参数:入口 ahInst - 工作区实例,由_InitWorkArea函数创建。 出口

返回值 成功返回1,失败返回0,或者返回IDCANCEL。

说明:该函数功能与_CloseAllArea函数相同,请参阅_CloseAllArea函数说明。 示范:下列C程序说明工作区实例创建和撤消的使用方法: ?

AREA_HINST AHInst; /*定义工作区实例*/ ? /*主窗口回调函数*/

LRESULT CALLBACK _export WndProc(HWND hWnd, UINT msg,WPARAM Param,

LPARAM lParam)

{

LRESULT rtn=0; switch(msg) {

case WM_CREATE: AHInst=_InitWorkArea(hInstance);

break; case WM_CLOSE:

if(_CloseAllArea(AHInst)==IDCANCEL) break; DestroyWindow(hWnd); break;

case WM_DESTROY:

PostQuitMessage(0); break; default: rtn=DefWindowProc(hWnd,msg,wParam,lParam); }

break;

return(rtn); }

2、工作区整体操作 打开关闭工作区

打开特定类型的工作区

short _OpenPntArea(AREA_HINST ahInst); 打开点工作区 short _OpenLinArea(AREA_HINST ahInst); 打开线工作区 short _OpenRegArea(AREA_HINST ahInst);

打开区工作区

short _OpenNetArea(AREA_HINST ahInst); 打开网络工作区

short _OpenTblArea(AREA_HINST ahInst); 打开表格工作区

short _OpenDbsTblArea(AREA_HINST ahInst,char *tblFname,char editable=0); 打开数据表格工作区

参数:入口 ahInst - 工作区实例

*tblFname – 表格文件名

editable – 编辑状态标志,1/0 可/不可 出口

返回值 工作区号,若>0则表示成功,否则为失败。 打开某种类型的工作区

short _OpenArea(AREA_HINST ahInst,short type); 参数:入口 ahInst - 工作区实例

type - 工作区类型,允许使用下列宏定义之一:

出口

LIN,PNT,REG,NET,TBL。

返回值 返回工作区号,若>0则表示成功,否则为失败。 打开指定的数据文件对应的工作区,并将数据装入到新工作区中

short _OpenFileArea(AREA_HINST ahInst,char *fname,char *szDSN=NULL, char *szLOG=NULL,char *szPSW=NULL,short dtype=LIN);

参数:入口 ahInst - 工作区实例

*fname – 文件名

*szDSN - ODBC数据源名称 *szLOG - 登录号(登录名) *szPSW - 登录口令

dtype - 数据源类型 出口

返回值 返回工作区号,若>0则表示成功,否则为失败。

说明:若数据是本地数据,则该函数首先检测fname文件的类型,然后打开一个相同类型的新工作区,并将fname文件装入新工作区,最后返回工作区号。若是网络数据,则该函数根据dtype打开新工作区,并将fname指定的网络数据映射到新工作区。

关闭指定的工作区 int _CloseArea(short ai);

参数:入口 ai - 工作区号

出口

返回值0-失败,原因是ai工作区号非法或ai工作区不存在。

1-成功。

IDCANCEL-取消。

若工作区内容被修改,则该函数弹出如图4.1所示对话窗,若:

选择

选择

按钮,则该函数先保存文件,然后关闭工作区。 按钮,则该函数不保存文件就关闭工作区。

选择按钮,则该函数立即返回IDCANCEL。

遍历工作区

获取打开的工作区数

short _GetAreaNumber(AREA_HINST ahInst); 参数:入口 ahInst - 工作区实例

出口

返回值 返回属于ahInst实例工作区数。 取属于ahInst实例的第一个工作区号

short _GetFirstAreaNo(AREA_HINST ahInst); 参数:入口 ahInst - 工作区实例

出口

返回值 返回属于ahInst实例的第一个工作区号,返回值大于0是合法的工作区号,表示成功。

取属于ahInst实例的下一个工作区号 short _GetNextAreaNo(AREA_HINST ahInst); 参数:入口 ahInst - 工作区号。

出口

返回值 返回属于ahInst实例的下一个工作区号,返回值大于0是合法的工作区号,表示成功。

C示范:读取属于AHInst实例的所有工作区

……

short i, ai ,an;

an=_GetAreaNumber(AHInst);

ai=_GetFirstAreaNo(AHInst);

for(i=0;i

//使用ai工作区 }

……

清除工作区

清除工作区

short _ClearArea(short ai); 参数:入口 ai - 工作区号 出口

返回值 成功返回1,失败返回0

说明:该函数清除ai工作区中的所有内容,包括图形和属性,使用要慎重。若ai工作区中的内容已经改变,该函数弹出图4.1所示对话框,询问是否要保存数据,详细说明,请参阅_CloseArea函数。

查询和设置工作区特性

取工作区类型

char _GetAreaType(short ai);

char _AType(short ai);

参数:入口 ai - 工作区号

出口

返回值 返回工作区类型,可以是下列宏定义之一:

LIN,PNT,REG,NET,TBL,DBSTBL。 取工作区所属的实例号

AREA_HINST _GetAreaInstance(short ai); 参数:入口 ai - 工作区号

出口 返回值

返回ai工作区所属的工作区实例号

说明:工作区号由 _InitWorkArea初始化函数获得。 指定的工作区是否为空 short _IsAreaEmpty(short ai); 参数:入口 ai -工作区号 出口 返回值 工作区空(没有图元)则返回1,否则返回0 指定的工作区是否已经打开 ? short _IsOpenArea(short ai); 参数:入口 ai -工作区号 出口

返回值 打开则返回1,否则返回0

指定的工作区是否改变

char _GetChangeFlag(short ai); 参数:入口 ai -工作区号 出口

返回值 返回1表示改变,0表示未变或工作区号非法。

设置指定的工作区改变标志

short _SetChangeFlag(short ai,char chg);

参数:入口 ai -工作区号 chg-改变标志,1表示改变,0表示未变

出口

返回值 成功返回1,否则返回0

说明:除非特别需要,否则,MAPGIS应用程序不要使用该函数来强制工作区变化标志。当打开一个工作区、装文件到工作区或保存工作区内容后,MAPGIS管理系统自动将工作区的变化标志清为0。

受影响的函数:_ClearArea,_CloseArea。使用_SetChangeFlag函数强制改变工作区的变化标志,若chg=1,则_ClearArea,_CloseArea将显示图4.1所示提示窗;若chg=0,则_ClearArea,_CloseArea函数不显示图4.1所示提示窗。

设置数据压缩标志

short _SetPackFlag(short ai,short flag); 参数:入口 ai -工作区号

flag-压缩标志;1/0表示:压缩/不压缩

出口

返回值 返回原来的数据压缩标志。

说明:如果把某个工作区的压缩标志设置为1,那么在保存工作区内容时,被删除的实体将从物理上被清除掉。打开工作区时,压缩标志被设置为0,所以,在缺省情况下,保存工作区内容时,不清除被删掉的实体。重新装入文件时,被删掉的实体依然存在,并且可用_Undel函数恢复。

取数据压缩标志

short _GetPackFlag(short ai); 参数:入口 ai -工作区号

出口

返回值 返回数据压缩标志

工作区和文件系统的数据交流

将某个文件装入指定工作区 short _LoadFile(short ai);

参数:入口 ai - 工作区号

出口

返回值 成功返回1,失败返回0

说明:该函数根据ai号工作区类型弹出文件名输入窗,若输入的文件类型和工作区类型不符合,则该函数拒绝装入文件,并返回0。

若ai号工作区中已经有内容,则新装入的内容将覆盖旧的内容。

将指定文件装入指定工作区

short _LoadAFile(char *datName,short ai,char *szDSN=NULL,char *szLOG=NULL, char *szPSW=NULL);

参数:入口 * datName -文件名指针,若为本地数据,则必须带路径。若为网络数据,

则不带路径,且不允许数据名称有后缀,如”.wp”。该函数自动核对

文件和工作区类型。

ai - 工作区号

*szDSN - ODBC数据源名称,若=NULL,则datName为本地数据,否则是网络数据,数据通过szDSN指定的数据源进行存取。

*szLOG - 登录号(登录名) ,即为网络数据库的登录号。 *szPSW - 登录口令,即为网络数据库的登录口令。

出口

返回值 成功返回1,失败返回0

说明:若装入的文件类型和工作区类型不符,函数拒绝装入文件,并返回0。若ai工作区中已经有内容,则新装入的内容覆盖旧的内容。

添加某个文件到指定工作区 short _AppendFile(short ai); 参数:入口 ai - 工作区号 出口

返回值 成功返回1,失败返回0

说明:该函数根据ai号工作区类型弹出文件名输入窗,若输入的文件类型和工作区类型不符,则该函数拒绝添加文件,并返回0;若图元属性结构和工作区中已有图形属性结构不一致,该函数提问是否添加,若添加,则被添加文件的图元属性结构统一到工作区中的图元属性结构,这可能造成图元属性丢失。

添加指定文件到指定工作区

short _AppendAFile(char *fname,short *szLOG=NULL,

char *szPSW=NULL);

参数:入口 *fname - 文件名称,必须带路经

ai - 工作区号 *szDSN - ODBC数据源名称

*szLOG - 登录号(登录名) *szPSW - 登录口令

ai,char

*szDSN=NULL,char

出口

返回值 成功返回1,失败返回0

说明:该函数判断所添加文件的类型和工作区类型,若不相同,则该函数拒绝添加文件,并返回0;若图元属性结构和工作区中已有图形属性结构不一致,该函数提问是否添加,若添加,则被添加文件的图元属性结构统一到工作区中的图元属性结构,这可能造成图元属性丢失。

将工作区内容存入文件 short _SaveFile(short ai);

参数:入口 ai - 工作区号 出口

返回值 成功返回1,失败返回0

说明:若工作区有对应的文件名,则将工作区中的内容直接存到文件中;否则该函数弹出文件名输入窗,请求输入文件名并把工作区内容存入所输的文件中。

将工作区内容存入另一个文件 short _SaveFileAs(short ai); 参数:入口 ai - 工作区号

出口

返回值 成功返回1,失败返回0

说明:该函数弹出文件名输入窗,请求输入新文件名,然后将工作区中的内容存到新文件中,再将新文件名设置为工作区对应的文件名。

将工作区内容存入指定文件

short _SaveAFile(short ai,char *fname,char *szDSN=NULL,char *szLOG=NULL,

char *szPSW=NULL); 参数:入口 ai - 工作区号

*fname - 文件名指针,必须带路径,该函数自动强制文件名后缀

*szDSN - ODBC数据源名称

*szLOG - 登录号(登录名) *szPSW - 登录口令

出口

返回值 成功返回1,失败返回0 将指定实例的所有工作区分别存入文件

int _SaveAll(AREA_HINST ahInst); 参数:入口 ahInst - 工作区实例 出口

返回值 成功返回1,失败返回0

取工作区实体个数

short short short short

_GetLinNum(short ai,long *logN,long *n); _GetRegNum(short ai,long *logN,long *n); _GetPntNum(short ai,long *logN,long *n); _GetNodNum(short ai,long *logN,long *n);

short _GetNetNum(short ai,long *logN,long *n);

short _GetPathNum(short ai,long *logN,long *n); 参数:入口 ai - 工作区号 出口 *logN - 返回逻辑数,即未被删除的图元数 *n - 返回物理数(物理数=逻辑数+被删除图元数+1)

返回值 1/0 - 成功/失败

3、实体数据操作

以下介绍对工作区中的实体实施各类操作的函数,这些操作包括获取空间、图形、拓扑和属性数据,添加实体,删除实体等。

工作区中的实体都是通过实体号来标识的,所以访问实体的函数,如果是专门针对某一类实体的(如_GetLin、_GetLinTop、_GetLinAtt),一般都以工作区号、实体号作为第一个和第二个参数;如果函数可以处理多种实体类型(如_GetAtt),则一般以工作区号、实体类型、实体号作为头三个参数。例外的情况是往工作区中添加实体的函数,不会要求传入实体号,而是把工作区管理模块为新实体分配的实体号作为返回值。什么是实体号呢?实际上就是实体在工作区中的排序号。值得一提的是,这种排序号不一定是连续的。例如,假设一个线工作区中有五条线,线号分别是1、2、3、4、5,如果调用_DelLin函数删除了3号线,则4号、5号线的线号不会因此减一,而是保持不变。此时3号线的全部数据都还存在于工作区中,只是由于3号线已经被打上了删除标记,这些数据不再能够访问了,如果针对3号线来调用数据获取的函数,将会返回失败值。但是您可以通过调用恢复实体的函数_UnDelLin来去掉3号线的删除标记,从而恢复它的全部数据。

再来看一下工作区中的实体数目。由于被删除的实体在工作区中形成“空洞”,所以工作区中实体数目有物理数和逻辑数之分。物理数包括了被删除的实体,而逻辑数只计算未被删除、可以访问的实体。在工作区创建时,会为这个工作区中能够容纳的每一实体类型自动生成一个实体,编号为0,它只为某些内部特殊功能服务,二次开发者不应使用,但在计算物理数时,0号实体被计算在内,所以在工作区创建之初,每类实体的物理数都是1,逻辑数都是0。在上面所举线工作区的例子中,删除3号线之后,工作区中线的物理数是6,逻辑数是4。

为了彻底清除被删除的实体,避免“空洞”占据磁盘文件的空间,可以在工作区存盘之前调用函数_SetPackFlag,将工作区压缩标志设为1,存盘时将对实体号实施重排,被删除的实体被彻底丢弃。在上面线工作区的例子中,如果设了压缩标志后存盘,再重新装入工作区,线号将会发生改变。

命名惯例:

获取数据: _Get…

修改数据: _Write… _Update… 添加数据: _Append…

删除实体: _Del… 恢复实体: _UnDel…

线实体操作

取线实体

short _GetLin(short ai,long li,D_DOT **dat,long *len,LIN_INFO *inf); 参数:入口 ai - 工作区号

li - 线号,线号必须大于0

出口 **dat - 返回D_DOT数据块的地址(*dat所指内存空间有_GetLin申请) *len - 返回D_DOT数据项数(即线的点数)

*inf - 返回线图形信息,若不需要图形信息,则该参数可为NULL C++示例:从给定的ai号工作区中读取所有线 //…… long i,linN;

long len;

LIN_INFO linf; D_DOT *lxy;

//取线实体数,i返回逻辑数,linN返回物理数。 _GetLinNum(ai,&i,&linN); for(i=1;i

{ if(_GetLin(ai,i,&lxy,&len,&linf)<=0) continue;//略过被删除的线 //处理线实体代码

//

}

……

返回值 1=成功 0=失败 -1=该实体已被删除

说明:您一定注意到,在上述接口中,线坐标序列所占据的内存是由工作区管理模块来申请的,也许您会有疑问:这块内存区域如何释放?实际上工作区管理模块对于自己申请的内存都提供相应的函数让您来释放它们(请参阅详细的开发文档),不过您几乎从来不需要调用这些函数。工作区管理模块在以下两种时机释放自己申请的内存:1.关闭相应工作区时;2.调用对同一工作区操作的同一个函数,要向用户返回同样性质的内存区域时。

例如,先调用_GetLin取ai工作区的noLin0号线数据,工作区管理模块申请一块内存区域存放线坐标数据返回;之后又调用_GetLin取ai工作区的noLin1号线数据,工作区管理模块会把上次为noLin0号线申请的内存释放掉,再为noLin1号线申请一块内存区域存放线noLin1的坐标数据(内部的真实情况要复杂一点,如果后一块内存区域不大于前一块区域,工作区管理模块可能不会重新申请,而是直接占用前一块内存)。所以,下列连续调用_GetLin取同一工作区的线数据的作法是错误的(考虑一下为什么?): _GetLin(ai,noLin0,&lxy0,&llen0,NULL);

_GetLin(ai,noLin1,&lxy1,&llen1,NULL); 获取线图形信息

short _GetLinInfo(short ai,long li,LIN_INFO *inf); 参数:入口 ai - 工作区号 li - 线号。线号必须大于0

出口 *inf - 返回线图形信息

返回值 1=成功; 0=失败; -1=该实体已被删除。 更新线图形信息

short _UpdateLinInfo(short ai,long li,LIN_INFO *inf); 参数:入口 ai - 工作区号 li - 线号,线号必须大于0 *inf - 线图形信息变量地址 出口

返回值 1=成功; 0=失败 添加线到线工作区

long _AppendLin(short ai,D_DOT *dat,long len,LIN_INFO *inf); 参数:入口 ai -工作区号

*dat - D_DOT数据块

len - D_DOT数据项数

*inf - 线图形信息变量地址。该函数改变inf的rect值。

出口

返回值 成功则返回线号(>0),失败则返回0。

失败原因:1.线点数太少(<2); 2.工作区不存在; 3.工作区不是普通工作区; 4.线太短(长度

=0) 更新线

short _UpdateLin(short ai,long li,D_DOT *dat,long len,LIN_INFO *inf); 参数:入口 ai -工作区号 li - 线号,线号必须大于0

*dat - 线坐标数据串地址

len - 数据项数(坐标点数)

*inf - 线图形信息变量地址,若为NULL,则表示不更新线图形信息。若inf不等于NULL,该函数改变inf的rect值。 出口

返回值 1=成功; 0=失败。

失败原因:1.线点数太少(<2); 2.工作区不存在; 3.工作区不是普通工作区; 4.线太短(长度=0); 5.线号超界。

删除线实体

short _DelLin(short ai,long li); 参数:入口 ai -工作区号

li - 线号,线号必须大于0 出口

返回值 1=成功; 0=失败

说明:该函数仅仅从逻辑上删除指定的线实体。若再取被删除的线,则返回-1。 失败原因:1.工作区不存在; 2.工作区不是普通工作区; 3.线号超界。

恢复被删除的线

short _UnDelLin(short ai,long li); 参数:参照_DelLin 取线拓扑结构数据

short _GetLinTop(short ai,long li,LIN_TOP *top); 参数:入口 ai -工作区号

li - 线号

出口 *top - 返回线拓扑数据

返回值 1=成功; 0=失败 写线拓扑结构数据

short _WriteLinTop(short ai,long li,LIN_TOP *top);

参数:入口 ai -工作区号

li - 线号

*top - 线拓扑结构地址 出口

返回值 1=成功; 0=失败.

点实体操作

取点

short _GetPnt(short ai,long pi,D_DOT *xy,char **dat,short *len,PNT_INFO *inf); 参数:入口 ai - 工作区号

pi - 点号,点号必须大于0

出口 *xy - 返回点位置

**dat - 返回点内容(*dat所指内存空间由MAPGIS申请,若dat=NULL

则不返回点内容) *len - 返回dat数据长度(字节为单位)

*inf - 返回点图形信息参数,若不需要图形信息,则该参数可为NULL 返回值 1=成功, 0=失败, -1=该图元已被删除 取点图形信息

short _GetPntInfo(short ai,long pi,PNT_INFO *inf);

参数:入口 ai - 工作区号

pi - 点号,点号必须大于0 出口 *inf - 返回点图形信息

返回值 1=成功, 0=失败, -1=该图元已被删除

取点位置

short _GetPntPos(short ai,long pi,D_DOT *xy); 参数:入口 ai - 工作区号。

pi - 点号。

出口 *xy-返回点坐标。

返回值 1/0/-1:成功/失败/被删除。 更新点图形信息

short _UpdatePntInfo(short ai,long pi,PNT_INFO *inf);

参数:入口 ai - 工作区号 pi - 点号,点号必须大于0

*inf - 点图形信息

出口 无

返回值 1=成功, 0=失败, -1=该图元已被删除

获取点的类型

short _GetPntType(short ai,long pi,short *pntType); 参数:入口 ai - 工作区号

pi - 点号,点号必须大于0 出口 *pntType - 返回点类型

返回值 1=成功, 0=失败, -1=该图元已被删除

添加点

long _AppendPnt(short ai,D_DOT *xy,char *dat,short len,PNT_INFO *inf); 参数:入口 ai - 工作区号

xy - 点坐标位置

*dat - 点内容

len - dat数据长度(字节为单位)

*inf - 点图形信息 出口 无

返回值 成功返回点号(>0),失败返回0

更新点

short _UpdatePnt(short ai,long pi,D_DOT *xy,char *dat,short len,PNT_INFO *inf); 参数:入口 ai - 工作区号 pi - 点号

*xy - 点坐标位置 *dat - 点内容

len - dat数据长度(字节为单位)

*inf - 点图形信息,若为NULL,则表示不更新点图形信息

出口 无

返回值 1=成功,0=失败 更新点位置

short _UpdatePntPos(short ai,long pi,D_DOT *xy);

参数:入口 ai - 工作区号

pi - 点号

*xy - 点坐标位置

出口 无

返回值 1=成功,0=失败

删除点

short _DelPnt(short ai,long pi); 参数:入口 ai - 工作区号 pi - 点号

出口

返回值 1=成功,0=失败

说明:该函数从逻辑上删除第pi号点实体。 恢复被删除的点

short _UnDelPnt(short ai,long pi);

参数:入口 ai - 工作区号

ri - 点号

出口

返回值 成功返回1,失败返回0。

说明:该函数恢复第pi号点实体,该点被_DelPnt函数删除。

区实体操作

取区域

short _GetReg(short ai,long ri,long **rdat,short *len,REG_INFO *inf); 参数:入口 ai - 工作区号 ri - 区号,区号必须大于0

出口 **rdat- 返回long数据块的地址(*rdat所指内存空间由函数内部申请) *len - 返回rdat数据项数 *inf - 返回区图形信息,若不需要图形信息,则该参数可为NULL 返回值 1=成功, 0=失败, -1=该图元已被删除 说明:rdat结构为:

rdat[0] : 区边界弧段封闭所需总点数。若有n条弧段,m圈边界,n条弧段上一共

有d个点,则rdat[0]=d+m。

rdat[i] : i>0,其绝对值为区域边界弧段号,rdat[i]>0表示弧段正向,rdat[i]<0表示

反向。每一圈边界的弧段连续记录,圈与圈之间用0隔开。如:

1053 1 -10 15 0 -33 12 表示rdat长度len为7,区边界封闭总点数为1053个点,该区由两圈边界构成,

其中第一圈边界由1、10、15号弧段组成,第二圈边界由33和12号弧段组成,第10和第33号弧段反向。 获取区实体图形信息

short _GetRegInfo(short ai,long ri,REG_INFO *inf); 参数:入口 ai - 工作区号

ri - 区号,区号必须大于0 出口 *inf - 返回区图形信息 返回值 1=成功, 0=失败, -1=该图元已被删除

更新区实体图形信息

short _UpdateRegInfo(short ai,long ri,REG_INFO *inf); 参数:入口 ai - 工作区号 ri - 区号,区号必须大于0 *inf - 区图形信息参数 出口 返回值 1=成功, 0=失败 添加区实体

long _AppendReg(short ai,long *rdat,short len,REG_INFO *inf); 参数:入口 ai - 工作区号

*rdat - 区数据地址

len - 区数据项数

*inf - 区图形信息,该函数修改inf的rect值。

出口

返回值 成功返回区号,失败返回0

说明:该函数自动计算封闭边界总点数,并填入rdat[0]。该函数设置dat中各弧段的拓扑信息中的左 ,右多边形。但不检查拓扑的正确性。 更新区实体

short _UpdateReg(short ai,long ri,long *rdat,short len,REG_INFO *inf); 参数:入口 ai - 工作区号 ri - 区号

*rdat - 区域数据地址 len - 区域数据项数

*inf - 区图形信息参数,若为NULL,则表示不更新区图形信息

返回值 1=成功,0=失败

说明:该函数自动计算封闭边界总点数,并填入rdat[0], 该函数设置dat中各弧段的拓扑信息中的左 ,右多边形。但不检查拓扑的正确性。 删除区实体

short _DelReg(short ai,long ri);

参数:入口 ai - 工作区号 ri - 区号

出口

返回值 成功返回1,失败返回0。

说明:该函数从逻辑上删除第ri号区实体。该函数删除ri区与各弧段的联系。 恢复被删除的区实体

short _UnDelReg(short ai,long ri);

参数:入口 ai - 工作区号 ri - 区号

出口

返回值 成功返回1,失败返回0。

说明:该函数恢复第ri号区实体,该区被_DelReg函数删除。该函数恢复ri区与各弧段的联系。但不检查正确性。

出口

网实体操作

取网络

short _GetNet(short ai,long ni,long **hdat,long *len,NET_INFO *inf); 参数:入口 ai - 工作区号。

ni - 网络号,网络号必须大于0。

出口 **hdat- 返回long数据块的地址(*hdat所指内存空间由MAPGIS申请) *len - 返回hdat数据项数

*inf - 返回网络图形信息,若不需要图形信息,则该参数可为NULL

返回值 1=成功, 0=失败, -1=该图元已被删除 说明:hdat结构为:

hdat[0] : 网段总点数。

hdat[i] : i>0,其绝对值为网段号,hdat[i]>0表示网段正向,hdat[i]<0表示反向。

hdat[i]=0为非法网段号,可用于分隔网络的不同级别。

1053 1 -10 15 0 -33 12 表示hdat长度len为7,网络总点数为1053个点,该网络分成两部分,其中第一

部分由1、10、15号网段组成,第二部分由33和12号网段组成,第10和第33号网段反向。一个网络通常由相互连通的网段组成,一个网络分成几部分,系统无明确规定。 获取网络实体图形信息

short _GetNetInfo(short ai,long ni,NET_INFO *inf); 参数:入口 ai - 工作区号 ni - 网络号,网络号必须大于0

出口 *inf - 返回网络图形信息 返回值 1=成功, 0=失败, -1=该图元已被删除

更新网络实体图形信息

short _UpdateNetInfo(short ai,long ni,NET_INFO *inf); 参数:入口 ai - 工作区号

ni - 网络号,网络号必须大于0 *inf - 网络图形信息参数 出口

返回值 1=成功, 0=失败

添加网络实体

long _AppendNet(short ai,long *hdat,long len,NET_INFO *inf); 参数:入口 ai - 工作区号。

*hdat - 网络数据地址。

len - 网络数据项数。 *inf - 网络图形信息。 出口 无

返回值 成功返回网络号,失败返回0。 说明:该函数自动计算网段总点数,并填入hdat[0] 更新网络实体

short _UpdateNet(short ai,long ni,long *hdat,long len,NET_INFO *inf); 参数:入口 ai - 工作区号。 ni - 网络号。

*hdat - 网络数据地址。 len - 网络数据项数。

*inf - 网络图形信息参数,若为NULL,则表示不更新网络图形信息。 出口 无

返回值 1=成功,0=失败。

说明:该函数自动计算网段总点数,并填入hdat[0]。 删除网络实体

short _DelNet(short ai,long ni);

参数:入口 ai - 工作区号 ni - 网络号

出口

返回值 成功返回1,失败返回0。 说明:该函数从逻辑上删除第ni号网络实体。 恢复被删除的网络实体

short _UnDelNet(short ai,long ni);

参数:入口 ai - 工作区号 ni - 网络号

出口 无

返回值 成功返回1,失败返回0。

说明:该函数恢复第ni号网络实体,该网络被_DelNet函数删除。

VB函数:Declare Function bUnDelNet(ByVal ai As Integer, ByVal ni As Long) As

Integer

结点实体操作

取结点

int _GetNod(short ai,long ni,D_DOT *xy,long **dat,short *len); 参数:入口 ai - 工作区号 ni - 结点号 出口 *xy - 结点位置

**dat - 结点数据(dat所指内存空间由_GetNod申请) *len - 结点数据项数

返回值 >0表示成功; =0表示失败; <0表示已经被删除。若返回值不等于0,那么返回

值可能是下列宏定义的组合,表示该结点所拥有的数据类型,成功时组合值大于0,被删除时组合值小于0。

NOD_COMM:普通结点,拥有位置和连接的弧段信息。用_GetNod函数读取。 NOD_GRAPH:图形结点,拥有图示化信息。用_GetNodGraph函数读取。

NOD_LINK : 连通方阵,拥有表示弧段连通性的矩阵。用_GetNodLink函数读取。 NOD_CENTER:网络中心,具有网络中心的信息。用_GetNodCenter函数读取。 NOD_STOP : 网络站点,具有网络站点的信息。用_GetNodStop函数读取。 NOD_BARRIER: 网络阻碍,具有网络阻碍点的信息。用_GetNodBarrier函数读取。 NOD_TURNANG: 弧段转角,具有各弧段转角信息。用_GetNodTurnAng函数读取。 取图形结点

int _GetNod1(short ai,long ni,D_DOT *xy,long **dat,short *len,

char **infdat,short *inflen,PNT_INFO *inf);

参数:入口 ai - 工作区号 ni - 结点号

出口 *xy - 结点位置 **dat - 结点数据(dat所指内存空间由MAPGIS申请)。 *len - 结点数据项数。

**infdat- 结点图形信息数据(infdat所指内存空间由MAPGIS申请)。

*inflen - 结点图形信息数据长度。

*inf - 结点图形信息。

返回值 返回结点数据类型,返回值>0表示成功; =0表示失败; <0表示已经被删除。若返回值不等于0,则表示结点数据类型。若ni号结点不是图形结点,则返回值中,infdat=NULL,inflen=0,inf.type=-1。详细说明请参阅_GetNod函数。

取结点位置

int _GetNodPos(short ai,long ni,D_DOT *xy); 参数:入口 ai -工作区号

ni -结点号

出口 *xy - 返回结点位置 返回值 返回结点数据类型。返回值>0表示成功; =0表示失败; <0表示已经被删除。

详细说明请参阅_GetNod函数。

取结点类型

int _GetNodType(short ai,long ni); 参数:入口 ai -工作区号 ni -结点号

出口 无

返回值 返回结点数据类型。返回值>0表示成功; =0表示失败; <0表示已经被删

除。详细说明请参阅_GetNod函数。 取图形结点的图形信息

int _GetNodInfo(short ai,long ni,PNT_INFO *inf); 参数:入口 ai - 工作区号 ni - 结点号

出口 *inf - 返回结点图形信息

返回值 返回结点数据类型,返回值>0表示成功; 失败则返回0 ,且inf->type=-1.

已经被删除则返回值<0。详细说明请参阅_GetNod函数。 取图形结点的图形数据

int _GetNodGraph(short ai,long ni,char ** infdat,short * inflen,PNT_INFO *inf); 参数:入口 ai - 工作区号 ni - 结点号

出口 **infdat - 结点图形数据(gdat所指内存空间由MAPGIS申请) *inflen - 结点图形数据长度 返回值

*inf - 结点图形信息

返回结点数据类型,返回值>0表示成功; 失败则返回0,inf->type=-1;已经被删除则返回值<0。详细说明请参阅_GetNod函数。

添加结点

long _AppendNod(short ai,D_DOT *xy,long *dat,short len); 参数:入口 ai - 工作区号 *xy - 结点位置

*dat - 结点数据,即连接到该结点的弧段号。 len - 结点数据项数

出口 无

返回值 成功返回结点号,失败返回0

说明:该函数往工作区中添加一个新结点,并将该结点的数据类型自动设置为NOD_COMM

类型。

添加图形结点

long

_AppendNod1(short

ai,D_DOT

*xy,long

*dat,short

len,char

*infdat,short

inflen,PNT_INFO *inf);

参数:入口 ai -工作区号 xy - 结点位置 *dat - 结点数据

len - 结点数据项数

*infdat - 结点信息数组,没有信息数据时可=NULL

inflen - 结点信息数组长度(字节为单位),没有信息数据时必须=0 *inf - 结点信息地址,=NULL时表示该结点不带结点信息,此时infdat,inflen无效

出口 无

返回值 成功返回结点号,失败返回0。

说明:该函数往工作区中添加一个新结点,若inf=NULL,则该函数的功能与_AppendNod相同。若新结点有合法的图形信息,则结点类型为NOD_COMM|NOD_GRAPH。

更新结点数据

short _UpdateNod(short ai,long ni,D_DOT *xy,long *dat,short len); 参数:入口: ai - 工作区号 ni - 结点号

*xy - 结点位置 *dat - 结点数据

len - 结点数据项数 出口:无

返回值 1/0 - 成功/失败。

说明:若结点已经有图形信息,则该函数更新图形范围。

更新结点位置

short _UpdateNodPos(short ai,long ni,D_DOT *xy); 参数:入口: ai - 工作区号 ni - 结点号 *xy - 结点位置 出口:无

返回值 1/0 - 成功/失败。

说明:若结点已经有图形信息,则该函数更新结点图形范围。

更新图形结点的图形信息

short _UpdateNodInfo(short ai,long ni,PNT_INFO *inf); 参数:入口 ai - 工作区号 ni - 结点号

*inf - 结点图形信息变量地址

出口 无

返回值 1/0 - 成功/失败

说明:若结点没有图形信息,则返回失败;有则该函数更新结点图形范围。 int _UpdateNodGraph(short ai,long ni,char *gdat,short glen,PNT_INFO *inf); 参数:入口 ai - 工作区号

ni - *gdat-

结点号

结点图形数据

更新图形结点的图形数据

glen - 结点图形数据长度

*inf - 结点图形信息 出口 无

返回值 1/0 - 成功/失败

说明:如果ni号结点已经有图形数据,那么该函数更新原来的图形数据,在这种情况下,inf可以等于NULL,表示不更新图形参数。如果ni号结点没有图形数据,那么该函数就将图形数据添加到ni号结点,并改变结点数据类型(位或NOD_GRAPH),在这种情况下,inf不能为NULL。 更新图形结点结点数据

short _UpdateNod1(short ai,long ni,D_DOT *xy,long *dat,short len, 参数:入口 ai

ni xy *dat

char *infdat,short inflen,PNT_INFO *inf); -工作区号 -结点号

-结点位置 -结点数据

len -结点数据项数 *infdat -结点图形信息数据,对于NOTE,TEXT,IMAGE等数据,infdat不

inflen -结点图形信息数据长度

等于0.

*inf -结点图形信息

出口 无

返回值 1/0 - 成功/失败

说明:该函数的作用等同于_UpdateNod与_UpdateNodGraph之和。如果ni号结点已经有图形数据,那么该函数更新原来的图形数据,在这种情况下,inf可以等于NULL,表示不更新图形参数。如果ni号结点没有图形数据,那么该函数就将图形数据添加到ni号结点,并改变结点数据类型(位或NOD_GRAPH),在这种情况下,inf不能为NULL。 删除结点

short _DelNod(short ai,long ni); 参数:入口 ai -工作区号 ni -结点号

出口

返回值 1/0 - 成功/失败

说明:该函数从逻辑上删除第ni号结点。 short _UnDelNod(short ai,long ni); 参数:入口 ai -工作区号 ni -结点号

出口 无

返回值 1/0 - 成功/失败

说明:该函数恢复第ni号结点,该结点被_DelNod函数删除。

恢复被删除的结点

属性操作

属性结构操作 取某类属性结构

short _GetAttStru(short ai,short type,CATT_STRU **stru); 参数:入口 ai - 工作区号 type - 数据类型,type取值为下列宏定义之一:

LIN,PNT,REG,NOD,NET,TBL

出口 **stru- 返回属性结构(*stru所指内存空间由工作区申请) 返回值 1=成功,0=失败

说明:当type=LIN时,若ai是线工作区,则该函数取线属性结构;若ai是区域工作区,则该函数取弧段属性;若ai是网络工作区,则该函数取网段属性。 取特定属性结构

short _GetLinAttStru(short ai,CATT_STRU **stru); short _GetPntAttStru(short ai,CATT_STRU **stru); short _GetRegAttStru(short ai,CATT_STRU **stru); short _GetNodAttStru(short ai,CATT_STRU **stru); short _GetNetAttStru(short ai,CATT_STRU **stru); short _GetTblAttStru(short ai,CATT_STRU **stru); 参数:参照_GetAttStru 函数。 说明:参照_GetAttStru 函数。 设置某类属性结构

short _SetAttStru(short ai,short type,CATT_STRU *stru); 参数:入口 ai - 工作区号 type - 数据类型,type可取下列宏定义之一:

LIN,PNT,REG,NOD,NET,TBL

*stru - 属性结构 出口 无

返回值 1=成功,0=失败

说明:设置属性结构函数,用新结构代替原来的属性结构,原来的属性数据转换为新结构数据。

若要修改、浏览属性结构,建议使用函数_EditAttStruct、 _EditStruct 、 _ViewAttStruct或_ViewStruct。 注意事项:请阅读FELD_HEAD结构说明

short _SetLinAttStru(short ai,CATT_STRU *stru); 线 short _SetPntAttStru(short ai,CATT_STRU *stru); 点 short _SetRegAttStru(short ai,CATT_STRU *stru); 区 short _SetNodAttStru(short ai,CATT_STRU *stru); 结点 short _SetNetAttStru(short ai,CATT_STRU *stru); 网 short _SetTblAttStru(short ai,CATT_STRU *stru); 表 参数:参照_SetAttStru函数 说明:参照_SetAttStru函数 添加字段到某类属性结构中

short _AppendStruFld(short ai,short type,short fldn,CFIELD_HEAD *fldEntry); 参数:入口 ai - 工作区号

type - 数据类型,type可取下列宏定义之一:

LIN,PNT,REG,NOD,NET,TBL

fldn - 要添加的字段数 *fldEntry - 字段说明数组 出口 无

线 点 区 结点 网 表

设置特定属性结构

返回值 返回成功添加的字段数。

说明:该函数对要添加的字段名进行检查,若在原有字段中存在同名字段,则不添加同名的新字段。

VB函数:Declare Function bAppendStruFld(ByVal ai As Integer, ByVal tp As

Integer, ByVal fldN As Integer, fldEntry As

CFIELD_HEAD) As Integer

添加字段到特定属性结构中

short _AppendLinStruFld(short ai,short fldn,CFIELD_HEAD *fldEntry); 线 short _AppendPntStruFld(short ai,short fldn,CFIELD_HEAD *fldEntry); 点 short _AppendRegStruFld(short ai,short fldn,CFIELD_HEAD *fldEntry); 区 short _AppendNodStruFld(short ai,short fldn,CFIELD_HEAD *fldEntry); 结点 short _AppendNetStruFld(short ai,short fldn,CFIELD_HEAD *fldEntry); 网 short _AppendTblStruFld(short ai,short fldn,CFIELD_HEAD *fldEntry); 表 参数:参照_AppendStruFld函数 说明:参照_AppendStruFld函数 编辑指定工作区的属性结构

short _EditStruct(HWND hWnd,AREA_HINST ahInst); 参数:入口 hWnd - 窗口句柄 ahInst-工作区实例

出口 无

返回值 成功返回1,失败返回0

说明:调用该函数时,系统首先提请用户从ahInst实例中选择要编辑属性结构的工作区,然后弹出该工作区的属性结构编辑窗口,进行编辑操作。 属性记录操作 取某类属性

short _GetAtt(short ai,short atype,long i,CATT_STRU **stru,char **att); 参数:入口 ai - 工作区号

atype - 属性类型,可取下列宏定义之一:

LIN,PNT,REG,NOD,NET,TBL

i - 实体号

出口 **stru - 返回属性结构(*stru所指内存空间由工作区申请)

**dat - 返回属性记录数据(*dat所指内存空间由工作区申请) 返回值 1=成功,2=空记录,0=失败,-1=该属性对应的图元已经被删除 取特定类型属性

short _GetLinAtt(short ai,long i,CATT_STRU **stru,char **att);

short _GetPntAtt(short ai,long i,CATT_STRU **stru,char **att); short _GetRegAtt(short ai,long i,CATT_STRU **stru,char **att); short _GetNodAtt(short ai,long i,CATT_STRU **stru,char **att); short _GetNetAtt(short ai,long i,CATT_STRU **stru,char **att); short _GetTblAtt(short ai,long i,CATT_STRU **stru,char **att); 参数:参照_GetAtt函数 说明:参照_GetAtt函数 写某类实体属性

short _WriteAtt(short ai,short atype,long i, CATT_STRU *stru,char *att); 参数:入口 ai - 工作区号 atype- 属性类型,可取下列宏定义之一:

LIN,PNT,REG,NOD,NET,TBL

i - 实体号(当i超出合法范围时,写属性失败)

*stru - 属性结构

*att - 属性记录数据(该函数根据工作区中的属性记录结构确定记

录长度)

出口 无 返回值 1=成功,0=失败 写特定类型实体属性

short _WriteLinAtt(short ai,long i, CATT_STRU *stru,char *att); 线实体 short _WritePntAtt(short ai,long i, CATT_STRU *stru,char *att); 点实体 short _WriteRegAtt(short ai,long i, CATT_STRU *stru,char *att); 区实体 short _WriteNodAtt(short ai,long i, CATT_STRU *stru,char *att); 结点 short _WriteNetAtt(short ai,long i, CATT_STRU *stru,char *att); 网实体 short _WriteTblAtt(short ai,long i, CATT_STRU *stru,char *att); 表格 参数:参照_WriteAtt函数 编辑属性

HWND _EditAtt(HWND hWnd,AREA_HINST ahInst,DWORD dwStyle=0); 参数:入口 hWnd - 窗口句柄。用于接收消息。

ahInst - 工作区实例。

DwStyle – 窗口风格,可以为WS_CAPTION或WS_THICKFRAME

出口 无

返回值 成功返回属性窗口句柄,失败返回NULL。

说明:该函数首先调用_SelectFileAttType函数,让用户选择工作区和将要编辑的属性,然后创建一个如下图所示的属性编辑窗口,该窗口是窄边框的弹出式窗口,hWnd作为父窗口,并将所有消息送往hWnd窗口。

如上图所示,属性窗口具有五个菜单项:结束,联动,转至,屏蔽字段,记录排序。其功能如下:

1. 结束:结束属性编辑操作,清除属性编辑窗口。最后发送MGM_DESTROY_WND消息给hWnd窗口,该消息参数wParam=属性窗口句柄,lParam=0。 2. 联动:表示属性记录和图元是否相互联系,创建属性编辑窗口时,联动状态为连通,在这种状态下,属性窗口中的当前记录一旦变化,属性窗口马上就给父窗口hWnd发送消息MGM_FLASH_GRAPH,该消息的wParam参数为属性窗口状态,它可以是下列宏定义之一:

BEGIN_EDATT: 表示开始编辑属性。 EDITING_ATT: 表示正在编辑属性。

END_EDATT : 表示结束编辑属性。属性窗口发送此状态时,属性窗口没有撤消。一般情况,属性窗口发送的所有MGM_FLASH_GRAPH消息中,开始时为BEGIN_EDATT状态,最后为END_EDATT状态,中间为若干EDITING_ATT状态。 lParam参数为指向MGMSG结构的指针,该指针所指结构空间属于属性编辑窗口,MGMSG结构如下: typedef struct

{ short ai; //工作区号。

short type; //图元类型,为LIN,PNT,REG,NOD,NET,TBL之一。

long elmi; //图元号。

}MGMSG;

typedef MGMSG FAR* LPMGMSG;

通过lParam参数,通知hWnd窗口当前记录对应的图元是什么。 当联动状态为断开时,属性窗口不给hWnd窗口发送当前图元消息。 3. 转至:将属性窗口当前位置跳转到指定记录,该功能弹出输入窗口如下:

用户可直接输入记录号,也可以选择“条件跳转”按钮,输入条件表达式,然后系统查找第一个满足条件的记录,并将记录号显示在上面所示的记录号输入窗口内。关于输入条件表达式的说明,请参照 _InputExpresion函数说明。若记录号对应的记录被删除,则跳转到与记录号最近的记录。

4. 屏蔽字段:屏蔽部分字段,使之不可见。 5. 记录排序:记录按照指定的排序方法排序,并按照排序后的逻辑顺序显示。

VB函数:Declare Function bEditAtt(ByVal hWnd As Integer, ByVal AHInst As

Integer) As Integer

浏览属性

HWND _ViewAtt(HWND hWnd,AREA_HINST ahInst,DWORD dwStyle=0); 参数:入口 hWnd - 窗口句柄。用于接收消息。

ahInst - 工作区号。

DwStyle - 窗口风格。可以为 WS_CAPTION或WS_THICKFRAME

出口 无

返回值 成功返回属性窗口句柄,失败返回NULL。

说明:该函数的功能与_EditAtt函数相似,消息传送机制也相同,只是不能修改字段内容。

编辑、浏览当前属性

int _EditCurAtt(short ai,short aType,long i,char *titleName); int _ViewCurAtt(short ai,short aType,long i,char *titleName);

int _EditCurAtt1(CATT_STRU *stru,char *att,char *titleName,short ai=0);

int _ViewCurAtt1(CATT_STRU *stru,char *att,char *titleName,short ai=0);

参数:入口 ai - 工作区号。

aType – 属性类型 i – 指定记录号

*titleName – 窗口标题

*stru – 属性结构 *att – 属性

出口 无

返回值 成功返回属性窗口句柄,失败返回NULL。

个函数编辑、浏览指定记录的当前属性,后两个函数可编辑、浏览所有记录的当前属性。

说明:返回0,IDYES,IDNO,IDCANCEL,只有当显示窗口取消后,这些函数才返回。前两

字段操作

根据字段名称取字段序号

short _GetFldNo(CATT_STRU *stru,char *fldName);

参数:入口 *stru - 属性结构 *fldName- 字段名称

出口 无

返回值 成功返回字段序号,失败返回0。 根据字段名称取数值型字段值

double _GetFld(char *att,CATT_STRU *stru,char *fldName,short *type=NULL,short

*isBlank=NULL); short _GetField(char *att,CATT_STRU *stru,char *fldName,char *fldBuf,long bufLen,short *isBlank); 参数:入口 att - 属性记录 stru - 属性结构

*fldName- 字段名称

*fldBuf – 返回字段内容的缓冲区指针。 bufLen – fldBuf缓冲区字节长度。 *type - 返回字段类型的变量地址,若不需要返回字段类型,可设置 为NULL。

*isBlank – 返回字段是否为空的变量地址。 出口 *fldBuf – 返回字段内容

*type - 返回字段类型

*isBlank – 返回字段是否为空

返回值 _GetFld 函数返回字段值,因此,若fldName字段是非数值型字段,

该函数返回0;_GetField函数返回1/0,分别表示成功和失败,该函数通过fldBuf返回字段的二进制内容,因此,字段类型可以是任意类型。

说明:数值型字段包括:BYTE_TYPE(字节型),SHORT_TYPE(短整型),LONG_TYPE(长整型),FLOAT_TYPE(浮点型),DOUBLE_TYPE(双精度型),BOOL_TYPE(布尔型)。前一个函数通过函数返回值,后一个函数通过地址返回值。 根据字段序号取数值型字段值

double _GetFldOnNumb(char *att,CATT_STRU *stru,short fldi,short *type=NULL,short

*isBlank=NULL);

short _GetFieldOnNumb(char *att,CATT_STRU *stru,short fldi,char *fldBuf,long bufLen,short *isBlank); 参数:入口 *att - 属性记录 *stru - 属性结构

fldi - 字段序号,从0开始,第一个字段序号为0。

bufLen - 字段内容缓冲区长度

出口 *fldBuf – 字段内容缓冲区 *type - 返回字段类型的变量地址,若不需要返回字段类型,可设置为

*isBlank – 返回字段是否为空的变量地址

NULL。

说明:这两个函数的功能分别和_GetFld函数和_GetField函数相同,不同之处在于这两个函数是根据字段序号取字段内容,字段序号从0开始。其余注意事项请参阅_GetFld函数和_GetField函数。

根据字段名称设置字段值

short _SetFld(char *att,CATT_STRU *stru,char *fldName,char *realVal); 参数:入口 *att - 属性记录 *stru - 属性结构 *fldName- 字段名称,用来指定要修改的字段。

*realVal - 字段真值地址,该函数用此真值替换att中原来的字段值。

出口 无

返回值 1=成功,0=失败 说明:该函数仅仅把realVal值写到att所指内存空间上,若要永久修改属性字段值,还

必须调用_WriteAtt函数将属性记录写到工作区中。

VB函数:Declare Function bSetFld(att As Byte, stru As CATT_STRU, fldName As String, realVal As Any) As Integer

根据字段名称将字符串设置为字段值

short _SetFldFromStr(char *att,CATT_STRU *stru,char *fldName,char *strVal); 参数:入口 *att - 属性记录 *stru - 属性结构

*fldName- 字段名称,用来指定要修改的字段。 *strVal - 字符串地址,该函数将此字符串转换成字段名称所确定的字

段类型值,替换att中原来的字段值位置。

出口 无

返回值 1=成功,0=失败

说明:该函数仅仅修改att上的字段值,若要永久修改属性字段值,还必须调用_WriteAtt

函数将属性记录写到工作区中。

VB函数:Declare Function bSetFldFromStr(att As Byte, stru As CATT_STRU, fldName

As String, strVal As String) As Integer

根据字段序号设置字段值

short _SetFldOnNumb(char *att,CATT_STRU *stru,short fldi,char *realVal); 参数:入口 *att - 属性记录 *stru - 属性结构 *fldi - 字段序号,用来指定要修改的字段。

*realVal - 字段真值地址,该函数用此真值替换att中原来的字段值。

出口 无

返回值 1=成功,0=失败

说明:该函数仅仅修改att上的字段值,若要永久修改属性字段值,还必须调用_WriteAtt函数将属性记录写到工作区中。

VB函数:Declare Function bSetFldOnNumb(att As Byte, stru As CATT_STRU, ByVal fldi As Integer, realVal As Any) As Integer

根据字段序号将字符串设置为字段值

short _SetFldOnNumbFromStr(char *att,CATT_STRU *stru,short fldi,char *strVal); 参数:入口 *att - 属性记录

*stru - 属性结构

*fldi - 字段序号,用来指定要修改的字段。

*strVal - 字符串地址,该函数将此字符串转换成字段名称所确定的字

段类型值,替换att中原来的字段值位置。

出口 无

返回值 1=成功,0=失败

说明:该函数仅仅修改att上的字段值,若要永久修改属性字段值,还必须调用_WriteAtt函数将属性记录写到工作区中。

VB函数:Declare Function bSetFldOnNumbFromStr(att As Byte, stru As CATT_STRU,

ByVal fldi As Integer, strVal As String) As Integer

将属性记录中的字段内容转换成ASCII码

short _CvtFldToString(CATT_STRU *stru,char *att,short fldi,char *ptStr,short

ptLen,short *fldType,short *isBlank);

short _CvtFldToString1(CATT_STRU *stru,char *att,char *fldName,char

*ptStr,short ptLen,short *fldType,short *isBlank);

参数:入口 *stru – 属性结构 *att – 属性

*fldName– 字段名 fldi – 字段号

ptLen – 字符串缓冲区长度,要求比字段的字节长度多1个字节,以便存放字符串。

*ptStr – 返回字符串的缓冲区地址

*fldType – 返回字段类型的变量地址;若不需要,可设置为NULL *isBlank – 返回是否为空的变量地址

出口 *ptStr – 返回字符串内容 *fldType – 返回字段类型

*isBlank

– 返回字段是否为空

返回值 1=成功,0=失败 说明:将stru和att属性记录中第fldi号字段内容转换成ASCII码填到ptStr中,ptLen要>=32,ptStr的长度一般要求比字段的字节长度(fieldlength)多1个字节,以便存放字符串结束符(若是STR_TYPE的话)。若fldType=NULL,则不返回字段类型,若isBlank=NULL,则不返回空值标志(5.0版设为NULL)。 统改属性记录字段 long _RepLstRcdFld0(short ai,short aType,long *ptLst,char *ptRepFldFlag, char

*attExp,void *grpPad, void *grpInf,char *repAtt);

参数:入口 ai – 工作区号

aType - 属性类型

*ptLst - 将要进行替换的记录号表,ptLst[0]=个数,ptLst[1]...pt[ptLst[0]]=

记录号,若ptLst=NULL则统改所有记录。

*ptRepFldFlag - 替换字段开关;ptRepFldFlag[i]对应i(从0开始)号字段,

1=替换,0=不替换

*attExp *grpPad 结构,

其余类推。可为NULL。

*grpInf - 图形参数地址,如aType=LIN时,*grpInf为LIN_INFO结构,其余

类推。可为NULL。

*repAtt - 替换值记录数据

出口 无

返回值 成功则替换ptLst表所列记录的指定字段,返回统改的记录数,失败返

回0。 字段统改

short _RepLstRcdFld(short ai,short aType,long *ptLst,char *titleName); 参数:入口 ai – 工作区号

aType - 统改属性类型

*titleName–统改属性值条件输入窗口标题

*ptLst - 统改记录号表,ptLst[0]=个数,ptLst[1]...pt[ptLst[0]]=记录号,

若ptLst=NULL则统改所有记录 出口 无

返回值 成功=1,失败=0

统改字段值

short _ModLstRcdFldVal(short ai,short aType,long *ptLst,short fldI,char *fldVal);

参数:入口 ai

– 工作区号

- 属性条件表达式字符串,可为NULL,即无属性条件 - 图形参数开关地址,如aType=LIN时,*grpPad为LIN_PAD

aType - 统改属性类型

*ptLst - 统改记录号表,ptLst[0]=个数,ptLst[1]...pt[ptLst[0]]=记录号,

若ptLst=NULL则统改所有记录 fldI - 统改字段号

*fldVal - 返回统改字段域值地址

出口 无

返回值 成功=1,失败=0

4、网络分析数据操作 弧段分配方案

设置弧段分配方案

short _SetAllocatedArcs(short ai,long *arcsLst,long len); 参数:入口 ai - 工作区号

*arcsLst - 弧段分配列表

len -

弧段分配列表长度

出口 无

返回值 成功返回1,失败返回0。

取所有弧段数

long _GetAllocatedArcsNum(short ai); 参数:入口 ai - 工作区号

出口 无

返回值 成功返回弧段数,失败返回0。

取弧段分配方案

short _GetAllocatedArcs(short ai,long *arcsLst,long len); 参数:入口 ai - 工作区号

len - 弧段分配列表长度 出口 *arcsLst - 弧段分配列表 返回值 成功返回1,失败返回0。

取弧段分配信息

short _GetArcAllocInfo(short ai,long li,ARC_ALLOC_INFO *allocInf); 参数:入口 ai - 工作区号 li - 弧段号

出口 *allocInf - 返回弧段分配信息 返回值 成功=1,失败=0。 设置弧段分配信息

short _SetArcAllocInfo(short ai,long li,ARC_ALLOC_INFO *allocInf); 参数:入口 ai - 工作区号 li - 弧段号

*allocInf - 弧段分配信息 出口

返回值 成功=1,失败=0。

结点转角权值

设置结点的转角权值类型

int WINAPI _SetLinkValType(short ai,long ni,short valType); 参数:入口 ai -工作区号 ni -结点号

valtype -连通值数据类型,可以是下列值之一:BIT_TYPE、BYTE_TYPE、

SHORT_TYPE、LONG_TYPE、FLOAT_TYPE、DOUBLE_TYPE。

返回值 返回结点数据类型。详细说明请参阅_GetNod函数。

取结点的转角权值

int _GetNodLink(short ai,long ni,long li0,long li1, double *val,short *valtype); 参数:入口 ai -工作区号 ni -结点号

li0 -前一条弧段 li1 -后一条弧段

出口 *val-返回弧段连通值,连通值范围由连通值数据类型决定

*valtype -返回连通值数据类型,可以是下列值之一:BIT_TYPE、

BYTE_TYPE、SHORT_TYPE、LONG_TYPE、FLOAT_TYPE、DOUBLE_TYPE。

若不需要返回连通值数据类型,则valtype可以为NULL。

返回值 返回结点数据类型。详细说明请参阅_GetNod函数。

更新结点的转角权值

int _UpdateNodLink(short ai,long ni, long li0,long li1,double *val); 参数:入口 ai -工作区号 ni -结点号

li0 -前一条弧段 li1 -后一条弧段

*val -弧段连通值,连通值的取值取决于_SetLinkValType ()函数所设类

型,

出口 无

返回值 1/0 - 成功/失败

说明:如果ni号结点已经有连通方阵,那么该函数更新原来的连通方阵;否则就将连通方阵添加到ni号结点,并改变结点数据类型(位或NOD_LINK)。

网络中心数据

取网络中心结点数据

int _GetNodCenter(short ai,long ni,NOD_CENTER_INFO *ncinf); 参数:入口 ai -工作区号

ni -结点号 出口 *ncinf-返回网络中心结点数据

返回值 返回结点数据类型,详细说明请参阅_GetNod函数。 更新网络中心结点数据

int _UpdateNodCenter(short ai,long ni,NOD_CENTER_INFO *ncinf); 参数:入口 ai -工作区号

ni -结点号 *ncinf-网络中心结点数据

出口 无

返回值 1/0 - 成功/失败

说明:如果ni号结点已经有网络中心结点数据,那么该函数更新原来的网络中心结点数据;否则就将网络中心结点数据添加到ni号结点,并改变结点数据类型(位或NOD_CENTER)。

网络站点数据

取网络站结点数据

int _GetNodStop(short ai,long ni,NOD_STOP_INFO *nsinf); 参数:入口 ai -工作区号 ni -结点号

出口 *nsinf-返回网络终止结点数据

返回值 返回结点数据类型,失败则返回0,请参阅_GetNod函数。 更新网络站点数据

int _UpdateNodStop(short ai,long ni,NOD_STOP_INFO *nsinf); 参数:入口 ai -工作区号

ni -结点号

*nsinf-网络终止结点数据

出口 无

返回值 1/0 - 成功/失败

说明:如果ni号结点已经有网络终止结点数据,那么该函数更新原来的网络终止结点数据;否则就将网络终止结点数据添加到ni号结点,并改变结点数据类型(位或NOD_STOP)。

网络障碍数据

取网络障碍结点数据

int _GetNodBarrier(short ai,long ni,NOD_BARRIER_INFO *nbinf);

参数:入口 ai -工作区号

ni -结点号 出口 *nbinf-返回网络障碍结点数据

返回值 返回结点数据类型,失败则返回0,请参阅_GetNod函数。 更新网络障碍结点数据

int _UpdateNodBarrier(short ai,long ni,NOD_BARRIER_INFO *nbinf); 参数:入口 ai -工作区号 ni -结点号

*nbinf -网络障碍结点数据 出口 无

返回值 1/0 -成功/失败

说明:如果ni号结点已经有网络障碍结点数据,那么该函数更新原来的网络障碍结点数据,否则就将网络障碍结点数据添加到ni号结点,并改变结点数据类型(位或NOD_BARRIER)。

5、查找检索 位置判断函数

判断点是否在矩形框内

short _PntInRect(D_DOT *dot,D_RECT *rc); 参数:入口 dot - 判断点位置

*rc - 矩形范围

出口 无

返回值 dot点在rc矩形框内返回2,在矩形框上返回1,在框外返回0。

判断点是否在多边形内

short _IsDotInPolygon(D_DOT *pxy,long dn,D_DOT *dot) 参数:入口 *pxy - 多边形坐标串,不要求多边形封闭

dn - pxy包含的点数 *dot - 判断点坐标

出口 无

返回值 dot点在多边形内返回2,在边线上返回1,在多边形外返回0。 VB函数:Declare Function bIsDotInPolygon(pxy As D_DOT, ByVal dn As Long, ByVal

dot As D_DOT) As Integer

判断点是否在区域内

short _IsDotInReg(short regNum,D_DOT *xy,long *ne,D_DOT *dot,short flg); short _IsDotInReg1(D_DOT *dot,short ai,long ri,short flg); 参数:入口

*xy - 区域边界坐标数据串。请参阅_GetRegEdge函数说明。 ai - 工作区号

ri - 区域号

*ne - 区域边界每一圈点数。 *dot - 判断点坐标。

Flg - 是否判断内圈标志,1/0:判断/不判断。即flg=1时,要严格判断点

是否落在区域内,若落在区域的空洞内,也认为是落在区域外

边。

出口 无

返回值 dot点在区域内返回2,在边线上返回1,在区域外返回0。

VB函数:Declare Function bIsDotInReg(ByVal regNum As Integer, xy As D_DOT,

ne As Long, ByVal dot As D_DOT, ByVal flg As Integer) As Integer

判断线是否与区域相交

short _LinInterReg(short lai,long li,short rai,long ri);

short _LinInterReg1(D_DOT *xy,long len,D_DOT *rxy,long *ne,short neLen); 参数:入口 *xy – 线上点坐标数据串

*rxy - 区域边界坐标数据串。请参阅_GetRegEdge函数说明。 lai - 线工作区号 rai - 区工作区号 ri - 区域号

*ne - 区域边界每一圈点数 neLen - ne数组的项数

出口 无

返回值 相交返回1,否则返回0

判断两个区是否相交

short _RegInterReg(short rai,long ri,short rai1,long ri1);

short _RegInterReg1(D_DOT *rxy0,long *ne0,short ne0Len,D_DOT *rxy1,long *ne1,short ne1Len);

参数:入口 rai - 第1个区所在的工作区号

rai1 ri ri1 *rxy0 *rxy1

- 第2个区所在的工作区号 - 第1个区的区号 – 第2个区的区号

– 第1个区的边界坐标数据串 - 第2个区的边界坐标数据串

*ne0 *ne1 - 第1个区的区域边界每一圈点数 - 第2个区的区域边界每一圈点数

neLen0 – ne0的项数 neLen1 - ne1的项数

出口 无

返回值 0 在区域外,1 与区域相交(包括重叠)。

判断网络是否与区域相交

short _NetInterReg(short nai,long ni,short rai,long ri);

short _NetInterReg1(short nai,long ni,D_DOT *rxy1,long *ne1,short ne1Len); 参数:入口 nai - 网工作区号

rai - 区工作区号

ni - 网络号 ri – 区域号

*rxy1 -区域边界坐标数据串

*ne1 -区域边界每一圈点数 neLen1 -ne1的项数

出口 无 返回值 0 在区域外,1 与区域相交(包括重叠)。 判断已知曲线是否与矩形框相交

short _LinInterRect(D_DOT *xy,long len,D_RECT *rc,D_RECT *lrc=NULL); 参数:入口 xy - 曲线坐标 len - 线点数 rc - 矩形检测范围 *lrc - 曲线范围 出口 无

返回值 若曲线与矩形框相交或被矩形框包含则返回1,否则返回0。

判断某号线是否与矩形框相交

short _LinCrossRect(short ai,long i,D_RECT *rc); 参数:入口 ai - 工作区号

i - 线号

rc - 矩形检测范围

出口 无

返回值 若曲线与矩形框相交或被矩形框包含则返回1,否则返回0。

判断已知区域是否与矩形框相交

short _RegInterRect(short ai,long *rdata,short len,D_RECT *rc,D_RECT *rrc=NULL); 参数:入口 ai - 工作区号

*rdata len rc

- 区数据

- rdata数据项数 - 矩形检测范围

*rrc - 区域范围

出口 无

返回值 若区域与矩形框相交则返回1,否则返回0。区域与矩形相交是指:区域边线与矩形框相交,或者整个区域被矩形框包含,或者矩形框被包含在区域内。

判断某号区域是否与矩形框相交

short _RegCrossRect(short ai,long i,D_RECT *rc); 参数:入口 ai - 工作区号

i - 区号

rc - 矩形检测范围

出口 无

返回值 若区域与矩形框相交则返回1,若不相交或者该函数失败则返回0。区域与矩形相交是指:区域边线与矩形框相交,或者整个区域被矩形框包含,或者矩形

框被包含在区域内。

判断已知网络是否与矩形框相交

short _NetInterRect(short ai,long *hdata,long len,D_RECT rc,D_RECT *nrc=NULL); 参数:入口 ai - 工作区号

*hdata len rc

- 网络数据

- hdata数据项数 - 矩形检测范围 - 网络范围

*nrc 出口 无

返回值 若网络与矩形范围相交则返回1,否则返回0。网络与矩形相交是指:网络的网段与矩形框相交,或者整个网络被矩形框包含。 判断某号网络是否与矩形框相交

short _NetCrossRect(short ai,long i,D_RECT rc); 参数:入口 ai - 工作区号 i - 网络数据

rc - 矩形检测范围 出口 无

返回值 若网络与矩形框相交则返回1;若不相交或该函数失败则返回0。网络

与矩形相交是指:网络的网段与矩形框相交,或者整个网络被矩形框包含。

查找函数

查找最近点

long _NearPnt(short ai,D_DOT *dot, unsigned char *layerOnOffPad=NULL,double *dis=NULL);

参数:入口 ai - 点工作区号 *dot - 点位置,dot为图形实际坐标

*layerOnOffPad-图层开关标志,若此项参数不为NULL,则只在处于打开

状态的

图层中查找。

出口 *dis – 返回距离

返回值 成功返回点号(>0),失败返回0

查找最近线

long _NearLin(short ai,D_DOT *dot, unsigned char *layerOnOffPad=NULL,double

*dis=NULL);

参数:入口 ai - 线工作区号 *dot - 点位置,dot为图形实际坐标

*layerOnOffPad-图层开关标志,若此项参数不为NULL,则只在处于打开状态的

图层中查找。

出口 *dis – 返回距离

返回值 成功返回线号(>0),失败返回0 查找点所在的区

long _SeekReg(short ai,D_DOT *dot, unsigned char *layerOnOffPad=NULL); 参数:入口 ai - 区工作区号

*dot - 点位置,dot为图形实际坐标

*layerOnOffPad-图层开关标志,若此项参数不为NULL,则只在处于打开

状态的

图层中查找。

出口 无

返回值 成功返回区号(>0),失败返回0 说明:该函数查找完全包含dot点的区,(不包括点落在边界上的区)。 查找线上最近点

long _SelDotofLin(D_DOT *pxy,long n,D_DOT *dot); 参数:入口 *pxy- 线坐标数组

n - 线点数 *dot - 查找位置 出口 无

返回值 成功返回点序号(>=0),失败返回-1

说明:该函数查找pxy线上离dot点最近的点。假设返回值为di,若di>=0,则线上离

dot点最近的点是pxy[di]。

表达式函数

输入表达式

short _InputExpresion(HWND hWnd,CATT_STRU *stru,char *expStr,short len,char

*title, FIELD_NAME_STR *ptFldAlias );

参数:入口 hWnd - 窗口句柄。 *stru - 属性结构。 *expStr - 表达式字符串存放内存空间。 len - expStr空间的字节长度。

*title - 窗口标题 *ptFldAlias –字段别名

出口 *expStr - 返回条件表达式字符串

返回值 成功返回1,失败0。成功返回时,输入的表达式已经合法。 说明:该函数创建下图所示对话框,并将属性字段名和类型列在字段名称子窗口中。用

户输入表达式后,若选择Cancel按钮,则返回失败;若选择OK按钮,则该函数调用系统_ExpresionValid函数进行表达式字符串合法性检查,如果表达式合法,则将表达式字符串存在expStr参数所指内存空间中,然后返回成功,如果非法,则要求用户重新输入表达式。关于表达式合法性,请参阅_ExpresionValid函数。

表达式合法性检查

short _ExpresionValid(CATT_STRU *stru,unsigned char *expStr); 参数:入口 *stru - 属性结构。 *expStr - 表达式字符串。 出口 无

返回值 成功返回1,失败0。

说明:该函数检查表达式合法性。表达式的构成包括:小括号(和),字段名称,常量,操作符。其中常量包括:

1. 数值型常量,如0,1,21,3.45等,对应的字段类型为字节型,短整型,长整型,浮点型,双精度型,逻辑型(1=真,0=假)。 2. 日期型,如1997/7/1即1997年7月1日,对应字段类型为日期型。 3. 时间型,如 13:15:24.5即13点15分24.5秒,对应字段类型为时间型。

4. 字符串型,如 “钢材” ,字符常量必须包括一对双引号,对应字段类型为字符串型。 操作符包括: 1.算术运算符,包括 +,-,*,/,%,即加,减,乘,除,求余。

2.条件运算符,包括 >,>=,<,<=,==,!=,即大于,大于等于,小于,小于等于,相等,不等。

3.逻辑运算符,包括 &&,||,^,~,即逻辑与,逻辑或,逻辑异或,逻辑非。 表达式构成规则:

1. 表达式中的变量必须是合法的字段名称,即必须是属性结构中的字段名。 2. 表达式中的小括号必须配对。

根据上述规则,可构成下列算术表达式: 线长度*10.0

30-(ID )

也可构成下列逻辑表达式:

(线长度>10)&&(管线材料==“钢材”) 输入表达式,创建表达式对象

MyExpOBJ _InputExpOBJ(HWND hWnd,CATT_STRU *stru,char *title=NULL); 参数:入口 hWnd - 窗口句柄。 *stru - 属性结构。 *title – 表达式输入窗口标题

出口 无

返回值 成功返回表达式对象,否则返回NULL。

说明:该函数的功能与_InputExpresion函数相似,不同点在于该函数创建一个表达式对象,并返回对象指针,所以调用该函数之后,必须调用_FreeMyExpOBJ函数释放表达式对象。

检查表达式字符串的合法性,并创建表达式对象

MyExpOBJ _ExpStrValid(CATT_STRU *stru,unsigned char *expStr); 参数:入口 *stru - 属性结构。 *expStr - 表达式字符串。 出口 无

返回值 表达式合法则返回一个表达式对象,非法则返回NULL。

说明:该函数依据属性结构,解释表达式字符串,如果正确就创建一个表达式对象,并返回对象指针,所以调用该函数之后,必须调用_FreeMyExpOBJ函数释放表达式对象。 计算表达式值

double _ExpValue(MyExpOBJ myObj,CATT_STRU *stru,char *att,short *domainErrNo=NULL);

参数:入口 myObj - 表达式对象,由_InputExpOBJ或_ExpStrValid创建。 *stru - 属性结构。 *att - 属性记录。

*domainErrNo – 返回表达式计算过程中的错误信息的变量地址;可为

NULL 出口 *domainErrNo – 返回表达式计算过程中的错误信息 返回值 返回表达式计算结果。

说明:如果创建对象的表达式属于算术表达式,那么该函数返回计算结果。如果表达式属于逻辑表达式,那么返回值为1或0,以表示真和假。 释放表达式对象

void _FreeMyExpOBJ(MyExpOBJ myObj);

参数:入口 myObj - 表达式对象,由_InputExpOBJ或_ExpStrValid创建。 出口 无

返回值 无

说明:该函数必须和_InputExpOBJ或_ExpStrValid函数配对使用。

四、显示输出

以下内容涉及MAPGIS实体的显示输出,相关头文件: Map_Out.h

1、显示设备对象

MAPGIS引入一个新的概念——显示对象(MyDC),有时侯也称显示设备句柄,类似于Windows中的HDC。在显示对象中集成了Windows的DC和MAPGIS基本显示处理的函数,MAPGIS的所有显示函数都是针对某一个显示对象的,即所有显示都显示在这个对象所联系的窗口上。每个窗口都对应不同的显示对象,都可以设置不同的图形模式和显示参数。

在开始绘图前,首先需获得图形显示设备句柄(HDC)或显示对象句柄(MyDC)。如果您调用Windows API绘图函数,则需获取当前绘图窗口的HDC,如果您使用MAPGIS API绘图函数,则需用_GetMyDC获取当前绘图窗口的MyDC。

获得了显示设备句柄后,就可以开始绘图了。在使用画笔绘图时,您需要设置画笔的颜色、笔宽、模式等。在使用刷子填充区域时,您同样需要设置刷子的颜色、填充图案、笔宽、模式等。在绘图完毕,需要将设置的画笔和刷子清除掉。

有的绘图函数使用的坐标为图形坐标(有时也称逻辑坐标),有的则为设备坐标。图形坐标是指图形文件所采用的坐标系上的坐标;设备坐标系则当前要显示图形的设备所对应的坐标系。两种坐标系根据都采用右手坐标系,即左下角为原点,X轴向右为正,Y轴向上为正。两种坐标系的关系如下图所示:

s s’

y y’ (x0,y0)

(0,0)

x (0,0) x’

用户坐标系 显示比例r=s’/s 设备坐标系

图形最终是要在设备上显示或输出的,如果用户使用用户坐标系,则MAPGIS要把用户

坐标转化为设备坐标再输出。为实现这种转换,显示对象(MyDC)中存放有显示参数,记录当

前用户坐标的原点、用户显示区域和显示比例。当需要把用户坐标转化为设备坐标时,MAPGIS就要利用显示参数。所以调用以用户坐标为参数的显示函数之前,一定要先正确设置显示对象(MyDC)中的显示参数。

如果函数要求使用设备坐标,而当前数据是图形坐标,则需要调用_LpToDp函数将图形坐标转换为设备坐标再调用。如果显示设备的精度较高,则显示数据一定要用双精度数据,不要用整型数据。

取显示对象句柄

MyDC _GetMyDC(HWND hwnd,PAINTSTRUCT * lpps=NULL);

MyDC _GetMyDCDir(HWND hwnd,HDC hdc,PAINTSTRUCT * lpps=NULL); 参数:入口 hWnd

- 窗口句柄

– 设备句柄

- Paint处理结构指针(缺省为NULL)

hdc *lpps

出口 无

返回值: 显示对象句柄

说明:获取显示对象的句柄,其作用类似于Windows的GetDC或BeginPaint。当lpps为NULL时,这个函数类似于GetDC的作用,当lpps不为空时类似于BeginPaint函数。使用获取显示对象的句柄的函数,必须调用_DeleteMyDC函数加以释放。

删除显示对象

void _DeleteMyDC(MyDC mdc); 参数:入口 mdc - 显示对象句柄 出口 无 返回值: 无

说明:这个函数删除由_GetMyDC和_GetMyDCDir函数获取的显示对象,其作用类似于Windows的ReleaseDC或者EndPaint。系统根据对象的状态执行相应的删除操作。 取显示对象的DC

HDC _GetDrawingDC(MyDC mdc); 参数:入口

出口 无 返回值: 窗口设备句柄

说明:这个函数从显示对象中取出其使用的窗口设备句柄。 设置显示参数

short _SetDispParam(MyDC mdc, double fx0, double fy0, double fScalex, double

fScaley = 0, double fAngle = 0); 参数:入口 mdc fx0,fy0 fScalex,fScaley

fAngle 出口 无

- 显示对象句柄 - 视口原点坐标

- x,y方向的缩放比例 – 显示角度(缺省为0)

mdc

- 显示对象句柄

返回值: 1/0: 成功/失败 取显示参数

short _GetDispParam(MyDC mdc,double *pfx0, double *pfy0, double *pfScalex,

double *pfScaley= NULL, double *pfAngle=NULL); 参数:入口 mdc 出口: *pfx0,*pfy0

- 显示对象句柄 - 视口原点坐标

*pfScalex,*pfScaley - x,y方向的缩放比例

*pfAngle – 显示角度(缺省为NULL) 返回值: 1/0: 成功/失败

设置显示范围

short _SetDispRect(MyDC mdc,D_RECT frc); 参数:入口 mdc frc

出口 无 返回值: 1/0:

-显示对象句柄 -显示范围 成功/失败

取当前显示范围

short _GetDispRect(MyDC mdc,D_RECT *frc); 显示范围

short _GetDeviceRect(MyDC mdc,RECT *rc) 视口范围 参数:入口 出口: 返回值:

mdc -显示对象句柄

*frc -返回显示范围 *rc 1/0:

-返回视口范围 成功/失败

逻辑坐标(或图形坐标)与设备坐标互换

(1) 逻辑坐标->设备坐标

void _LpToDp(MyDC mdc,D_DOT *pdP);

void _LpToDp(MyDC mdc,float x,float y,int *pfx,int *pfy); 参数 入口 mdc – 显示对象句柄 *pdP – 逻辑坐标

x,y – 逻辑坐标

出口 *pdP – 设备坐标

*pfx *pfy

– 设备坐标x

– 设备坐标y

返回值: 无

void _DpToLp(MyDC mdc,float *pfx,float *pfy);

void _DpToLp(MyDC mdc,int ix,int iy,float *pfx,float *pfy); 参数 入口 mdc –显示对象句柄

*pfx,*pfy –设备坐标(x,y)

ix,iy –设备坐标(x,y)

(2) 设备坐标->逻辑坐标

出口 *pfx,*pfy –逻辑坐标(x,y)

返回值: 无 设置还原显示状态

short _SetOriginalDisp(MyDC mdc,short Origif); 参数:入口 mdc - 显示对象句柄

Origif - 还原显示状态 0/1:非还原显示/还原显示 出口 无

返回值: 返回旧的状态

说明: 当还原显示状态为真时,显示图元的函数按模拟输出的标准显示,所用的线型、图案等都显示出来,在这个状态下显示速度较慢。在非还原显示状态时,线型、图案等都不显示,汉字显示等函数也作了简化处理,故显示速度较快。 设置坐标点显示状态

short WINAPI _SetCoordPntDisp(MyDC mdc,short sCoord); 参数:入口 mdc - 显示对象句柄

sCoord - 坐标点显示状态 0/1:不显示/显示 出口 无

返回值: 返回旧的状态

说明:当坐标点显示状态为真时,显示图元的函数在图元的坐标点处显示一个小的红十字,在编辑时可作为参考。 锁定绘图颜色

void _LockColor(MyDC mdc,COLORREF col); void _LockColor(MyDC mdc,long col); 参数:入口 mdc - 显示对象句柄

col - 被锁定的颜色

出口 无

返回值: 无

说明:颜色锁定后,所有绘图操作都以这个颜色显示。 解除颜色锁定

void _UnLockColor(MyDC mdc); 参数:入口 mdc - 显示对象句柄 出口 无 返回值: 无

2、实体显示输出

MAPGIS提供四个层次上的显示输出函数 1. 显示输出整个工作区

如_DispPntArea(mdc,ai); 2. 显示输出工作区中的某一实体 如_DispPnt(mdc,ai,noPnt);

3. 在用户坐标系下显示输出实体数据 如_DispPnt(mdc,&dxy,dat,len,&pinf); 4. 在设备坐标系下显示输出实体数据 如:_DispString,_DispText,_DispSubgr等

显示输出整个工作区

显示点工作区

short _DispPntArea(MyDC mdc,short ai,short layon=0); 参数:入口 mdc - 显示对象句柄

ai - 工作区号

layon – 图层开关标志

为0时(默认)不检查图层开关,为1时检查图层开关 出口 无 返回值:: 1/0 成功/失败

显示线工作区

short _DispLinArea(MyDC mdc,short ai,short layon=0);

参数:入口 ai - 工作区号 mdc - 显示对象句柄 layon – 图层开关标志 为0时(默认)不检查图层开关,为1时检查图层开关

出口 无

返回值: 1/0: 成功/失败

VB函数:Declare Function bDispLinArea(ByVal myDC As Long, ByVal ai As Integer,

ByVal layon As Integer) As Integer

显示区工作区

short _DispRegArea(MyDC mdc,short ai,short layon=0); 参数:入口 ai - 工作区号

mdc - 显示对象句柄 layon – 图层开关标志

为0时(默认)不检查图层开关,为1时检查图层开关

成功/失败

出口 无

返回值: 1/0:

显示输出工作区中的某一实体

显示点实体

short _DispPnt(MyDC mdc,short ai,long gno,short col=0); 参数:入口 mdc - 显示对象句柄 ai - 工作区号

gno - 点图元编号

col - 显示颜色

出口 无 返回值: 1/0: 成功/失败

说明:这个函数根据工作区号和图元编号读出图元的数据并调用下面的函数显示。 显示线实体

short _DispLin(MyDC mdc,short ai,long gno,short col=0); 参数:入口 mdc - 显示对象句柄 ai - 工作区号

gno

- 线图元编号

出口 无

col - 显示颜色

返回值: 1/0: 成功/失败

说明:这个函数根据工作区号和图元编号读出图元的数据并调用下面的函数显示。 显示区实体

short _DispReg(MyDC mdc,short ai,long gno,short col=0); 参数:入口 mdc - 显示对象句柄 ai - 工作区号 gno - 图元编号 col - 显示颜色 出口 无

返回值: 1/0: 成功/失败

说明:这个函数根据工作区号和图元编号读出图元的数据并调用下面的函数显示。

在用户坐标系下显示输出实体数据

根据点信息及数据显示

short _DispPnt(MyDC mdc,D_DOT* xy,char *dat,short len,PNT_INFO *inf,short col=0); 参数:入口 mdc - 显示对象句柄 xy - 点位置坐标,图形坐标

*dat - 要显示的点数据 len - 点数据字节长度

*inf - 点图形信息结构地址 col - 显示颜色 出口 无

返回值: 1/0:

成功/失败

说明:这个函数根据当前视口参数(原点坐标X,Y以及比例r)计算出各点的设备坐标位置,和图元的实际参数,如字高、字宽等,然后根据点类型调用下列函数: _DispString、_DispText、_DispSubgr、_Circle、_CircleFill、_Arc。

根据线图形信息及数据显示

short _DispLin(MyDC mdc,D_DOT *lxy,long len,LIN_INFO *inf,short col=0); 参数:入口 mdc - 显示对象句柄 lxy - 线坐标数组,坐标值为图形坐标 len - 坐标点数 inf - 线图形参数结构地址 col - 显示颜色

出口 无 返回值: 1/0:

成功/失败

说明:该函数根据当前视口参数,将lxy数组中的坐标点转换为设备坐标,然后绘制线图元。如果指定col值,则显示颜色以col为准,否则以inf中颜色为准。若设置还原显示,则根据inf中指定的线型进行显示,否则仅显示为一条实线。

根据线数据快速显示

short _DispLin(MyDC mdc,D_DOT *lxy,long len,short col=0); 参数:入口 mdc lxy

len col 出口 无

- 显示对象句柄

- 线坐标数组,坐标值为图形坐标 - 坐标点数 - 线颜色

返回值: 1/0: 成功/失败

说明:该函数根据当前视口参数,将lxy数组中的坐标点转换为设备坐标,然后快速绘

制该图元。此时该线仅显示为实线。 根据区信息及区数据显示

short _DispReg(MyDC mdc,short ai,long *rdata,short len,REG_INFO *inf,short col=0);

参数:入口 mdc - 显示对象句柄 ai - 工作区号

*rdata - 区域边界弧段号数组 len - rdata数组长度 *inf - 区域图形信息结构变量地址

col - 显示颜色

出口 无

返回值: 1/0: 成功/失败

说明:这个函数根据当前视口参数,将图元数组的坐标转换为设备坐标,然后绘制该图元。如果指定col值,则显示颜色以col为准,否则以inf中颜色为准。若设置还原显示,则根据inf中指定的颜色及图案进行显示,否则仅显示为实心区。

在设备坐标系下显示输出实体数据

画线图元

void _DrawLine(MyDC mdc,POINT *xy,long len, short col=0); 参数:入口 mdc - 显示对象句柄 *xy - 线坐标数组,坐标值为设备坐标

len - 坐标点数 col - 线颜色

出口 无

返回值: 无

说明:该函数根据线颜色col为mdc创建画笔,然后调用Windows的Polyline函数画线。 区域填充

void _RegionFill(MyDC mdc,POINT *xy,int *ne, int regnum,int col=0); 参数:入口 hdc - 显示对象句柄

*xy *ne col

- 区域边界坐标数组,坐标值为设备坐标 - 边界坐标点数数组 - 填充色

regnum - ne数组项数

出口 无

返回值: 无

说明:该函数根据填充色col为hdc创建刷子,然后调用Windows的Polygon或者

PolyPolygon函数,再删除被创建的刷子。 显示字符串

_DispString(MyDC mdc,double x,double y,float h,float w, char *str,short zt,short zx,float ang, float sp,char pl,long col);

参数:入口 mdc - 显示对象句柄 x,y - 显示字符串的设备坐标。

h - 字高 w - 字宽 *str - 字符串代码 zt - 字体 zx ang

- 字形

- 字符串角度

sp - 字间距 hvpl - 排列方式(0/1: 横排/竖排) col - 字颜色 出口 无

返回值: 1/0

- 成功/失败

显示文本

short _DispText(MyDC mdc ,double x,double y,float px,float py,

参数:入口

float h ,float w,char *str,short zt,short zx, float ang,float sp,float ls,char pl,long col); hdc

- 显示对象句柄

x,y - 显示文本的设备坐标。 px - 文本排列范围宽度 py - 文本排列范围高度 h - 字高

w - 字宽 *str - 字符串代码 zt - 字体

zx - 字形

ang - 字符串角度 sp - 字间距 lspace - 行间距

hvpl - 排列方式(0/1:横排/竖排) col - 字颜色 出口 无

返回值: 1/0 - 成功/失败 显示子图

short _DispSubgr(MyDC mdc,long subno,double x, double y, double hei, double wid, double ang,short col=0); 参数:入口

mdc

- 显示对象句柄

subno - 子图号

x,y - 显示子图的设备坐标。

hei - 子图高 wid - 子图宽度 ang col 出口 无 返回值: 1/0 显示图象

- 子图旋转角 - 子图颜色 - 成功/失败

short _DispImage(MyDC mdc,char* name,double x,double y,double w,double h); 参数:入口 mdc - 显示对象句柄 *name - 图象文件名 x,y - 图象的左下角位置的设备坐标。

w - 图象显示高度 h - 图象显示宽度

- 成功/失败

出口 无

返回值: 1/0 画直线

void _Line(MyDC mdc,float x1,float y1, float x2,float y2); void _Line(MyDC mdc,D_DOT xy1, D_DOT xy2);

void _Line(MyDC mdc,int x1,int y1,int x2, int y2,short clr=0); 参数:入口 mdc - 显示对象句柄

x1,y1 x2,y2 xy1,xy2

- 直线起点的设备坐标。 - 直线终点的设备坐标。 - 直线两端点的设备坐标。

- 线颜色。若clr为0,则使用缺省设置画笔的颜色。

clr 出口 无

返回值: 无

说明:前两个函数的颜色和笔宽由_SetPen函数设定;第三个函数的颜色由col指定,

若不指定,则使用缺省画笔的颜色,而笔宽一律为1。 画圆线

void _Circle(MyDC mdc,float rad);

void _Circle(MyDC mdc,int x,int y,int r, short col=0); 参数:入口 mdc - 显示对象句柄 x,y - 圆心的设备坐标。 rad - 圆半径(若r=0则该函数把r强制为1) col - 圆颜色 出口 无 返回值: 无

说明:第一个函数_CircleF以当前点(MoveTo, LineTo移动到的位置)为圆心,rad为半径画圆。圆线的颜色和笔宽由_SetPen函数设定;第二个函数_CircleI的颜色由col指定,若不指定,则使用缺省画笔的颜色,而笔宽一律为1。 画填充圆

void _CircleFill(MyDC mdc,float rad);

void _CircleFill(MyDC mdc,int x,int y,int r,short col=0); 画折线

void _PolyLine(MyDC mdc,D_DOT *lxy,long *ne, int na); 参数:入口 hdc - 显示对象句柄

*lxy - 区域边界坐标数组,坐标值为设备坐标 *ne - 边界坐标点数数组 na - ne数组项数

出口 无 返回值: 无

画填充多边形

void _PolyGon(MyDC mdc,D_DOT *lxy,long *ne,int na); 参数:入口 hdc - 显示对象句柄 *lxy - 区域边界坐标数组,坐标值为设备坐标

*ne - 边界坐标点数数组 na - ne数组项数

出口 无 返回值: 无 画矩形

void _Rect(MyDC mdc,float x1,float y1, float x2,float y2); void _Rect(MyDC mdc,D_RECT rect);

void _DrawRect(MyDC mdc,D_DOT* pfd1,D_DOT* pfd2);

void _Rect(MyDC mdc,int x1,int y1,int x2, int y2,short clr=0);

参数:入口 mdc - 显示对象句柄 x1,y1 - 第一对角点的设备坐标。

x2,y2 - 第二对角点的设备坐标 rect - 矩形的对角点坐标

*pfd1 - 第一对角点的逻辑坐标 *pfd1 - 第二对角点的逻辑坐标 clr - 矩形线颜色

出口 无 返回值: 无 画点

本文来源:https://www.bwwdw.com/article/j0z5.html

Top