基于MapInfo公司软件的mif/mid 文件成图技巧

1 引言
在河口海岸工程的测量中常需据已知的经纬度坐标生成岸界或航迹图,用于导航或成图一种普遍的方法是用VC++VB VBA PowerBuilder 和Delphi 等自行编程还有一种方法是借助于GIS 软件平台如在ArcView中用Avenue 在 Mapinfo中用Mapbasic 等还有的混合使用这些方法能实现动态数据的接收与交换用户界面的二次开发特别是利用第三方厂家的专业控件如Mapobject MapX GeoMap等还能开发出更灵活的面向对象的独立平台但是在工作中通常只需要绘出点线面及文字标注即可Mapinfo 可以接受标准数据交换文件mif/mid 前者贮存图形数据后者存放属性数据两者都能用文本编辑工具进行编辑可用其它程序生成结合测量的信息可以方便地生成点线面状图形必要时可转成Shape 或dxf 等格式
2 mif/mid 的文件结构
2.1 mif 文件结构
mif 文件可以分为两大块第一块在文件头通常定义字符集投影与表结构
Version 300
定义字符集
Charset "WindowsSimpChinese"
定义字符分格符
Delimiter ","
有两个索引值
Index 2
投影选择
CoordSys Earth Projection 1, 0
表中含有两个字段
Columns 2
第一字段整型
ID Integer
第二字段字符型长度为7
No Char(7)
测绘信息网网友--测绘人提供第二块为数据区由数据点坐标和极简单的语法构成语法简要说明如下
2.1.1 点的创建
Point coor_x coor_y
定位
Symbol
(style_code,color,size,style_name,
effects, rotation_angle)
点的形状
其中coor_x 指点的经度coor_y 指点的纬度style 指符号样式color 指点的颜色 size 指点的大小三者均为整型style_code 是点符号MapInfo 的内部编码color 是RGB表示的颜色如为黑色为0 红色为16711680 size 为点数表示大小style_name 为字符串型表示调用的点符号库effects 为点的效果整型它是background drop shadow bold 三者之和background 中None 为0 Halo 为256 Border为16 drop shadow 为32 bold 为1 如一个点符号需表示成Border+dropshadow+bold 其effects 值为49 16+32+1rotation_angle 为旋转角以度为单位值为0-360 水平方向为0 度以左下角为原点按逆时针方向旋转如果省去style_name ,effects, rotation_angle 三项则采用MapInfo 的当前设置在MapInfo 中点对象的建立还有一个非常方便的方法用Table>create points 方法,它支持txt xls dbf 等格式
2.1.2 线的创建
直线
line coor_x1
coor_y1
coor_x2
coor_y2
pen(width,style,color)
折线
Pline n
coor_x1
coor_y1
coor_x2
coor_y2
coor_xn
coor_yn
pen(width,style,color)
其中coor_x1 coor_y1 coor_x2coor_y2 coor_xn coor_yn 表示坐标点pen()表示线的样式width 为线宽style 为线型整型color 为RGB 表示的颜色n为折线的点数Width有两种表示方法pixels和points Pixels 从细到粗分1-7 个档次在pen()中直接用1-7 的数即可points 中的值可自行输入如用points 表示的线粗为2.5的线在pen()中的width 为35 换算公式width=(points+1) 10 Style 为MapInfo 中的线型从左到右从上到下按0 1 2取值
当表示合并时格式稍有变动情况
如下
Pline Multiple n
由n 根折线合成一个对象
n1
第一根折线由n1 个点依次连成
coor_x1 coor_y1
coor_x2 coor_y2
coor_xn1 coor_yn1
n2
第二根折线由n2 个点依次连成
coor_x1 coor_y1
coor_x2 coor_y2
coor_xn2 coor_yn2
进入数据区
Data
该折线由9 条折线合并而成
Pline Multiple 9
第一条折线由31 个点依次相连而成
31
各点的坐标
121.500657 31.407574
121.498987 31.405751
121.499969 31.405521
121.501619 31.404571
… …
nn
第n 根折线由nn 个点依次连成
coor_x1 coor_y1
coor_x2 coor_y2
coor_xnn coor_ynn
pen(width,style,color)
2.1.3 面的创建
MapInfo 中有几种面状事物最常用的
是polygon 它的句法为
Region 1
表示一个面域
n
这个面域由n 个点依次相连而成
coor_x1 coor_y1
coor_x2 coor_y2
coor_xn-1 coor_yn-1
coor_x1 coor_y1
‘同第一个点表示封闭
pen(width, style, color)
边界线的样式
Brush (style, color, background)
填充的样式
Center coor_x coor_y
面域的中心点
其中Brush (style, color, background)中的style 表填充样式内部编码整型是MapInfo 中填充样式从左到右从上到下的排序color 为RGB 表示的颜色background表示有无背景其值为16777215 无背景时省去此项如表示由若干个区域组成一个大区域格式类似于线对象的合并把region 1 改成region m m 指合并区域的个数其它地方做少许改动即可
2.1.4 文本的创建
Text
String_text
标注的字符串
coor_x1 coor_y1
coor_x2 coor_y2
字符串的左下角右上角坐标
Font ("Font_style",
effects,
color,
background_color)
字符串样式
Angle degree
转角
Justify Right
对齐方式
Spacing width
行距
Label Line_style
coor_x coor_y
标注线与标注点
文本的创建比较繁琐对于少量的文本输入最好在转成Tab 文件后在 地图窗口中操作如果是大量的标注如采样点等可以与点建立拓朴关系也可通过地理编码的方式实现
2.2 mid 文件结构
mid 文件存贮的是地图中每个obj 的属性数据这个文件是可选的如没有这个文件或是个空文件则属性表中所有字段的记录都是空白的mid 的文件结构按字段从左到右排列每一行即为一个记录分隔方式以mif 文件中delimiter 语句定义的符分隔如在一个mif 文件中声明了创建两个字段
Columns 2
ID Char(4)
ID 为4 位字符型
No Integer
No 为整型
对应的mid 文件可创建如下格式
"a",1
"b",2
"e",23
"f",8
如有必要最好在创建一个图形对象时同时创建它的属性
3 应用实例
本例的岸界坐标数据是文本文件即下面程序中用到的data.txt 文件的输入格式为三列点编号纬度度分格式经度度分格式每线段之间以-1 分开用VB编程生成mif/mid 文件如果是ASCII 格式也可用其它语言实现由于一个mif 文件对应一个图层为了便于修改最好不同属性的对象生成不同的mif 文件创建折线的主要语句如下
Option Explicit
Sub main()
Dim x(1 To 30000), y(1 To 30000) As
Double
Dim no(0 To 1000) As Integer
' every line's points
'Dim mysheet As Worksheet
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim m As Integer
Dim npoints As Integer
Dim nline As Integer
Dim nrow As Integer
Dim tempx As Double
Dim tempy As Double
Dim Ncode As Long
Dim Lname As String
Open "c:\data.txt" For Input As #3
i = 1
k = 1
m = 0
npoints = 0
Do While Not EOF(3)
Input #3, Ncode
If Ncode <> -1 Then
If m = 0 Then m = 1
Input #3, tempy, tempx
x(npoints + k) = Left(tempx, 3) +
(tempx - Left(tempx, 3)
* 100) / 60
y(npoints + k) = Left(tempy,2) + (tempy
- Left(tempy, 2) * 100) / 60
no(m) = k
k = k + 1
Else
Line Input #3, Lname
npoints = npoints + no(m)
k = 1
m = m + 1
End If
i = i + 1
Loop
Close #3
i = 1
Do While no(i) <> 0
nline = nline + 1
i = i + 1
Loop
Open "c:\demo.mif" For Output As #1
Open "c:\demo.mid" For Output As #2
Print #1, "Version 300"
Print #1,"Charset"
"WindowsSimpChinese"""
Print #1, "Delimiter "","""
Print #1, "Index 1"
Print #1, "CoordSys Earth
Projection 1, 0"
Print #1, "Columns 1"
Print #1, "Line Char(10)"
Print #1, "Data"
Dim ntemp As Integer
ntemp = 0
For i = 1 To nline
'nline 为折线的条数
Print #1, "pline", no(i)
For j = 1 To no(i)
'no(i)为第i 条直线的坐标点数
Print #1, x(j + ntemp),
y(j + ntemp)
Next j
ntemp = ntemp + no(i)
Print #1, "Pen(1,2,0)"
'细黑实线
Next i
Close #1
Close #2
'创建一个空的mid 文件
End Sub
图1 由.mif 文件在MapInfo 中生成的图创建点面文本的语句类似生成各种mif 文件以后即可调入MapInfo 中以上程序在Pwindows Professional 2002,Visual basic6.0 MapInfo5.0 下已经运行通过生成的图如左图图1
4 小结
用生成mif/mid 文件的方法借助MapInfo 平台可以很方便地生成矢量图它避开了繁琐的专用语言语法结构对于没有MapBasic 软件的用户而言更是一大方便

你可能感兴趣的:(数据结构,编程,vb,VBA,PowerBuilder)