问题的提出:
我有一幅由三个图层组成的地图,一幅为河流,一幅全国大市图,一幅为全国的县市图,现在有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语句,我就不多解释了,程序中已经解释了部分。 MapBasic代码
1 Include " MAPBASIC.DEF " 2 dim minx,miny,maxx,maxy as float 3 dim myobj as object 4 dim ii as integer 5 open table " G:\sh_tab\Admin_Ploy.TAB " as admin_ploy ' 面,方形范围取于此面 6 open table " G:\sh_tab\Land.TAB " as land ' 面 7 open table " G:\sh_tab\POI.TAB " as poi ' 点 8 open table " G:\sh_tab\Road_Line.TAB " as road ' 线 9 open table " G:\sh_tab\temp.TAB " as temp ' 临时面层,请预先建立,主要用于建立临时方形 10 map from temp,poi,road,land,admin_ploy 11 set map layer " temp " editable on 12 fetch first from admin_ploy 13 ii = 1 14 do while not eot(admin_ploy) 15 select * from admin_ploy where rowid = ii into tempa 16 minx = tableinfo(tempa,TAB_INFO_MINX) 17 miny = tableinfo(tempa,TAB_INFO_MINY) 18 maxx = tableinfo(tempa,TAB_INFO_MAXX) 19 maxy = tableinfo(tempa,TAB_INFO_MAXY) 20 create rect (minx,miny) (maxx,maxy) 21 ii = ii + 1 22 fetch next from admin_ploy 23 loop 24 set map layer " temp " editable off 25 26 fetch first from temp 27 ii = 1 28 do while not eot(temp) 29 myobj = temp.obj 30 ' 点的选择与输出,输出为MIF的,也可以直接保存TAB的 31 select * from poi where obj partly within myobj into tempa 32 export " tempa " into " G:\sh_tab\temp\poi " + ii + " .mif " type " MIF " 33 ' 线,对线进行分割后再保存,以保证方形外的不包括 34 set map layer " road " editable on 35 select * from road 36 set target on 37 select * from temp where rowid = ii 38 Objects Split Into Target data name = name,class = class,remark = remark 39 select * from road where obj within myobj into tempa 40 export " tempa " into " G:\sh_tab\temp\road " + ii + " .mif " type " MIF " 41 Rollback Table road 42 set map layer " road " editable off 43 ' 面 44 set map layer " land " editable on 45 select * from land 46 set target on 47 select * from temp where rowid = ii 48 Objects Split Into Target data name = name,class = class,remark = remark 49 select * from land where obj within myobj into tempa 50 export " tempa " into " G:\sh_tab\temp\land " + ii + " .mif " type " MIF " 51 Rollback Table land 52 set map layer " land " editable off 53 ii = ii + 1 54 fetch next from temp 55 loop 56 note " OK " 57 58 问题的延伸: 其他的许多分割问题也应该可以从这上面启发应用。比如把一个1:100W的图分成1:2.5W的大比例图也可以运用此方法。本来想用MAPINFO OLE+VB做的,没有太多时间,所以先做了个简单的BASIC程序,有空再补上吧。有点累了,所以上面一些写的比较简单了,如有不明白的地方可以提出来我再详细解释下。最后我也不知道我这样做是否算实现了功能呢? 欢迎大家讨论和指正,谢谢。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/binghuiliang/archive/2008/02/19/2107455.aspx
|
|