MapInfo中按区域分割地图的方法(带MapBasic方法)

问题的提出:
我有一幅由三个图层组成的地图,一幅为河流,一幅全国大市图,一幅为全国的县市图,现在有MAPINFO以其中的佛山为中心,分割出一个正方形的地图。这么分割啊,不能是编程的,希望能写出具体步骤。
问题的追问:
一:分割一个正方形地图?一个还是很多个同样大小的正方形。而且正方形的大小是多少?
二:所说的区域是以什么参考区域来分割?是上面说的正方形还是各个省市这样的区域?
三:分割后是独立成各个TAB文件还是什么?如何命名?
问题的补充:
一个正方形就形了;还有因为能通过MAPINFO的放大与缩小,所以很难说他的大小,不过只要求这个正方形能覆盖佛山这个城市就行了;还有作晚说错了,不是全国地图,而是两广地图啊。两广的河流地图,市地图,县市图;置于区域:如果是在市地图的话,包含佛山大市整个对象,佛山大市的周围城市对象,就只能包含其一小部分了。同理如果是在县市图,佛山大市有四个区,正方形内要包含这四区;这四区的周围县市就只能包含其一小部分了;在河流地图的话,就不要这么严格了,不用分成正方形了;是分别保存的,所以可以分别来分割,不用一起分割了。
个人觉得:
觉得一,因为能通过MAPINFO的放大与缩小,所以很难说他的大小(我所说的大小不是相对大小,而是绝对大小,即在地图上是多少米长宽的方形,这个大小是无法改变的);
觉得二,如果是在市地图的话,包含佛山大市整个对象,佛山大市的周围城市对象,就只能包含其一小部分了(觉得没有错误),同理如果是在县市图,佛山大市有四个区,正方形内要包含这四区(觉得有错误,应该是每个方形包括一个区,共四个区那么有四个方形。PS:经过百度搜索在南方网发现佛山下面共有六个区,即城区、石湾区、顺德区、南海区、三水区、高明区[http://www.southcn.com/news/gdnews/informations/bianmzl/200201100675.htm],不知道什么时候变成四个区了,可能市最新的划分吧。不过查询了国家行政编码标准代码,发现有三区四县,即市辖区440601、城区440602、石湾区440603、顺德市440681、南海市440682、三水市440683、高明市440684)
觉得三,只要求这个正方形能覆盖佛山这个城市就行(那么,这个区域的界线应该比较清楚,最好有一个行政区划这样的面层,这样所用方形的大小比较容易确定,不然是点或线或者在字段中有界线区分的话要求自行判定方形大小,即要看区域内对象的minx,miny,maxx和maxy来确定这个方形)
觉得四,超出方形范围内的线和面需要打断或裁减。
觉得五,所说的正方形应该是矩形。(个人猜测和认为,因为如果地图投影是经纬度投影的话就不大可能是正方形)

个人解决思路:
以一个大市来举例说明,把佛山市分割成四个区,即上面所说的大市下的小市,共需要分成四个方形。(我没有对方数据故以上海市样图数据做演示说明,把上海市下的各个区分割开,每个区一个独立的方形)
在一个空层上绘制出方形,方形正好覆盖这个区。将被方形包住的点选出,线和面选出后露在方形外面的部分切割掉,把这些选中的点线面提取出来,分割就完成了。(说起来还想很简单的,也就那么两句话,实现不一定容易,发现论坛上许多人都提问分割问题,我想应该和这个问题类似吧)

具体解决步骤:
其实我是先做了BASIC程序完成这个问题的,但为了明了起见,我还是先讲用MAPINFO中如何操作实现,然后引入BASIC程序这样程序便比较容易理解了。
第一步:画框。根据行政区域来画,如果没有这样的区域,请根据我上面所说的先找到minx,miny,maxx和maxy,根据最大坐标和最小坐标来画。
第二步:点的解决。把上面的框层作为底,点层设为可编辑,运用面板上的边界选择工具点下方形区则所有在框内的点被全部选中了。把选中的Selection表另存副本就可以了。
第三步:线的解决。同样把方形框层作为底,选中线层所有对象(也可以是一个框下的部分)并把线层设为可编辑,菜单栏工具设置为对象,再选中一个方形框,然后菜单栏工具擦除外部(也可以分解,在下面的程序中运用的就是分解的方法)。需要注意擦除后要保存值,不然你的表就为空了。然后选中刚才方形框下的线对象另存就可以了。(也用边界选择工具选择,当然为了下一个方形的数据没有改变请不要保存,只将你需要的选中另存就可以了)
第四步:面的解决。同上。
程序方法:
程序中均为些比较简单的MAPBASIC语句,我就不多解释了,程序中已经解释了部分。

ContractedBlock.gif ExpandedBlockStart.gif MapBasic代码
 1None.gifInclude "MAPBASIC.DEF"
 2None.gifdim minx,miny,maxx,maxy as float
 3None.gifdim myobj as object
 4None.gifdim ii as integer
 5None.gifopen table "G:\sh_tab\Admin_Ploy.TAB" as admin_ploy '面,方形范围取于此面
 6None.gifopen table "G:\sh_tab\Land.TAB" as land '
 7None.gifopen table "G:\sh_tab\POI.TAB" as poi '
 8None.gifopen table "G:\sh_tab\Road_Line.TAB" as road '线
 9None.gifopen table "G:\sh_tab\temp.TAB" as temp '临时面层,请预先建立,主要用于建立临时方形
10None.gifmap from temp,poi,road,land,admin_ploy
11None.gifset map layer "temp" editable on
12None.giffetch first from admin_ploy
13None.gifii=1
14None.gifdo while not eot(admin_ploy)
15None.gif select * from admin_ploy where rowid=ii into tempa
16None.gif minx=tableinfo(tempa,TAB_INFO_MINX)
17None.gif miny=tableinfo(tempa,TAB_INFO_MINY)
18None.gif maxx=tableinfo(tempa,TAB_INFO_MAXX)
19None.gif maxy=tableinfo(tempa,TAB_INFO_MAXY)
20None.gif create rect (minx,miny) (maxx,maxy)
21None.gif ii=ii+1
22None.gif fetch next from admin_ploy
23None.gifloop
24None.gifset map layer "temp" editable off
25None.gif
26None.giffetch first from temp
27None.gifii=1
28None.gifdo while not eot(temp)
29None.gif myobj=temp.obj
30None.gif '点的选择与输出,输出为MIF的,也可以直接保存TAB的
31None.gif select * from poi where obj partly within myobj into tempa
32None.gif export "tempa" into "G:\sh_tab\temp\poi"+ii+".mif" type "MIF"
33None.gif '线,对线进行分割后再保存,以保证方形外的不包括
34None.gif set map layer "road" editable on
35None.gif select * from road
36None.gif set target on
37None.gif select * from temp where rowid=ii
38None.gif Objects Split Into Target data name=name,class=class,remark=remark
39None.gif select * from road where obj within myobj into tempa
40None.gif export "tempa" into "G:\sh_tab\temp\road"+ii+".mif" type "MIF"
41None.gif Rollback Table road
42None.gif set map layer "road" editable off
43None.gif '
44None.gif set map layer "land" editable on
45None.gif select * from land
46None.gif set target on
47None.gif select * from temp where rowid=ii
48None.gif Objects Split  Into Target data name=name,class=class,remark=remark
49None.gif select * from land where obj within myobj into tempa
50None.gif export "tempa" into "G:\sh_tab\temp\land"+ii+".mif" type "MIF"
51None.gif Rollback Table land
52None.gif set map layer "land" editable off
53None.gif ii=ii+1
54None.gif fetch next from temp
55None.gifloop
56None.gifnote "OK"
57None.gif
58None.gif

问题的延伸:其他的许多分割问题也应该可以从这上面启发应用。比如把一个1:100W的图分成1:2.5W的大比例图也可以运用此方法。本来想用MAPINFO OLE+VB做的,没有太多时间,所以先做了个简单的BASIC程序,有空再补上吧。有点累了,所以上面一些写的比较简单了,如有不明白的地方可以提出来我再详细解释下。最后我也不知道我这样做是否算实现了功能呢?

欢迎大家讨论和指正,谢谢。
mifg1.png
mifg2.png
mifg3.png
mifg4.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值