ArcGIS 成果迁移方案
ArcGIS中通过地图(*.mxd)存储大量的地图配图信息,包括数据、地图显示颜色、符号、样式、标注、专题图等。MapGIS可快速将ArcGIS的地图(*.mxd)转换为MapGIS的地图(*.mapx),并继承其配图信息。
本文档旨在提供一套完整的ArcGIS成果迁移方案,指导用户快速、精准将ArcGIS的地图(*.mxd)转换为MapGIS的地图(*.mapx)。
根据地图内容,迁移过程包括如下四个步骤:
数据转换
考虑到真实业务中会涉及到大量的地图(*.mxd)及数据,为避免数据的冗余。建议先将数据导入到MapGIS的数据库中。
shp/FileGDB/PersonalGDB数据
若原始数据为shp/FileGDB/PersonalGDB类型,建议用"数据转换"功能进行数据迁移。
1. 在MapGIS Catalog中选择目标数据库,右键"导入"->"其他数据",启动数据转换对话框;

2. 点击"添加",可下拉筛选数据类型。选择ArcGIS源数据。

3. 点击"转换",执行数据迁移操作。
ArcSDE(Oracle)数据
若原始数据为ArcSDE(Oracle)数据,建议用"MapGIS工具箱"->"数据转换"->"数据库迁移工具"进行数据迁移。
提示:
MapGIS在连接ArcSDE数据库时,需先保证客户机上已安装64位Oracle客户端。
1. 在MapGIS GDBCatalog面板,启动"客户端配置管理"功能,弹出如下所示对话框:

2. 切换到"数据源"页面,点击"添加",选择"跨平台ArcSDE",服务名称为ArcGIS Oracle数据库信息,格式为{IP}/{实例名} 或 {IP}:{Port}/{实例名}。

3. 添加成功后,在MapGIS GDBCatalog节点,可看到对应的数据源信息;

4. 启动"工具箱"->"数据转换"->"数据库迁移"功能,弹出如下所示对话框:

5. 设置源数据库为ArcSDE数据库,目的数据库用户可自定义。

6. 点击"确定",执行数据迁移操作,可将ArcGIS SDE中所有数据迁移到MapGIS数据库中。
拷贝ttf字体
ArcGIS 地图在进行矢量地图符号化显示时,部分字符都是采用TrueType(*.ttf)字体库进行样式绘制。当操作系统中缺少这些字体库时,会导致ArcMap中符号样式显示异常。
通过制图成果转换将ArcMap的Mxd文档转换为MapGIS的Mapx地图文档时,符号化过程会继承Mxd地图符号化时关联的TrueType(*.ttf)字体库信息。因此,需保证MapGIS所在的客户机也已安装对应的TrueType(*.ttf)字体库。
此处程序无法判断地图(*.mxd)中使用的字体库信息,用户需要自行抉择。
如,用户在客户机A上进行ArcGIS配图,使用了TrueType(*.ttf)字体库 B。现在客户机C上安装MapGIS进行制图成果转换,需保证客户机C上也安装TrueType(*.ttf)字体库 B。
将*.ttf字体库文件,直接拷贝到"C:\Windows\fonts"目录下,即可自动安装TrueType字体库。
迁移制图成果Mxd
1. 在MapGIS中启动"工具"面板->"制图成果转换"功能,弹出如下所示对话框:
2. 点击"添加mxd",选择ArcGIS地图(*.mxd或*.lyr)文件。
3. 数据连接方式选择"替换到已有数据库",并选择"数据转换"的目标数据库,并勾选"高质量显示"。

4. 点击"转换"按钮,系统可自动检测是否启动插件,需点击"是"启动插件。

5. 制图成果转换完成后,点击"是"打开制图成果纠错工具。

微调成果Mapx
由于ArcGIS 和 MapGIS 制图机制的差异性,部分细节并未能正确转换。MapGIS的"制图成果纠错"工具,将可能存在的细节差异以列表形式提供给用户,用户可基于此列表进行交互修改。从而保证转换后地图的一致性。
目前支持如下几种错误类型检查:
- 图层连接失败:地图文档(*.mapx)记录了每个数据层在数据库中URL信息。若根据URL无法匹配到数据库中数据,会在列表中显示。
- 标注类SQL条件语句解析失败:当图层采用"定义要素类并为每个要素类添加不同标注"时,需为每个类设置SQL条件。若此条件规则在MapGIS中无效时,会在列表中显示。
- 标注类字段使用复杂表达式:设置动态注记时,需设置"字段"信息。若字段信息在MapGIS中无效时,会在列表中显示。
- 图层定义查询语句解析失败:添加并显示某个矢量数据图层时,可在"属性"中设置显示过滤条件。若此条件在MapGIS中无效时,会在列表中显示。
提示:
1、"制图成果纠错"中罗列的结果并非实时检测。ArcGIS 制图成果转换时,将转换结果信息存储到MapGIS地图文档(*.mapx)中,"制图成果纠错"列表只是罗列了地图中信息。
2、对于动态注记,即使ArcGIS中并未开启"标注此图层的中的要素",MapGIS会继承不开启"标注此图层的中的要素"信息,并将设置的"标注类SQL条件语句"及"标注类字段"信息转换到MapGIS中,且罗列出未能正确转换的内容。
3、根据"制图成果纠错"列表内容调整配图信息时,建议直接通过列表中"修订值"进行修改,而不是在MapGIS的"工作空间"中修改。若需要在两个位置修改,建议每个位置修改后及时保存地图文档。
1. ArcGIS 制图成果转换后,打开"制图成果纠错"列表,列表中会罗列出 转换结果不一致情况:

- 【地图名称】:地图名称;
- 【图层名称】:图层名称,以"{组图层名}/{图层名}"形式展示;
- 【错误类型/错误描述】:错误类型及描述信息;
- 【原始值】:ArcGIS 中原始配置信息;
- 【转换值】:转换到MapGIS中对应的配置信息;
- 【修订值】:默认为空,用户可在此调整配置信息。
2. 用户可逐行检查错误信息,并对比调整信息。
(一)图层连接失败
导致图层连接失败有如下几种可能:
①对应的源数据MapGIS不支持。
如源数据是ArcGIS GDB中栅格数据,ArcGIS制图成果转换时采用"直接转为MapGIS数据",栅格数据不会转换到MapGIS GDB中。需要用户手动导入栅格数据。若图层名称及存储位置没有变化,无需再手动指定源数据,可直接在列表中手动标注为已处理。

②对应的源数据不存在。
这种原因ArcGIS地图(*.mxd)中也无法正确显示,需用户根据实际情况判断,是否手动设置关联其他图层。
③图层被重命名。
如ArcGIS制图成果转换时,采用"替换到已有数据库"方式,若数据库中无对应名称的图层,会显示"图层连接失败"。
如由于图层名重复等原因,需要用户手动设置图层URL信息。在列表中点击"修订值"后方的图标,即可弹出选择如下对话框,用户可重新指定源数据。

(二)标注类SQL条件语句解析失败
大多数情况下,ArcGIS的地图(*.mxd)中数据图层采用"定义要素类并为每个要素类添加不同标注"时,为每个类设置SQL条件MapGIS均可正常转换。若极端情况下无法转换时,用户需解析ArcGIS中SQL查询语意,再在MapGIS中设置对应语意的SQL查询语句。
在列表中点击"修订值"后方的图标,即可弹出选择如下对话框,用户可重新设置SQL查询语句。

MapGIS中SQL条件语句设置方法可参考"sql查询表达式"及"sql查询函数说明"章节。
(三)标注类字段使用复杂表达式
ArcGIS的地图(*.mxd)中数据图层在设置"标注字段"时,可选择一个属性字段或复杂的表达式。通过ArcGIS 制图成果转换到MapGIS中时,若检测转换结果无效,会显示在列表中。一般会有如下几种情况:
①使用了源数据中不存在的属性字段。
这种情况ArcGIS地图(*.mxd)中也无法正确显示该动态注记,需要用户根据实际情况判断,手动修改"标注字段"信息。
②ArcGIS中"标注字段"的表达式过于复杂。
用户需解析ArcGIS中标注字段的语意,再在MapGIS中重新设置动态注记信息。MapGIS中动态注记的设置可参考"常用动态注记标注方法"章节。
(四)图层定义查询语句解析失败
大多数情况下,ArcGIS的地图(*.mxd)中数据图层定义查询后,MapGIS均可正常转换。若极端情况下无法转换时,用户需解析ArcGIS中SQL查询语意,再在MapGIS中设置对应语意的SQL查询语句。
在列表中点击"修订值"后方的图标,即可弹出选择如下对话框,用户可重新设置SQL查询语句。

MapGIS中SQL条件语句设置方法可参考"sql查询表达式"及"sql查询函数说明"章节。
3. 在列表中更新"修订值"后,该行记录会自动显示为"已处理"。建议点击"更新工作空间文档",保存到当前地图文档中。此时查看地图文档效果,可检查更新内容是否正确。
常用动态注记
(1)分类注记
例如,字段"CLASID"记录了道路类别信息,希望按照道路类型,设置不同的标注信息。
设置动态注记时,可采用"定义要素类并为每个要素类添加不同标注"方式,创建不同类别的注记,再通过"SQL条件"为每个类别道路设置过滤信息。每个类别可独立设置动态注记的标注内容、样式、位置、冲突策略等信息。


(2)连接多个字段
①数值类字段增加单位后缀
例如,"双精度型"字段"n3"记录了GDP产值,希望动态标注 GDP数值并在后面增加单位"亿元",可通过如下方式:
String(n3) + '亿元'其中,通过"String"函数将"双精度型"字段转为字符串。

②连接多个属性字段
例如,"字符串"字段"str1"记录了行政区编码信息,"字符串"字段"str2"记录了省名信息,希望动态标注 行政区编码-省名,可通过如下方式实现:
str1 + '-' + str2
(3)提取部分内容标记
①提取字符前n位
例如,"字符串"字段"str1"记录了行政区编码信息,希望动态标注 行政区编码前四位,可通过如下方式实现:
Left(str1,4)
(4)字母大小写替换
①全部大写
例如,"字符串"字段"str4"记录了省名拼音信息,动态标注时所有字母大写,可通过如下方式实现:
Upper(str4)
②首字母大写
例如,"字符串"字段"str4"记录了省名拼音信息,动态标注时首字母大写,后面全部小写。可通过如下方式实现:
Upper(Left(str4,1))+Lower(Mid(str4,1,20))其中,利用Left(str4,1)提取首字母,Mid(str4,1,20)提取第1到20中间的字母,不包含1和20。此处考虑到名称不超过20,提取了从2开始的字母。

(5)字符串换行
①MapGIS换行功能
MapGIS在设置动态注记时,可进行"换行配置"设置,实现动态注记换行:

②利用Chr(10)换行
例如,"字符串"字段"str1"记录了行政区编码信息,"字符串"字段"str2"记录了省名信息。动态标注两行信息,第一行内容为" 行政区编码:* ",第二行为" 省名:* "。可通过如下方式实现:
'行政区编码: ' + str1 + Chr(10) + '省名: ' + str2
若希望两行内容居中对齐,可通过"符号"参数中"多行中间对齐"实现:

③特殊字符换行
MapGIS 动态注记的"符号"参数中可指定换行符。例如"字符串"字段"str6"记录了行政区编码-省名 信息,可通过如下方式实现"-"字符换行:

(6)分数标注
例如,"字符串"字段"str1"记录了行政区编码信息,"字符串"字段"str2"记录了省名信息。通过分数标注,分子为行政区编码,分母为省名。可通过如下三种方式实现分数注记:
①MapGIS 自带分式注记规则
MapGIS提供了自带的分式注记模式,当注记内容为 "/分子/分母/" 格式时,可显示分数标注。
可在"字段"中输入如下内容,实现分数注记:
'/'+ str1 + '/' + str2+ '/'
②通过换行符和多个"-"实现近似分数注记
str1 + Chr(10) + '------' + Chr(10) + str2
③矩阵注记实现
可创建如下矩阵的注记,其中上方文本为"str1"字段,下方文本为"str2"字段。

(7)上/下标
例如,"字符串"字段"str2"记录了省名信息,"双精度型"字段"n3"和"n4"记录了两个产业GDP产值信息。省名为正常注记,n3为上标,n4为下标,可通过如下几种方式实现上/下标注记:
①MapGIS 自带上/下标规则
MapGIS提供了自带的上/下标注记模式,如当注记内容为 "A#+B#=C#-D" 格式时,可显示上/下标注记 。
可在"字段"中输入如下内容,实现上/下标注记:
str2 + '#+'+ string(n3) + '#-' + string(n4)
②矩阵注记
可创建如下矩阵的注记,其中左侧正常文本为"str2"字段,右侧分为3行,第二行可以让上下标间有一定间距。第一行为上标n3,第三行为下标n4,中间行为分隔符,颜色为"无颜色"。可为每个字段设置独立符号化样式,让其显示更为美观。

(8)图片注记
①矩阵注记
例如,"字符串"类型字段"tp"中记录了图片路径及名称信息,通过"矩阵注记",直接选择"图像"类型及字段"tp",即可实现图片动态注记样式。

常用SQL查询表达式
MapGIS在进行SQL条件查询时,遵循了标准的计算机SQL查询语句。SQL查询语句变化丰富,下面以几种常用的SQL条件查询为例进行讲解。
①数值查询
对于数值类的属性字段查询可以使用"=","!=","<","<=",">",">="等查询语句。
例如,查询面积"mpArea"大于500的属性记录:
mpArea>500②模糊查询
模糊查询使用 like,通配符采用"%"。
例如,查询名称"name"为"北京大学"的属性记录,如下两种方式均可:
name='北京大学'
name LIKE '北京大学'查询名称name后缀为"大学"的属性记录:
name LIKE '%大学'查询名称name中任意位置包含为"大学"的属性记录:
name LIKE '%大学%'③查询字段值为空
查询是否为空值使用 IS NULL 或 IS NOT NULL。
例如,查询名称"name"为空的属性记录:
name IS NULL④构建函数进行查询
通过构建SQL数学表达式函数,查询符合条件的记录。
例如,查询"水稻"产量高于"小麦"产量2倍的属性记录:
水稻>小麦*2
⑤时间查询
对"日期型"、"时间型"、"邮戳型"属性字段进行查询。
例如,查询"统计日期"在2023-1-1到2024-1-1间的属性记录,包含2023-1-1但不包含2024-1-1:
统计日期>='2023-1-1' AND 统计日期<'2024-1-1'
SQL查询函数说明
SQL查询时通过构建SQL查询函数,查找满足指定条件的数据。MapGIS目前支持SQL查询函数包括运算符号、数学函数、字符串函数和时间函数四种类型。
(1)运算符号
运算符号是SQL查询条件的基础符号,包括常用的算术运算符、比较运算符和逻辑运算符。
类型 | 运算符 | 说明 |
|---|---|---|
| 算术运算符 | + | 加法 |
| - | 减法 | |
| * | 乘法 | |
| / | 除法 | |
| 比较运算符 | = | 等于 |
| > | 大于 | |
| < | 小于 | |
| >= | 大于等于 | |
| <= | 小于等于 | |
| != | 不等于 | |
| 逻辑运算符 | like | 使用通配符运算符将值与类似值进行比较 |
| and | 如果两个表达式都为真,则返回true | |
| or | 如果任一表达式为真,则返回true | |
| not | 反转其他布尔运算符的结果 | |
| Is Null | 运算符将列的值与null值进行比较,如果比较的值为null,则返回true; 否则,它返回false | |
| 其他运算符 | + | 字符串连接,如连接str1和str2两个字符串字段:str1 + str2 |
(2)数学函数
数学函数用来执行算术运算。
函数名 | 语法 | 说明 | 示例 |
|---|---|---|---|
| Abs | Abs(x) | 绝对值函数。 | 语法:Abs(-4.5) 返回值:4.5 |
| Exp | Exp(x) | 以自然对数 e 为幂的函数。 | 语法:Exp(2) 返回值:7.389056 |
| Floor | Floor(x) | 向下舍入函数,即获得距x最近的较小整数。 | 语法:Floor(1.89) 返回值:1 |
| Ceil | Ceil(x) | 向上舍入函数,即获得距x最近的较大整数。 | 语法:Ceil(1.89) 返回值:2 |
| Sin | Sin(x) | 正弦函数。 | 语法:Sin(2) 返回值:0.909297 |
| Cos | Cos(x) | 余弦函数。 | 语法:Cos(1) 返回值:0.540302 |
| Tan | Tan(x) | 正切函数。 | 语法:Tan(1) 返回值:Tan(30) |
| Cot | Cot(x) | 余切函数。 | 语法:Cot(30) 返回值:0.642093 |
| LN | LN(x) | 取自然对数。 | 语法:LN(9) 返回值:2.197225 |
| Power | Power(x,y) | x 的 y 次方。 | 语法:Power(2,3) 返回值:8 |
| Sqrt | Sqrt(x) | 对 x 开方。 | 语法:Sqrt(9) 返回值:3 |
提示:
MapGIS中正弦、余弦、正切、余切函数中x值单位为弧度。
(3)字符串函数
字符串函数用来对字符串或表达式进行操作。
函数名 | 语法 | 说明 | 示例 |
|---|---|---|---|
| ASCII | ASCII(input_string) | 返回字符表达式最左端字符的 ASCII 代码值,input_string可以是字符串,字符串表达式或属性列 | 语法:ASCII('ab') 返回值:97 |
| Chr | Chr(x) | 返回与所给ASCII数值参数等当的字符 | 语法:Chr(97) 返回值:a |
| Lower | Lower(input_string) | 将字符串中大写字母转换为小写字母 | 语法:Lower('XyAB') 返回值:xyab |
| Left | Left(input_string,length) | 从提供的字符串的左侧开始提取给定长度的字符 | 语法:Left('ABxy',3) 返回值:ABx |
| LTrim | LTrim(input_string) | 去除字符串中最左边的空格 | 语法:LTrim(' a bcd') 返回值:a bcd |
| Mid | Mid(input_string,startlength,length) | 从字符串中startlength位置开始提取length个字符,startlength起始为0 | 语法:Mid('abcdef',2,3) 返回值:cde |
| Right | Right(input_string,length) | 从提供的字符串的右侧开始提取给定长度的字符 | 语法:Right('ABxy',3) 返回值:Bxy |
| Rtrim | RTrim() | 去除字符串中最右边的空格 | 语法:RTrim('a bcd ') 返回值:a bcd |
| Space | Space(count) | 以空格构造字符串,count是一个正整数,表示空格的数量 | 语法:Space(2) 返回值:{2个空格} |
| String | String() | 将数值转为字符串 | 语法:String('3.141500') 返回值:3.141500 |
| Trim | Trim() | 去除字符串中两端的空格 | 语法:Trim(' abc def ') 返回值:abc def |
| Upper | Upper() | 将字符串中小写字母转换为大写字母 | 语法:Upper('aBcd') 返回值:ABCD |
(4)时间函数
日期函数用来处理日期和时间。
| 函数名 | 语法 | 说明 | 示例 |
|---|---|---|---|
| date | date() | 返回当前日期 | 语法:Date() 返回值:2024-2-29 |
| sysdate | sysdate() | 返回当前日期及时间 | 语法:sysdate() 返回值:2024-2-29 15:33:41 |
| dateadd | dateadd(datepart,number,date) | 在日期中添加或减去指定时间间隔 | 语法:dateadd(dd,-3,'2024-2-24') 返回值:2024-2-21 |
| datepart | datepart(datepart,date) | 返回指定日期时间的指定部分整数 | 语法:datepart(dd,'2024-2-12') 返回值:12 |
其中datepart参数说明如下表:
日期部分 | 缩写 | 说明 |
|---|---|---|
| year | yy,yyyy | 返回年份 |
| month | mm,m | 返回月份 |
| day | dd,d | 返回日 |
| hour | hh | 返回小时 |
| minute | mi,n | 返回分钟 |
| second | ss,s | 返回秒 |
| millisecond | ms | 返回毫秒数 |