如何用mapbasic读取fnt文件中的信息,求大神提示
1个回答
推荐于2016-12-03
展开全部
用VC开发Mapinfo程序。
所用软件:Mapinfo,MapBasic,VC++6.0
先装Mapinfo,后装MapBasic.不装mapinfo,MapBasic不能运行。
Drew学习Mapinfo, MapBasic.的主要参考资料:
打开Mapinfo,打开一个.tab或.wor文件,有些例子文件在Mapinfo\data中。.tab文件是图层文件,不同的图层有不同的定义。一般一个图有几个图层组成。同时打开相关的几个图层,选择打开.wor文件就行了。.tab文件仅含有图层的结构信息,如姓名,年龄...。这些项行和列的数据在和它相同名称的其它四个文件里,如xxx.DAT,xxx.ID,xxx.MAP,xxx.IND。用\Window\New brower window可以看到表的结构和数据。
在options菜单中打开show Mapbasic window窗口,可以看到在mapinfo中操作所对应的mapbasic命令。如由MapInfo中打开china.tab文件,则相应的MapBasic命令显示在Mapbasic window里
Open Table "D:\aa\china.TAB" Interactive Map From plane
如果把上述命令copy到mapbasic window里,打回车,又重复了刚刚的菜单命令。
好了,再看一下MapBasic程序。打开MapBasic,File\New新建一个空白.MB文件,将上两行代码放进去,运行project\compile the current file,存储后,显示对话框 Compiled:xxx.MBX,No Eorrors:Compilation Successful. 编译成功。选择project\run,你会看到这个china.tab文件被打开,和刚才在MapInfo中用菜单打开的结果一摸一样。mapbasic不复杂吧:)
当然能用拿手的VC来编程就更好了。
下面来试试用VC++程序编程打开这个文件吧。
VC和Mapinfo的接口,可以参考文章:
下面是用VC编程打开文件的代码:
sprintf(str,"Set Next Document Parent %lu Style 1 ",(long)(UINT)m_hWnd);
mapinfo.Do(str);//创建地图窗口
mapinfo.Do("Open Table \"D:\\aa\\japan\\JPN1RAIL\" Map From JPN1RAIL");//打开地图
=======================================================================
MapInfo\MapBasic\Samples\MFC中的两个文件。提供了VC下编写mapinfo程序的例子findzip和mdimfc。不过看上去有些复杂。
要编程解决的问题是:
1,从Mapinfo读取节点或数据坐标信息。
2,基于这些信息,进行算法计算。
3,将算法计算结果在Mapinfo地图上显示出来。
如何从地图中读取坐标信息。可是查了图层文件,除了有些表示X,Y坐标外,没有类似线段长度,端点坐标的信息。
Object的概念。
Line Object简单,终点起点。polyline 和 Region复杂一些.其中polyline非常有用,因为它主要定义的是道路信息。
一般的polyline定义的信息有一个polyline Object有line segments和line
sections组成。属性有节点数,长度,节点坐标,segment数和section数。这些可以在MapInfo中用鼠标双击图中的Object查到。
和Object相关的Table表信息的查询,可选择main\Info按钮,用鼠标单击图中的Object查到和这个Object有关的table信息。查询Table表中的
所有信息用菜单\Windows\New Brower Window.
图形Object的这些信息和table表无关,只和物理图形有关,有图形不一定有table表,但一定有Object。table 是独立于图形以外的,用户可
以添加,删除等操作,不影响图。
1,从Mapinfo读取节点或数据坐标信息。可采用3种办法:
.mif/mid文件中读取。在mapinfo中选export file,把地图中的数据信息输出到mif/mid文件中。在程序中打开mif文件读取。可以得到如线段起始和终点坐标等等.
主要是C语言对文件操作。
从地图table表直接读取,读取表中的数据一般用FetcH。具体操作如下:
1. Use a Fetch statement to specify which row in the table you want to query.
This action sets which row is current.
2. Use a table-reference expression_r(e.g. tablename.columnname) to access a
specific column in the current row.
For example, the following program reads the contents of the Country column from
the first row of the World table:
Dim s_name As String
Open Table ”world” Interactive
Fetch First From world
s_name = world.Country
MapBasic例子程序:读表中FROMLEFT一项的数据
Include "MAPBASIC.DEF"
Dim s_name As Integer
Open Table "D:\aa\street\onhalts1"
Map From onhalts1
Dim i,counter As Integer
Fetch First From onhalts1
Do While Not EOT(onhalts1)
s_name = onhalts1.FROMLEFT
Print "The name: "+ s_name
i = i + 1
Fetch Next From onhalts1
Loop
Print "Number of undeleted records: " + i
读Object信息。
MapBasic程序:读出Object的节点坐标,长度,segment数。
Include "MAPBASIC.DEF"
Dim table_OBJ As String
table_OBJ = "JPN1RAIL.obj"
Dim geogr_length As Float,
x1,y1,x2,y2 As Float
Open Table "D:\aa\japan\JPN1RAIL"
Map From JPN1RAIL
Dim i,counter As Integer
i = 0
Fetch First From JPN1RAIL
Do While Not EOT(JPN1RAIL)
'counter = ObjectInfo(JPN1RAIL.obj, OBJ_INFO_NPNTS)
counter = ObjectInfo(JPN1RAIL.obj, OBJ_INFO_NPOLYGONS)
x1 = ObjectNodeX(JPN1R www.hbbz08.com AIL.obj, 1, 1) ' read longitude
x2 = ObjectNodeX(JPN1RAIL.obj, 1, ObjectInfo(JPN1RAIL.obj, 20)) ' read longitude
y1 = ObjectNodeY(JPN1RAIL.obj, 1, 1) ' read latitude
y2 = ObjectNodeY(JPN1RAIL.obj, 1, ObjectInfo(JPN1RAIL.obj, 20)) ' read latitude
geogr_length = ObjectLen(JPN1RAIL.obj, "km")
Print "The length: "+ geogr_length+"x1:"+ x1+"y1:"+y1
'Print "The length: "+ geogr_length+"Counter:"+ counter
i = i + 1
Fetch Next From JPN1RAIL
Loop
Print "Number of undeleted records: " + i
============================================================================================
float geogr_length;
int nPolygons,Segment,node_Num;
CString strCommand;
mapinfo.Do("Dim i As Integer");
sprintf(str,"Fetch First From %s",Table_name);
mapinfo.Do(str);
num=493;
for(int i=0;i<num;i++)
{
sprintf(str,"ObjectInfo(%s,20)",Table_obj);
node_Num = atoi (mapinfo.eval_r(str));//OBJ_INFO_NPNTS
sprintf(str,"ObjectInfo(%s,21)",Table_obj);
Segment = atoi (mapinfo.eval_r(str));//OBJ_INFO_NPOLYGONS
sprintf(str,"ObjectNodeX(%s,1,1)",Table_obj);
x1[i] = (float)atof(mapinfo.eval_r(str));
sprintf(str,"ObjectNodeY(%s,1,1)",Table_obj);
y1[i] = (float)atof(mapinfo.eval_r(str));
sprintf(str,"ObjectNodeX(%s,1,ObjectInfo(%s, 20))",Table_obj,Table_obj);
x2[i] = (float)atof(mapinfo.eval_r(str));
sprintf(str,"ObjectNodeY(%s,1,ObjectInfo(%s, 20))",Table_obj,Table_obj);
y2[i] = (float)atof(mapinfo.eval_r(str));
geogr_length = atof( mapinfo.eval_r("ObjectLen(JPN1RAIL.obj, \"km\") "));
sprintf(str,"Fetch Next From %s",Table_name);
mapinfo.Do(str);
}
mapinfo.Do("Print \"Number of undeleted records: \" + i ");
Fetch First From world
Note world.obj
counter = ObjectInfo(CHINAHWY.obj, OBJ_INFO_NPNTS)表示一个多边形有多少个点(segment+section)。
ObjectNodeX(xxx.obj, 1, counter)
一个polyline Object有line segments 和line sections组成。属性有节点数,长度,节点坐标,segment数和section数。
用函数counter = ObjectInfo(JPN1RAIL.obj, OBJ_INFO_NPOLYGONS)
ObjectNodeX(JPN1RAIL.obj, 1, 1) ' read x
ObjectNodeY(JPN1RAIL.obj, 1, 1) ' read y
ObjectLen(JPN1RAIL.obj, "km")
等求出。
所用软件:Mapinfo,MapBasic,VC++6.0
先装Mapinfo,后装MapBasic.不装mapinfo,MapBasic不能运行。
Drew学习Mapinfo, MapBasic.的主要参考资料:
打开Mapinfo,打开一个.tab或.wor文件,有些例子文件在Mapinfo\data中。.tab文件是图层文件,不同的图层有不同的定义。一般一个图有几个图层组成。同时打开相关的几个图层,选择打开.wor文件就行了。.tab文件仅含有图层的结构信息,如姓名,年龄...。这些项行和列的数据在和它相同名称的其它四个文件里,如xxx.DAT,xxx.ID,xxx.MAP,xxx.IND。用\Window\New brower window可以看到表的结构和数据。
在options菜单中打开show Mapbasic window窗口,可以看到在mapinfo中操作所对应的mapbasic命令。如由MapInfo中打开china.tab文件,则相应的MapBasic命令显示在Mapbasic window里
Open Table "D:\aa\china.TAB" Interactive Map From plane
如果把上述命令copy到mapbasic window里,打回车,又重复了刚刚的菜单命令。
好了,再看一下MapBasic程序。打开MapBasic,File\New新建一个空白.MB文件,将上两行代码放进去,运行project\compile the current file,存储后,显示对话框 Compiled:xxx.MBX,No Eorrors:Compilation Successful. 编译成功。选择project\run,你会看到这个china.tab文件被打开,和刚才在MapInfo中用菜单打开的结果一摸一样。mapbasic不复杂吧:)
当然能用拿手的VC来编程就更好了。
下面来试试用VC++程序编程打开这个文件吧。
VC和Mapinfo的接口,可以参考文章:
下面是用VC编程打开文件的代码:
sprintf(str,"Set Next Document Parent %lu Style 1 ",(long)(UINT)m_hWnd);
mapinfo.Do(str);//创建地图窗口
mapinfo.Do("Open Table \"D:\\aa\\japan\\JPN1RAIL\" Map From JPN1RAIL");//打开地图
=======================================================================
MapInfo\MapBasic\Samples\MFC中的两个文件。提供了VC下编写mapinfo程序的例子findzip和mdimfc。不过看上去有些复杂。
要编程解决的问题是:
1,从Mapinfo读取节点或数据坐标信息。
2,基于这些信息,进行算法计算。
3,将算法计算结果在Mapinfo地图上显示出来。
如何从地图中读取坐标信息。可是查了图层文件,除了有些表示X,Y坐标外,没有类似线段长度,端点坐标的信息。
Object的概念。
Line Object简单,终点起点。polyline 和 Region复杂一些.其中polyline非常有用,因为它主要定义的是道路信息。
一般的polyline定义的信息有一个polyline Object有line segments和line
sections组成。属性有节点数,长度,节点坐标,segment数和section数。这些可以在MapInfo中用鼠标双击图中的Object查到。
和Object相关的Table表信息的查询,可选择main\Info按钮,用鼠标单击图中的Object查到和这个Object有关的table信息。查询Table表中的
所有信息用菜单\Windows\New Brower Window.
图形Object的这些信息和table表无关,只和物理图形有关,有图形不一定有table表,但一定有Object。table 是独立于图形以外的,用户可
以添加,删除等操作,不影响图。
1,从Mapinfo读取节点或数据坐标信息。可采用3种办法:
.mif/mid文件中读取。在mapinfo中选export file,把地图中的数据信息输出到mif/mid文件中。在程序中打开mif文件读取。可以得到如线段起始和终点坐标等等.
主要是C语言对文件操作。
从地图table表直接读取,读取表中的数据一般用FetcH。具体操作如下:
1. Use a Fetch statement to specify which row in the table you want to query.
This action sets which row is current.
2. Use a table-reference expression_r(e.g. tablename.columnname) to access a
specific column in the current row.
For example, the following program reads the contents of the Country column from
the first row of the World table:
Dim s_name As String
Open Table ”world” Interactive
Fetch First From world
s_name = world.Country
MapBasic例子程序:读表中FROMLEFT一项的数据
Include "MAPBASIC.DEF"
Dim s_name As Integer
Open Table "D:\aa\street\onhalts1"
Map From onhalts1
Dim i,counter As Integer
Fetch First From onhalts1
Do While Not EOT(onhalts1)
s_name = onhalts1.FROMLEFT
Print "The name: "+ s_name
i = i + 1
Fetch Next From onhalts1
Loop
Print "Number of undeleted records: " + i
读Object信息。
MapBasic程序:读出Object的节点坐标,长度,segment数。
Include "MAPBASIC.DEF"
Dim table_OBJ As String
table_OBJ = "JPN1RAIL.obj"
Dim geogr_length As Float,
x1,y1,x2,y2 As Float
Open Table "D:\aa\japan\JPN1RAIL"
Map From JPN1RAIL
Dim i,counter As Integer
i = 0
Fetch First From JPN1RAIL
Do While Not EOT(JPN1RAIL)
'counter = ObjectInfo(JPN1RAIL.obj, OBJ_INFO_NPNTS)
counter = ObjectInfo(JPN1RAIL.obj, OBJ_INFO_NPOLYGONS)
x1 = ObjectNodeX(JPN1R www.hbbz08.com AIL.obj, 1, 1) ' read longitude
x2 = ObjectNodeX(JPN1RAIL.obj, 1, ObjectInfo(JPN1RAIL.obj, 20)) ' read longitude
y1 = ObjectNodeY(JPN1RAIL.obj, 1, 1) ' read latitude
y2 = ObjectNodeY(JPN1RAIL.obj, 1, ObjectInfo(JPN1RAIL.obj, 20)) ' read latitude
geogr_length = ObjectLen(JPN1RAIL.obj, "km")
Print "The length: "+ geogr_length+"x1:"+ x1+"y1:"+y1
'Print "The length: "+ geogr_length+"Counter:"+ counter
i = i + 1
Fetch Next From JPN1RAIL
Loop
Print "Number of undeleted records: " + i
============================================================================================
float geogr_length;
int nPolygons,Segment,node_Num;
CString strCommand;
mapinfo.Do("Dim i As Integer");
sprintf(str,"Fetch First From %s",Table_name);
mapinfo.Do(str);
num=493;
for(int i=0;i<num;i++)
{
sprintf(str,"ObjectInfo(%s,20)",Table_obj);
node_Num = atoi (mapinfo.eval_r(str));//OBJ_INFO_NPNTS
sprintf(str,"ObjectInfo(%s,21)",Table_obj);
Segment = atoi (mapinfo.eval_r(str));//OBJ_INFO_NPOLYGONS
sprintf(str,"ObjectNodeX(%s,1,1)",Table_obj);
x1[i] = (float)atof(mapinfo.eval_r(str));
sprintf(str,"ObjectNodeY(%s,1,1)",Table_obj);
y1[i] = (float)atof(mapinfo.eval_r(str));
sprintf(str,"ObjectNodeX(%s,1,ObjectInfo(%s, 20))",Table_obj,Table_obj);
x2[i] = (float)atof(mapinfo.eval_r(str));
sprintf(str,"ObjectNodeY(%s,1,ObjectInfo(%s, 20))",Table_obj,Table_obj);
y2[i] = (float)atof(mapinfo.eval_r(str));
geogr_length = atof( mapinfo.eval_r("ObjectLen(JPN1RAIL.obj, \"km\") "));
sprintf(str,"Fetch Next From %s",Table_name);
mapinfo.Do(str);
}
mapinfo.Do("Print \"Number of undeleted records: \" + i ");
Fetch First From world
Note world.obj
counter = ObjectInfo(CHINAHWY.obj, OBJ_INFO_NPNTS)表示一个多边形有多少个点(segment+section)。
ObjectNodeX(xxx.obj, 1, counter)
一个polyline Object有line segments 和line sections组成。属性有节点数,长度,节点坐标,segment数和section数。
用函数counter = ObjectInfo(JPN1RAIL.obj, OBJ_INFO_NPOLYGONS)
ObjectNodeX(JPN1RAIL.obj, 1, 1) ' read x
ObjectNodeY(JPN1RAIL.obj, 1, 1) ' read y
ObjectLen(JPN1RAIL.obj, "km")
等求出。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询