問題的提出:
我有一幅由三個圖層組成的地圖,一幅為河流,一幅全國大市圖,一幅為全國的縣市圖,現(xiàn)在有MAPINFO以其中的佛山為中心,分割出一個正方形的地圖。這么分割啊,不能是編程的,希望能寫出具體步驟。
問題的追問:
一:分割一個正方形地圖?一個還是很多個同樣大小的正方形。而且正方形的大小是多少?
二:所說的區(qū)域是以什么參考區(qū)域來分割?是上面說的正方形還是各個省市這樣的區(qū)域?
三:分割后是獨立成各個TAB文件還是什么?如何命名?
問題的補充:
一個正方形就形了;還有因為能通過MAPINFO的放大與縮小,所以很難說他的大小,不過只要求這個正方形能覆蓋佛山這個城市就行了;還有作晚說錯了,不是全國地圖,而是兩廣地圖啊。兩廣的河流地圖,市地圖,縣市圖;置于區(qū)域:如果是在市地圖的話,包含佛山大市整個對象,佛山大市的周圍城市對象,就只能包含其一小部分了。同理如果是在縣市圖,佛山大市有四個區(qū),正方形內(nèi)要包含這四區(qū);這四區(qū)的周圍縣市就只能包含其一小部分了;在河流地圖的話,就不要這么嚴(yán)格了,不用分成正方形了;是分別保存的,所以可以分別來分割,不用一起分割了。
個人覺得:
覺得一,因為能通過MAPINFO的放大與縮小,所以很難說他的大?。ㄎ宜f的大小不是相對大小,而是絕對大小,即在地圖上是多少米長寬的方形,這個大小是無法改變的);
覺得二,如果是在市地圖的話,包含佛山大市整個對象,佛山大市的周圍城市對象,就只能包含其一小部分了(覺得沒有錯誤),同理如果是在縣市圖,佛山大市有四個區(qū),正方形內(nèi)要包含這四區(qū)(覺得有錯誤,應(yīng)該是每個方形包括一個區(qū),共四個區(qū)那么有四個方形。PS:經(jīng)過百度搜索在南方網(wǎng)發(fā)現(xiàn)佛山下面共有六個區(qū),即城區(qū)、石灣區(qū)、順德區(qū)、南海區(qū)、三水區(qū)、高明區(qū)[http://www.southcn.com/news/gdnews/informations/bianmzl/200201100675.htm ],不知道什么時候變成四個區(qū)了,可能市最新的劃分吧。不過查詢了國家行政編碼標(biāo)準(zhǔn)代碼,發(fā)現(xiàn)有三區(qū)四縣,即市轄區(qū)440601、城區(qū)440602、石灣區(qū)440603、順德市440681、南海市440682、三水市440683、高明市440684)
覺得三,只要求這個正方形能覆蓋佛山這個城市就行(那么,這個區(qū)域的界線應(yīng)該比較清楚,最好有一個行政區(qū)劃這樣的面層,這樣所用方形的大小比較容易確定,不然是點或線或者在字段中有界線區(qū)分的話要求自行判定方形大小,即要看區(qū)域內(nèi)對象的minx,miny,maxx和maxy來確定這個方形)
覺得四,超出方形范圍內(nèi)的線和面需要打斷或裁減。
覺得五,所說的正方形應(yīng)該是矩形。(個人猜測和認為,因為如果地圖投影是經(jīng)緯度投影的話就不大可能是正方形)
個人解決思路:
以一個大市來舉例說明,把佛山市分割成四個區(qū),即上面所說的大市下的小市,共需要分成四個方形。(我沒有對方數(shù)據(jù)故以上海市樣圖數(shù)據(jù)做演示說明,把上海市下的各個區(qū)分割開,每個區(qū)一個獨立的方形)
在一個空層上繪制出方形,方形正好覆蓋這個區(qū)。將被方形包住的點選出,線和面選出后露在方形外面的部分切割掉,把這些選中的點線面提取出來,分割就完成了。(說起來還想很簡單的,也就那么兩句話,實現(xiàn)不一定容易,發(fā)現(xiàn)論壇上許多人都提問分割問題,我想應(yīng)該和這個問題類似吧)
具體解決步驟:
其實我是先做了BASIC程序完成這個問題的,但為了明了起見,我還是先講用MAPINFO中如何操作實現(xiàn),然后引入BASIC程序這樣程序便比較容易理解了。
第一步:畫框。根據(jù)行政區(qū)域來畫,如果沒有這樣的區(qū)域,請根據(jù)我上面所說的先找到minx,miny,maxx和maxy,根據(jù)最大坐標(biāo)和最小坐標(biāo)來畫。
第二步:點的解決。把上面的框?qū)幼鳛榈?,點層設(shè)為可編輯,運用面板上的邊界選擇工具點下方形區(qū)則所有在框內(nèi)的點被全部選中了。把選中的Selection表另存副本就可以了。
第三步:線的解決。同樣把方形框?qū)幼鳛榈?,選中線層所有對象(也可以是一個框下的部分)并把線層設(shè)為可編輯,菜單欄工具設(shè)置為對象,再選中一個方形框,然后菜單欄工具擦除外部(也可以分解,在下面的程序中運用的就是分解的方法)。需要注意擦除后要保存值,不然你的表就為空了。然后選中剛才方形框下的線對象另存就可以了。(也用邊界選擇工具選擇,當(dāng)然為了下一個方形的數(shù)據(jù)沒有改變請不要保存,只將你需要的選中另存就可以了)
第四步:面的解決。同上。
程序方法:
程序中均為些比較簡單的MAPBASIC語句,我就不多解釋了,程序中已經(jīng)解釋了部分。
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 ' 臨時面層,請預(yù)先建立,主要用于建立臨時方形
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
問題的延伸: 其他的許多分割問題也應(yīng)該可以從這上面啟發(fā)應(yīng)用。比如把一個1:100W的圖分成1:2.5W的大比例圖也可以運用此方法。本來想用MAPINFO OLE+VB做的,沒有太多時間,所以先做了個簡單的BASIC程序,有空再補上吧。有點累了,所以上面一些寫的比較簡單了,如有不明白的地方可以提出來我再詳細解釋下。最后我也不知道我這樣做是否算實現(xiàn)了功能呢?
歡迎大家討論和指正,謝謝。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。