|
MAPX的属性存储技术
MAPX的属性存储技术
目 录
1 方案一:属性数据存在MAPINFO的TAB表 4
1.1 技术思路 4
1.2 实现步骤 4
1.2.1 创建和打开图层 4
1.2.2 对象修改的数据提交,数据更新过程 4
1.3 各模块设计 4
1.3.1 属性信息修改流程: 4
1.4 如何在MapX下读取属性值 5
2 方案二:MAPINFO的属性表和ORACLE数据值表都存储,作二次提交 5
2.1 技术思路 5
2.2 实现步骤 6
2.2.1 创建和打开图层,第一次数据同步 6
2.2.2 过程中的数据同步 6
2.2.3 对象修改的数据提交,数据更新过程 6
3 方案三(为主):MAPINFO的属性表中不存储,ORACLE数据值表存储 6
3.1 技术思路 6
3.2 实现流程图 7
3.2.1 创建打开图层 7
3.2.2 过程中的数据同步 8
3.2.3 对象修改的数据提交,数据更新过程 8
3.3 实现步骤 9
3.3.1 创建和打开图层,第一次数据同步 9
3.3.2 过程中的数据同步 9
3.3.3 对象修改的数据提交,数据更新过程 9
3.4 技术实现 9
3.4.1 接口实现 9
3.4.2 几个接口的流程设计 13
4 三种方案的优缺点 18
4.1 方案一 18
4.1.1 优点 18
4.1.2 缺点和风险 18
4.2 方案二 18
4.2.1 优点 18
4.2.2 缺点和风险 18
4.3 方案三 19
4.3.1 优点 19
4.3.2 缺点和风险 19
5 存在和要注意的问题 19
5.1 做电子地图的规定 19
5.1.1 图层名称 19
5.1.2 图层对应MAPX属性表的关键字段要指定 19
5.1.3 属性表进行插数据时 20
5.2 创建和打开图层进行数据的第一次同步时速度慢 20
5.2.1 如果Oracle数据库中对应属性表不存在,建表和插入数据 20
5.2.2 表存在为每个图层绑定Oracle属性表时速度也比较慢 20
5.3 对对象进行编辑做数据库提交时 20
5.3.1 判断对象的属性数值的合法性 20
5.4 实时数据的更新方案上还待解决 21
1 方案一:属性数据存在MAPINFO的TAB表
1.1 技术思路
每个图层通过数据绑定本地tab属性数据表,对图层对象的修改和查询直接是对MAPINFO的TAB表。
1.2 实现步骤
1.2.1 创建和打开图层
为每个图层通过数据绑定本地tab属性数据表。
1.2.2 对象修改的数据提交,数据更新过程
更新MAPINFO属性表。
1.3 各模块设计
1.3.1 属性信息修改流程:
1.3.1.1 选择feature对象
1.3.1.2 显示属性信息编辑窗体,参考INFO自定义工具
1.3.1.3 在窗体修改属性值
1.3.1.4 更新属性信息修改程序实现
1.4 如何在MapX下读取属性值
有三种方法:
1.4.1.1 1. 由Layer对象的KeyField属性来设立要读取属性值的字段名。
接着,由Feature对象的keyValue读取此行的属性值。
1.4.1.2 2. 将图层加入到Datasets, 由Dataset对象的Value(x,y)属性,通过设置行号,列号来获得属性值。
3. 将图层加入到Datasets,之后由RowValues(ftr)获取整行的值
2 方案二:MAPINFO的属性表和ORACLE数据值表都存储,作二次提交
2.1 技术思路
MAPINFO的属性表中存储,ORACLE表数据值表也存储,作二次提交。关键处理MAPINFO的属性表存储属性与ORACLE表的数据值,出现不同步的处理上。实时将数据提交到ORACLE还是定时处理的选择。
2.2 实现步骤
2.2.1 创建和打开图层,第一次数据同步
判断数据库中表(某种方式命名,待定)是否存在,如果存在表示数据库中的属性数据是最新的,此时更新MAPINFO的属性表。把图层绑定MAPINFO的属性表。不存在则创建ORACLE表,结构和MAPINFO的属性表相同,并且插入MAPINFO的属性表的数据做最新的属性数据。
2.2.2 过程中的数据同步
根据关键KEY,实时和定时有机结合从ORACLE表的数据值来更新MAPINFO的属性表。并进行图层绑定MAPINFO的属性表。
2.2.3 对象修改的数据提交,数据更新过程
更新MAPINFO属性表,同时更新起数据库事务把更新的对象属性更新。如果更新失败则连刚才进行的MAPINFO属性表的更新也要取消,以保证数据的完整性。
3 方案三(为主):MAPINFO的属性表中不存储,ORACLE数据值表存储
3.1 技术思路
通过第一次同步达到多用户数据的同步,过程中的实时图层数据绑定来达到并发的同步。操作和绑定的数据直接的存取ORACLE数据值表。采用ODBC数据连接方式。
3.2 实现流程图
3.2.1 创建打开图层
3.2.2 过程中的数据同步
根据关键KEY,实时和定时有机结合取ORACLE表的数据值来绑定图层。具体方案待定。更新完了数据就进行数据集的刷新。提供一个数据集刷新功能,让用户能刷新。
3.2.3 对象修改的数据提交,数据更新过程
3.3 实现步骤
3.3.1 创建和打开图层,第一次数据同步
判断数据库中表(某种方式命名,待定)是否存在。
不存在则创建ORACLE表,先要绑定MAPINFO的属性表,表结构和MAPINFO的属性表相同(加关键字和字增字段、占用标志、最新更新时间字段)占用标志字段名为ATFLAG,最新更新时间字段名为NEWDATA,自增变量字段名为表名+‘_ID’。
初始化数据(关键字为空的话就插入根据自增变量字段得到的数值构造的数据)完了后就删除该绑定而加上ORACLE表绑定,并且插入MAPINFO的属性表的数据做最新的属性数据。
如果存在则图层绑定ORACLE数值表。
采用ODBC数据连接方式。
3.3.2 过程中的数据同步
根据关键KEY,实时和定时有机结合取ORACLE表的数据值来绑定图层。具体方案待定。
更新完了数据就进行数据集的刷新。提供一个数据集刷新功能,让用户能刷新。
3.3.3 对象修改的数据提交,数据更新过程
更新起数据库事务把更新的对象属性更新。如果更新失败则连刚才进行的属性更新也要取消,以保证数据的完整性。更新完了数据就进行数据集的刷新。
3.4 技术实现
3.4.1 接口实现
3.4.1.1 创建和打开图层,第一次数据同步
如果Oracle表不存在,对每个图层操作如以下步骤:
1、 构造表名(以图层的名称构造或者待定)
{
功能说明:把字符之间的空格去掉变成'_',也可以加上构造的一些规则
得到能让图层和ORacle表名一一对应的表名
参数说明:Str为要构造的字符,返回为构造后的字符
}
Function ConfigureStr(Str :string):string;
2、 判断Oracle中表是否存在
{ 功能说明:判断表名是否存在
参数说明:TableName为要判断的表名,Query用的数据集
返回为true表示表存在
}
Function JudgeTableName(TableName :string;Query :TADOQuery):boolean;
3、 把MAPINFO的属性表绑定该图层
map1.Datasets.Add(miDatasetLayer,lyr,lyrName,EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam)
4、 得到MAPINFO的属性表的字段信息
{
功能说明:输出给Oracle的字段类型
参数说明:Fields表示MAPINFO的属性表的字段集
Dataset是要得到字段信息的数据集
}
Procedure GetFieldInfo(Fields:CMapXfields;Dataset :CmapxDataset);
5、 建表
{
功能说明:构造建表的ORACLE---SQL语句并建Oracle表
同时建建关键字和自增变量和占用标志、最新更新时间字段
参数说明:Fields由GetFieldInfo的字段信息,TableName操作的表名,
Query用的数据集,Database用的数据库用来起事务
返回为true表示建成功
}
Function DoCreateTable(Fields :array of TFieldRecord;
TableName :string;Query :TADOQuery;Database :TADOConnection):boolean;
6、 把MAPX的tab属性表更新到Oracle属性表中作为最新的属性数据,实现了数据的第一次同步
{
功能说明:更新表(新增时插入数据),数据量多时不好办!
参数说明:Dataset是要得到进行数据插入的源数据集,TableName操作的表名,
Query用的数据集,Database用的数据库用来起事务
返回为true表示新增数据成功
}
Function UpdataTable(TableName :string;Database :TADOConnection;
Query :TADOQuery;Dataset :CmapxDataset):boolean;
表存在后把Oracle绑定该图层:
1、先删除原先绑定的MAPINFO的属性表
{
功能说明:删除MAPINFO的属性表的图层绑定
参数说明:Datasets要输出数据集的数据集的集合,DataSetName为要删除的数据集名
返回为true表示删除成功
}
Function DeleteDataSet(Map :TMap;Layer: CMapXLayer):boolean;
2、把Oracle属性表绑定该图层
{
功能说明:把ORACLE表绑定在该图层
参数说明:Layer要绑定数据的图层,TableName对应的ORACLE表,Query用的数据集
返回为绑定成功的数据集
}
Function BindOracleDataSet(Map :TMap;Layer:CMapXLayer;
TableName :string;Query :TADOQuery;DoQuery: TADOQuery):CmapxDataset;
3.4.1.2 对象修改的数据提交,数据更新过程
1、 定位对象---得到要修改对象的主键值
{
功能说明:从图层的绑定的数据集中,定位对象---得到要修改对象的主键值
参数说明:Ftr要判断的对象,Datasets要输出数据集的数据集的集合,
ftr为对应要找的那个对象
返回该对象对应的关键字的数值。字段名是用对应表的自增变量。
}
Function FindKeyValue(TableName:string;Dst :CmapxDataset;ftr:CMapxFeature):string;
2、 判断对象记录的占用
{
功能说明:判断选中要修改的对象的判断对象记录的占用标志得到为0则表是没有占用,
1表占用,Ftr要判断的对象,Datasets要输出数据集的数据集的集合
参数说明:TableName对应的ORACLE表,Query用的数据集
返回为true表示占用
}
Function IsATFLAG(TableName :string;
Query :TADOQuery;Ftr:CMapxFeature;Dst :CmapxDataset):boolean;
3、 判断对象更新标志
{
功能说明:判断选中要修改的对象的判断对象记录的最新标志得到为0则表是没有占用,
1表占用,Ftr要判断的对象,Datasets要输出数据集的数据集的集合
参数说明:TableName对应的ORACLE表,Query用的数据集
返回为true表示数据库中为最新,要下载
}
Function IsNEWDATA(TableName :string;
Query :TADOQuery;Ftr:CMapxFeature;Dst :CmapxDataset):boolean;
3.4.2 几个主要接口的流程设计
3.4.2.1 得到MAPINFO的属性表的字段信息(GetFieldInfo)
3.4.2.2 建表(DoCreateTable)
3.4.2.3 把MAPX的tab属性表更新到Oracle属性表中作为最新的属性数据,实现了数据的第一次同步(UpdataTable)
4 三种方案的优缺点
4.1 方案一
4.1.1 优点
速度比较快,编码方便。
4.1.2 缺点和风险
可是不知道为什么不能存储中文。如果是多用户并发操作时,实现非常麻烦。大数据量处理上风险很大。本机数据存取性能不是很稳定。
4.2 方案二
4.2.1 优点
事务的处理保证了数据的完整性,数据库的性能也是比较稳定,对多用户并发处理的支持。
4.2.2 缺点和风险
MAPINFO的属性表存储属性与ORACLE表的数据值的数据同步问题。还有就是大数据量时的实时更新问题。如果处理好同步,风险相对小。
4.3 方案三
4.3.1 优点
最安全,性能最好的方案。对多用户操作数据的同步的绝对支持(如果采用图层实时绑定数据)。对对象修改时用事务处理保证数据的完整性,数据库性能稳定也是数据最安全的。
4.3.2 缺点和风险
数据的时延(采用图层实时绑定数据,所以一般采用实时和定时绑定数据的有机结合)。风险相对是最小的。
5 存在和要注意的问题
5.1 做电子地图的规定
5.1.1 图层名称
5.1.1.1 图层名称不能为空
5.1.1.2 图层名称的字符串要规范(不要出现单引号,双引好括号和其他特殊字符最好不要有)
5.1.2 图层对应MAPX属性表的关键字段要指定
5.1.2.1 MAPX属性表的关键字段不能为空
5.1.2.2 字段名称不能为空
5.1.2.3 字段不要出现特殊字符(不要出现单引号,双引好括号和其他特殊字符最好不要有)
5.1.3 属性表进行插数据时
5.1.3.1 关键字段的数值不能为空
5.1.3.2 字段数值为字符都(不要出现单引号,双引好括号和其他特殊字符最好不要有)
5.2 创建和打开图层进行数据的第一次同步时速度慢
5.2.1 如果Oracle数据库中对应属性表不存在,建表和插入数据
最好起线程,并且不要全部图层一起做
5.2.2 表存在为每个图层绑定Oracle属性表时速度也比较慢
最好起线程,并且不要全部图层一起做
5.3 对对象进行编辑做数据库提交时
5.3.1 判断对象的属性数值的合法性
5.3.1.1 长度不要超过
5.3.1.2 关键字数值不能为空
5.3.1.3 字符要规范(不要出现单引号,双引好括号和其他特殊字符最好不要有)
5.3.1.4 插入要在数据库事务里进行
5.4 实时数据的更新方案上还待解决 |
|