問題的提出:
我有一幅由三個圖層組成的地圖,一幅為河流,一幅全國大市圖,一幅為全國的縣市圖,現(xiàn)在有MAPINFO以其中的佛山為中心,分割出一個正方形的地圖。這么分割啊,不能是編程的,希望能寫出具體步驟。 問題的追問: 一:分割一個正方形地圖?一個還是很多個同樣大小的正方形。而且正方形的大小是多少? 二:所說的區(qū)域是以什么參考區(qū)域來分割?是上面說的正方形還是各個省市這樣的區(qū)域? 三:分割后是獨(dú)立成各個TAB文件還是什么?如何命名? 問題的補(bǔ)充: 一個正方形就形了;還有因?yàn)槟芡ㄟ^MAPINFO的放大與縮小,所以很難說他的大小,不過只要求這個正方形能覆蓋佛山這個城市就行了;還有作晚說錯了,不是全國地圖,而是兩廣地圖啊。兩廣的河流地圖,市地圖,縣市圖;置于區(qū)域:如果是在市地圖的話,包含佛山大市整個對象,佛山大市的周圍城市對象,就只能包含其一小部分了。同理如果是在縣市圖,佛山大市有四個區(qū),正方形內(nèi)要包含這四區(qū);這四區(qū)的周圍縣市就只能包含其一小部分了;在河流地圖的話,就不要這么嚴(yán)格了,不用分成正方形了;是分別保存的,所以可以分別來分割,不用一起分割了。 個人覺得: 覺得一,因?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ū)劃這樣的面層,這樣所用方形的大小比較容易確定,不然是點(diǎn)或線或者在字段中有界線區(qū)分的話要求自行判定方形大小,即要看區(qū)域內(nèi)對象的minx,miny,maxx和maxy來確定這個方形) 覺得四,超出方形范圍內(nèi)的線和面需要打斷或裁減。 覺得五,所說的正方形應(yīng)該是矩形。(個人猜測和認(rèn)為,因?yàn)槿绻貓D投影是經(jīng)緯度投影的話就不大可能是正方形) 個人解決思路:
以一個大市來舉例說明,把佛山市分割成四個區(qū),即上面所說的大市下的小市,共需要分成四個方形。(我沒有對方數(shù)據(jù)故以上海市樣圖數(shù)據(jù)做演示說明,把上海市下的各個區(qū)分割開,每個區(qū)一個獨(dú)立的方形) 在一個空層上繪制出方形,方形正好覆蓋這個區(qū)。將被方形包住的點(diǎn)選出,線和面選出后露在方形外面的部分切割掉,把這些選中的點(diǎn)線面提取出來,分割就完成了。(說起來還想很簡單的,也就那么兩句話,實(shí)現(xiàn)不一定容易,發(fā)現(xiàn)論壇上許多人都提問分割問題,我想應(yīng)該和這個問題類似吧) 具體解決步驟:
其實(shí)我是先做了BASIC程序完成這個問題的,但為了明了起見,我還是先講用MAPINFO中如何操作實(shí)現(xiàn),然后引入BASIC程序這樣程序便比較容易理解了。 第一步:畫框。根據(jù)行政區(qū)域來畫,如果沒有這樣的區(qū)域,請根據(jù)我上面所說的先找到minx,miny,maxx和maxy,根據(jù)最大坐標(biāo)和最小坐標(biāo)來畫。 第二步:點(diǎn)的解決。把上面的框?qū)幼鳛榈?,點(diǎn)層設(shè)為可編輯,運(yùn)用面板上的邊界選擇工具點(diǎn)下方形區(qū)則所有在框內(nèi)的點(diǎn)被全部選中了。把選中的Selection表另存副本就可以了。 第三步:線的解決。同樣把方形框?qū)幼鳛榈祝x中線層所有對象(也可以是一個框下的部分)并把線層設(shè)為可編輯,菜單欄工具設(shè)置為對象,再選中一個方形框,然后菜單欄工具擦除外部(也可以分解,在下面的程序中運(yùn)用的就是分解的方法)。需要注意擦除后要保存值,不然你的表就為空了。然后選中剛才方形框下的線對象另存就可以了。(也用邊界選擇工具選擇,當(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 ' 點(diǎn) 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 ' 點(diǎn)的選擇與輸出,輸出為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 ' 線,對線進(jìn)行分割后再保存,以保證方形外的不包括 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的大比例圖也可以運(yùn)用此方法。本來想用MAPINFO OLE+VB做的,沒有太多時間,所以先做了個簡單的BASIC程序,有空再補(bǔ)上吧。有點(diǎn)累了,所以上面一些寫的比較簡單了,如有不明白的地方可以提出來我再詳細(xì)解釋下。最后我也不知道我這樣做是否算實(shí)現(xiàn)了功能呢? 歡迎大家討論和指正,謝謝。
本文來自CSDN博客,轉(zhuǎn)載請標(biāo)明出處:http://blog.csdn.net/binghuiliang/archive/2008/02/19/2107455.aspx
|
|