Visual FoxPro қолданбалары мен GIS MapInfo Professional қосымшаларының тереңірек интеграциясы.

Новости мира

Мақалада MapInfo Professional ортасында Visual FoxPro қолданбасы мен кеңістіктік деректердің өзара әрекеттесу механизмінің ерекшеліктері қарастырылады.

«MapInfo Professional көмегімен Visual FoxPro-де ГАЖ құру» мақаласын жариялағаннан кейін маған Visual FoxPro қолданбаларының MapInfo Professional GIS-пен тығыз интеграциялану мүмкіндігі және MapInfo Professional COM моделін жүзеге асырудың соған байланысты мүмкіндіктері туралы сұрақтарға жиі жауап беруге тура келді. Сондықтан, ең алдымен сұрақтарына кеш, тым қысқа жауап берген немесе мүлдем жауап бермеген әріптестерімнен кешірім сұраймын.

Негізінде MapInfo Professional ортасы ішкі MapInfo форматында да, сыртқы деректер қорларында да геокеңістіктік деректердің семантикалық деректермен байланысын ұйымдастыруға қажеттінің барлығын қамтитынына қарамастан, іс жүзінде MapInfo-ның тиімді жұмыс орнын құру мүмкіндіктері белгілі болды. әрқашан жеткіліксіз. Және VFP деректерінің керемет өнімділігін ескере отырып, әзірлеу үшін Visual FoxPro пайдалану шешімі ең жақсы таңдау болар еді!

Географиялық құрамдас бөлігі бар ақпараттық жүйені әзірлеу кезінде әдетте бірінші талап етілетін нәрсе — «ҚАЙДА» көрсету. Яғни, [Москва, Красная площадь, д.1] — Бұл қай жерде? Бұл жағдайда, біріншіден, терезенің көрінетін бөлігін карта терезесінде жылжыту керек, сонда объект [Москва, Красная площадь, д.1] карта терезесінің көрсету аймағында болды. Екіншіден, дисплей масштабы карта терезесінде объект ерекшеленетіндей етіп таңдалуы керек, қажетті объектінің ортасын құрайтын көршілес объектілердің жеткілікті саны көрінуі керек.

Екіншіден, картада объектіні таңдағанда, картада таңдалған объектіге қатысты мәліметтер базасынан ақпарат беру қажет.

Екінші талапты тек MapInfo Professional бағдарламасымен орындауға болмайтынын атап өткен жөн. Сізге MapBasic бағдарламалау ортасы қажет, мұнда жүйе оқиғасын қайта анықтауды шақыру процедурасын жазу және құрастыру қажет. [SelChangedHandler]осы сияқты:

Sub SelChangedHandler деп жариялаңыз

SelChangedHandler() шақырыңыз

Sub SelChangedHandler
Егер SelectionInfo(3) > 0 болса
Іске қосу мәзірінің пәрмен идентификаторы 1001
Аяқтау болса
Аяқтау қосалқы

Міне, MapInfo Professional ортасында іске қосуға дайын бағдарлама қазірдің өзінде құрастырылған: [hook_selection.mbx]. Бұл процедурада оқиға өрт шыққан сайын [SelChangedHandler] идентификаторы бар батырмаға берілген команда орындалады [1001].

Маңызды! MapInfo Professional MapInfo Professional нұсқасынан жоғары MapBasic нұсқасымен құрастырылған бағдарламаларды іске қоса алмайды. Файл [hook_selection.mbx] MapBasic 9.5 ортасында жасалған, оны www.mapinfo.com: www.mapinfo.com сайтынан жүктеп алуға болады.

Енді бізді қызықтыратын мүмкіндіктерді жүзеге асыратын Visual FoxPro класс кодын қарастырайық.

*!*
*!* VFP қолданбасы мен MapInfo картасын байланыстыру
*!*
*!*
*!* VFP қолданбасы мен MapInfo картасын байланыстыру
*!*
*!* қолдану мысалы:

*!* Қоғамдық форма пішім ретінде
*!* m.oForm=Нысан жасау([demo_form],[C:callback_mapmap01.tab])
*!* m.oForm.Show()
*!*
Кластың демо_формасын пішін ретінде анықтаңыз
Жоғарғы=0
Сол жақ=0
Биіктігі=200
Ені=450
ShowWindow=2
DoCreate=.T.
BorderStyle=2
Жазба =[DEMO: callback and managment by map from MapInfo]
MaxButton=.F.
MinButton=.F.
Аты=[Form1]
cMap=[]
Enabled_ChangedHandler=[ON]

Нысан тізімін1 тізім терезесі ретінде қосу арқылы;
Биіктігі=150,;
Сол жақ=1,;
Жоғарғы=1,;
Ені=450,;
Аты=[List1]

Объектіні қосу пәрмені1 Командалық түйме ретінде;
Жоғарғы=171,;
Сол жақ=360,;
Биіктігі=25,;
Ені=85,;
Жазба =[Закрыть],;
Аты=[Command1]

Процедура Init(cMap ретінде таңба) VOID ретінде
This.cMap=m.cMap
Қоғамдық поми Объект ретінде
Тырысу
m.poMI=Getobject(,[MapInfo.Application])
Ұстаңыз
m.poMI=Нысан жасау([MapInfo.Application])
Аяқтау
Егер түрі([m.poMI.Name])#[C]
Хабарлама([Ошибка при попытке обратиться к «MapInfo.Application»],;
16+4096,[Внимание],15000)
Қайтару .F.
Эндиф
m.poMI.Visible=.T.
m.poMI.SetCallback(Бұл)
m.poMI.Do([Alter ButtonPad ID 4 ]+;
[Add PushButton Calling OLE «DEMO_ChangedHandler» ID 1001])
m.poMI.Do([Run application «C:callback_maphook_selection.mbx»])
m.poMI.Do([Open Table «]+This.cMap+;
[» Interactive Map From «]+Juststem(This.cMap)+[«])
Endproc && Init

DEMO_changedhandler(lcParam таңба ретінде) процедурасы VOID ретінде
Thisform.Enabled_ChangedHandler= болса[ON] Және ;
Val(m.poMI.Eval([SelectionInfo(3)]))>0

Жергілікті lc_MI_query таңба ретінде
m.lc_MI_query=m.poMI.Eval([SelectionInfo(2)])
Жергілікті lcValueFromMap таңба ретінде
m.lcValueFromMap=m.poMI.Eval(m.lc_MI_query+[.txt])
Thisform.list1.AddItem(m.lcValueFromMap)
Thisform.list1.Value=Thisform.list1.ListCount
Эндиф
Endproc && demo_changehandler

Процедура жою
Егер түрі([m.poMI.Name])=[C]
m.poMI.Do([Alter ButtonPad ID 4 Show])
m.poMI.Do([Alter ButtonPad ID 4 Remove ID 1001])
m.poMI.Do([Close All Interactive])
Эндиф
m.poMI=Нөл
Помиді босатыңыз
Endproc && Destroy

Процедура тізімі 1. басыңыз
Thisform.Enabled_ChangedHandler=[OFF]
m.poMI.Do([select obj from Map01 where txt=»]+;
This.ListItem(This.Value)+[» into _tmp])
m.poMI.Do(;
[set map center ]+;
[(CentroidX(_tmp.obj),]+;
[CentroidY(_tmp.obj))]+Chr(13)+Chr(10)+;
[zoom Distance( ]+;
[ObjectGeography(_tmp.obj,1),]+;
[ObjectGeography(_tmp.obj,2),]+;
[ObjectGeography(_tmp.obj,3),]+;
[ObjectGeography(_tmp.obj,4),»m»)*8 Units «m»])
Thisform.Enabled_ChangedHandler=[ON]
Endproc && list1. басыңыз

Процедура пәрмені 1. басыңыз
Thisform.Release
Endproc && пәрмені 1. басыңыз

Enddefine && demo_form

Мұнда әдісте [Init] MapInfo жүйесінің оқиғасын қайта анықтау енгізілді [SelChangedHandler] – картадағы таңдалған нысан өзгерген сайын іске қосылады. Бұл үшін әдісте [SetCallback] MapInfo COM данасы әдісті қамтитын нысанға сілтеме жіберіледі [DEMO_ChangedHandler], яғни. біздің формамыз. Келесі пәрмен: [Alter ButtonPad…] «Пәрмендер» құралдар тақтасында түймені жасайды, оны әдіс шақыруымен байланыстырады [DEMO_ChangedHandler]түйме идентификаторын тағайындайды [1001]. Осыдан кейін бағдарлама MapInfo ортасында іске қосылады [hook_selection.mbx]ол жүйе оқиғасы іске қосылғанда болады [SelChangedHandler] идентификаторы бар батырмаға берілген команданы орындау [1001]. Содан кейін, команда [Open Table…]карта ашылады.

Бұл екінші талаптың орындалуын қамтамасыз етеді, яғни. – картада объектіні таңдаған кезде картада таңдалған нысанға қатысты мәліметтер базасынан ақпаратты көрсетіңіз. Әдіс кодын жазу ғана қалады [DEMO_ChangedHandler]. Қарастырылып отырған сыныпта әдістеме [DEMO_ChangedHandler] картада таңдалған нысанның төлсипатын пішіндегі ListBox-қа қосады (өріс [txt]).

Айта кету керек, MapInfo-ның оқиғаларды басатын механизмі бұл барлық жағынан керемет өнімнің таңғажайып ерекшелігі болып табылады.

Бірінші талап — іс-шарада жүзеге асырылатын «ҚАЙДА» көрсету [List1.Click]. Міне, команда [select obj from Map01 …] картадан қажетті нысанды таңдаңыз. Содан кейін командаларды тізбектей орындау арқылы [set map center…] және [zoom…] картаны көрсету терезесінің ортасын таңдалған нысанның центроидінің координаталарына орнатыңыз және карта терезесінде көрсетілген фрагмент өлшемін таңдалған нысанның айналасында сипатталған тіктөртбұрыштан 8 есе үлкен етіп тағайындаңыз.

Жүйе оқиғасын тудырмау үшін ескеріңіз [SelChangedHandler]картада объектіні бағдарламалы түрде таңдағанда, оқиға [List1.Click] мәнді орнатудан басталады [OFF] жалау [Enabled_ChangedHandler]ол әдісте тексеріледі [DEMO_ChangedHandler]және тудың қайтарылуымен аяқталады [Enabled_ChangedHandler] мағынаға [ON].