Sistem Informatic de Localizare Geografica

Introducere.

Grafica interactivă este o ramură a informaticii aplicate, cu o largă răspândire în prezent, care se ocupă – in principal – cu comunicația om-sistem de calcul, prin intermediul desenelor și imaginilor (a graficii). În domeniul graficii interactive, sunt reunite două aplicații distincte ale informaticii : prelucrarea automată a graficelor (grafism) și sistemele interactive.

Una din direcțiile informaticii care a dobândit un mare interes atât prin diversitatea profilului profesional al utilizatorilor cât și prin importanța realizărilor: desenare automată, prelucrarea datelor geometrice, proiectarea asistată de calculator, animația desenelor, recunoașterea formelor, sinteza imaginilor, etc. – o constituie grafismul.

Fig.1 Utilizarea graficii în prelucrearea datelor geografice

Primele preocupări din zona informaticii pentru grafica practică datează din preajma anului l965; s-au conceput si s-au realizat echipamente periferice ("on-line" si "off-line") sau terminale, precum și sisteme de programe, pentru diverse aplicații practice asistate de calculator : trasare de grafice, prelucrarea numerică a datelor geometrice, desenare automată, etc. După 1970 au fost perfecționate periferice de tip "display" color, procesoare grafice, și – în jurul anului l975 – mini si microcalculatoare cu facilități de grafică sau specializate numai în aplicații grafice (în special, simulare grafică).

Astfel, spre sfârșitul deceniului 1971-1980, în informatică s-a constituit o ramură care avea ca obiect exclusiv prelucrarea datelor grafice și ulterior, și a imaginilor, in cadrul căreia s-au pus la punct mijloace tehnice (sisteme de echipamente și programe ) precum și metode și proceduri cu totul specifice activităților de grafică și imagini. Astfel, s-a ajuns la un domeniu aparte în informatică- Infografica.

Infografica a promovat și procedura de utilizare a calculatoarelor în sistem interactiv – sistem care permite comunicația direct (în timpul prelucrării datelor de către calculator ) a utilizatorului cu sistemul de calcul, dirijînd prelucrarea în direcția dorită de utilizator, sau, survenită în cursul tratării datelor. Sistemul interactiv a permis dezvoltarea algoritmilor de tip euristic (proceduri interactive alese de utilizator în funcție de efectele rezultate din proceduri aplicate initial și "comunicate" operatorului de către calculator, care asteaptă noi reguli de continuare a prelucrării datelor), algoritmi care îngăduie utilizatorului să cunoască insăși aplicația pe care vrea să o realizeze. Cea mai eficientă modalitate de realizare a sistemului interactiv, de comunicare om – calculator ,este cea grafică, de unde și grafica interactivă.

Principalele aplicații ale graficii interactive

Reprezentarea grafică cu ajutorul calculatorului este utilizată în prezent în toate domeniile: industrie, economie, administrație, cercetare științifică, agricultură, medicină, artă, sport, biologie, ecologie, și protecția mediului, militar, publicitate, imprimare, televiziune, învațamânt și – prin intermediul calculatoarelor personale și portabile – în orice activitate individuală (gestiune, evidență, jocuri, simulare, etc.)

Fig.2 Trasarea rutelor mijloacelor de transport utilizând grafismul

Acum, grafica interactivă a devenit un instrument standard si economic, aplicat curent în toate domeniile ingineriei, gestiunii, artei și științei. Progresele tehnologice rapide realizate la nivelul stațiilor de lucru grafice, echipamentele și blocurile specializate si terminalele inteligente, combinate independent de echipamente), toate la un loc au dus la lărgirea practic fără limite a aplicațiilor interactive de grafică și prelucrare a imaginilor (aplicație numită astăzi, vizionică ).

a) Desenarea interactivă

Sistemele și echipamentele grafice sunt utilizate cel mai frecvent în activitatea curentă de reprezentare a funcțiilor matematice, fizice și economice (în două și trei dimensiuni), la desenarea de histograme grafice, diagrame de producție, gestiunea stocurilor, vizualizări sugestive de relații în domenii diverse ca : știință, tehnologie, gestiune – administrație – comerț, decizie și învățământ. Toate aceste desene sunt folosite pentru prezentarea unor situații, tendințe și reguli, într-un mod concis, clar, atractiv și expresiv, avînd implicații importante asupra înțelegerii unor fenomene mai ample, stabilirii deciziilor corespunzătoare și realizăriii unor demonstrații concludente.

b) Cartografia

Sistemele grafice se utilizează pentru producerea unor reprezentări precise pe hârtie, film, videodisc sau alte suporturi, a fenomenelor naturale și geografice (meteorologice, factori de mediu, calitatea mediului, poluare, demografice, hidrologice, agricole, etc.). Realizarea și utilizarea hărților are o istorie îndelungată și remarcabilă. În ultimii 25 ani, calculatoarele electronice au introdus mari schimbări nu numai în realizarea acestora, ci și în utilizarea (interpretarea) lor. Există patru mari aplicații majore în domeniul cartografic : referințe geografice, exploatarea și administrarea resurselor naturale, utilizarea terenurilor, analiză și afișarea datelor economice și demografice. Datorită scării mici și a densității informației, aceste hărți sunt astăzi frecvent utilizate sub forma imaginilor de satelit și / sau fotografiilor aeriene, precum și sub forme derivate.

Cartografierea automată realizează în principal: creșterea productivității și noi utilități. Creșterea productivității în realizarea hărților se datorește reducerii sau eliminării totale a desenării manuale. Precizia desenului realizat cu ajutorul calculatorului, facilitățile de detectare automată a erorilor, asociate cu standardizarea procedurilor și produselor cartografice, conduc la o calitate superioară în cartografie. Posibilitatea încorporării tuturor modificărilor, reviziilor prin reutilizarea datelor numerice din baza de date cartografice a sistemului automat, conduce – deasemenea – la o semnificativă reducere de timp față de redesenarea manuală a hărților. Sistemele grafice utilizate în cartografie au o configurație mai bogată, incluzînd echipamente speciale ca : discurile optice (videodiscuri) cu posibilități de citire / scriere "display"- uri color cu mare rezoluție, facilități de prelucrare paralelă rapidă și echipamente de tipărire automată.

c) Proiectare asistată de calculator

Tehnicile grafice interactive sunt folosite în proiectarea de componente, repere și ansamble ale unor echipamente mecanice, electrice, electromecanice și electronice. Utilitatea sistemelor grafice a devenit cu atât mai evidentă, cu cât în procesul de proiectare a intervenit conceptul tridimensional (3D). Metoda tradițională constă în realizarea mai multor prototipuri fizice ale unui proiect și îmbunătățirea acestora prin testări și modificări repetate. În condițiile de concurență actuale, această metodă este scumpă și necesită un timp îndelung de realizare. Sistemele de grafică interactive oferă posibilitatea construirii modelului, îmbunătățirea lui prin operații interactive, testarea acestuia cu ajutorul unor simulatoare și apoi realizarea fazelor de post-procesare, adică : crearea listei de componente și materiale, generarea automată a tehnologiei, generarea comenzii numerice pentru prelucrările cu mașini-unelte cu comandă program.

d) Animația și simularea

Realizarea unor secvențe de animație cu ajutorul calculatorului, folosind obiecte reale sau simulate. Cu ajutorul acestora se pot studia nu numai figuri ci și modele matematice ale unor fenomene ale naturii de mare interes științific , ca de ex.: relativitatea, reacțiile nucleare și chimice, organe și sisteme fiziologice, deformarea structurilor supuse la eforturi.

Alte aplicații ale animației, se referă la : simulatoarele de zbor, creația artistică : filme, emisiuni TV, documentare științifice, etc.

e) Comanda și urmarirea proceselor

f) Automatizarea activităților de birou și tipărirea electronică

g) Prelucrarea interactivă a imaginilor (vizionica)

C A P I T O L U L l.

Geographical Information System (GIS) si datele geospațiale.

Creșterea preocupărilor asupra problemelor cu care se confruntă omenirea în mediul înconjurător, fizic și uman, precum și avalanșa de informații care descriu în prezent caracteristici ale pământului, au orientat cercetarea geografică spre noi metode de studiu, mai eficiente.

Dezvoltarea rapidă a tehnologiei GIS a oferit un instrument valabil pentru ca oamenii de știință care studiază geografia să înțeleagă procesele și schimbările din mediul înconjurător, și să participe la elaborarea unor decizii referitoare la natura lumii înconjurătoare. Provocările majore care se remarcă astăzi : schimbarea climei globale, creșterea producției de alimente, dispariția resurselor naturale, dezastrele naturale și poluarea – toate au o dimensiune geografică (spațială). Zilnic există numeroase probleme locale care includ asigurarea facilităților publice : școli, spitale, detalii de extindere a spațiului de locuit, managementul serviciilor de urgență, și conservarea resurselor naturale – și acestea au o dimensiune spațială.

Natura acută a multor probleme care afectează societatea și volumul copleșitor de informații care le descriu, constituie o provocare serioasă pentru cel care ia decizia în orice sector al societății. În aceasta situație, intervine asistența oferită de un GIS.

Geographical Information System (GIS) este un sistem computerizat pentru păstrarea, retrierea, prelucrarea, analiza și expunerea unor date geografice de referință. Aceste date pot include informații fizice, biologice, culturale, demografice sau economice, și ca urmare, acest sistem este un instrument valabil în științele naturale, sociale, medicale și inginerești, ca și în afaceri sau planificare.

l.l. Scurt istoric

Antecedentele GIS merg înapoi cu sute de ani, în domeniul cartografiei și întocmirii hărților, dar GIS propriu-zis, s-a dezvoltat după 1960, prima dată în domeniul public.

În decada (l970-l980) s-a dezvoltat o industrie GIS viguroasă, cu lider incontestabil, SUA. Pornind de la recensamântul SUA din anul l965 se punea problema introducerii datelor respective într-un program de geografie computerizată; ideea de bază a constat în codificarea topologiei segmentelor de străzi cu intersecții numerotate la fiecare capăt al segmentelor de străzi, numerotîndu-se în același timp și ariile ocupate de construcții sau parcuri, de o parte și de cealaltă, a străzilor. A fost o inovație tehnologică majoră , care a revoluționat GIS. Astfel a luat naștere DIME (Dual Independent Map Enconding ), care a evoluat în GBF- DIME (Geographic Base File, Dual Independent Map Enconding) și s-a dezvoltat după l990, devenind TIGER (Topologically Integrated Geographic Enconding Referencing ) sistem, care constituie o parte importantă din NSDI (National Spatial Data Infrastructure).

O instituție cheie în apariția și dezvoltarea GIS este reprezentată de Laboratorul Harvard pentru Grafică Computerizată și Analiză Spațială. La început (l966) cercetările au fost direcționate către cerințele arhitecților peisagiști, arhitecților urbani și de planuri regionale, precum și administratorilor de resurse (SYMAP).

Laboratorul a favorizat permanent interacții ale profesioniștilor din diverse domenii : arhitectură, geografie, planificare, știința regională și programare, într-un context particular istoric/geografic. În lucrarea /3/ din bibliografie sunt prezentate și alte centre de importanță în dezvoltarea GIS în SUA.

Lucrarea se referă deasemeni și la aspecte ale evoluției GIS în Europa. În Europa există numeroase Agenții Naționale de Hărți, care au un domeniu larg de activitate, incluzînd : hărți de parcele, hărți cadastrale, etc. Asemanător Statelor Unite, orașele și utilitățile publice apreciază potențialul tehnologiei computerizate, organizînd și implementînd sisteme de hărți computerizate cu partenel a luat naștere DIME (Dual Independent Map Enconding ), care a evoluat în GBF- DIME (Geographic Base File, Dual Independent Map Enconding) și s-a dezvoltat după l990, devenind TIGER (Topologically Integrated Geographic Enconding Referencing ) sistem, care constituie o parte importantă din NSDI (National Spatial Data Infrastructure).

O instituție cheie în apariția și dezvoltarea GIS este reprezentată de Laboratorul Harvard pentru Grafică Computerizată și Analiză Spațială. La început (l966) cercetările au fost direcționate către cerințele arhitecților peisagiști, arhitecților urbani și de planuri regionale, precum și administratorilor de resurse (SYMAP).

Laboratorul a favorizat permanent interacții ale profesioniștilor din diverse domenii : arhitectură, geografie, planificare, știința regională și programare, într-un context particular istoric/geografic. În lucrarea /3/ din bibliografie sunt prezentate și alte centre de importanță în dezvoltarea GIS în SUA.

Lucrarea se referă deasemeni și la aspecte ale evoluției GIS în Europa. În Europa există numeroase Agenții Naționale de Hărți, care au un domeniu larg de activitate, incluzînd : hărți de parcele, hărți cadastrale, etc. Asemanător Statelor Unite, orașele și utilitățile publice apreciază potențialul tehnologiei computerizate, organizînd și implementînd sisteme de hărți computerizate cu partenerii GIS software. Un succes îl reprezintă în domeniu, orașul Basel, al cărui cadastru corelează date legale referitoare la persoane, cu hărțile cartierelor și este extins să includă și liniile de utilitate publică (școli, spitale, pompieri, etc.). Universitățile europene au fost și sunt centre active de cercetare în diverse discipline aflate în legătură cu GIS.

l.2. Componentele unui GIS.

Un GIS este un sistem informațional, deci reprezintă un set de procese, executate pe date inițiale (neprelucrate), pentru a produce informația care va fi utilă în luarea deciziei.

O serie de pași conduc la observarea și colectarea de date până la analiză. Sistemul informațional trebuie să îndeplinească un șir întreg de funcții pentru a conduce observarea, măsurătorile, descrierea, explicarea, pronosticarea și luarea deciziei.

Prin ce se deosebește GIS de alte sisteme informaționale ?

Integrează informații spațiale și alte tipuri de informații într-un singur sistem; oferă o structură consistentă pentru analiza spațială.

Face conexiuni între activități bazate pe vecinătăți spațiale.

Oferă mecanisme pentru executarea prelucrării, analizei și afișării cunoștințelor geografice.

La fel de importante sunt pentru dezvoltarea unui GIS Computer Science și Cartografia.

Fig.3 Componentele principale ale unui GIS

Un GIS care lucrează cuprinde cinci componente cheie :

a/ hardware – computerul cu care operează sistemul. Software-ul GIS funcționează pe un domeniu larg de tipuri de hardware, de la computer server centralizat la computere desktop utilizate singure sau în configurații de rețele.

b/ software – prevede funcțiuni și instrumente necesare pentru stocarea, analiza, afișarea informațiilor geografice. Componentele sale cheie sunt :

instrumente pentru input și prelucrarea informațiilor geografice;

sistem de administrare a bazei de date (DBMS);

instrumente care susțin întrebarea geografică, analiza și vizualizarea;

un utilizator grafic interfață (GUI) pentru acces mai ușor la instrumente.

c/ date – reprezintă cel mai important component. Datele geografice și tabelele înrudite pot fi colectate de la o sursă comercială de date. Un GIS integrează date spațiale cu alte resurse de date și poate utiliza chiar un DBMS, pentru a organiza și a stoca informațiile.

d/ oameni (personalul) – tehnologia GIS are o valoare limitată fără oamenii care administrează sistemul și dezvoltă planuri pentru aplicarea GIS în problemele lumii reale;

e/ metode – un GIS de succes operează în concordanță cu planuri bine proiectate și legi de afaceri, care sunt modele și practici operaționale, unice pentru fiecare organizație.

l.2.l. Date pentru GIS

Fig.4 Tipuri de date pentru GIS.

"Materia primă" utilizată în GIS este alcătuită din date geografice – observații asupra elementelor geografice ale pământului și a distribuției acestora.

Uneori denumite date geospațiale, ele sunt în strînsă legătură cu un mare număr de probleme asociate cu mediul nostru înconjurator. S-a estimat că la autoritățile locale, mai mult de 80% din datele lor au o componentă spațială. Pentru a fi colectate, se utilizează o serie de tehnici, se pot prezenta într-un mare număr de formate și descriu o serie de fenomene.

În funcție de subiectul studiului elaborat se pot culege datele geospațiale din :

– Hărți de bază – ale străzilor și soselelor principale; granițe pentru recensământ, poștă, arii politice, râuri și lacuri, parcuri și marcaje între proprietăți, etc.

– Hărți și date în legătură cu afaceri – date referitoare la recensământ/demografie, consumatori de produse, servicii financiare, asistență medicală, avere imobilă, telecomunicații, servicii de urgență, criminalistică, reclame, inființare de afaceri, transport.

– Hărți și date referitoare la mediul înconjurător – date referitoare la mediul înconjurător, imagini din satelit, topografie, resurse naturale.

– Hărți generale – hărți ale lumii și ale țării.

Pe baza acestor tipuri de informații, în urma prelucrării și analizei lor, produsul final al GIS se poate prezenta ca : hărți topografice, hărți geologice, imagini hard-copy sau digitale, fotografii aeriene, modele trasate digital, tabele tip database, hărți izoterme, rapoarte statistice, formate multimedia, etc.

Fig.5 Relația GIS cu datele inițiale și cu produsele sale

Tipurile de date necesare unui proiect GIS trebuie prelucrate pentru a fi compatibile cu sistemul. De exemplu informațiile geografice sunt disponibile la diferite scări, grade de detalii sau grade de precizie. Înainte de a fi integrate, trebuie transformate la aceeași scară. Aceasta transformare se realizează temporar – pentru o afișare propusă, sau permanent – pentru analiză.

Fig.6 Prelucrarea datelor geospațiale în vederea stocării în memoria calculatorului

Tehnologia GIS oferă mai multe instrumente pentru prelucrarea datelor spațiale și pentru înlăturarea celor inutile. Astfel, dacă informațiile culese nu sunt în format digital, se convertesc. De exemplu scanarea unei hărți, convertește liniile și punctele de pe o hartă în informații digitale.

Fig.7 Distribuirea datelor geografice pe straturi de informații

Este practic ca stocarea datelor spațiale să se realizeze în straturi. De exemplu, pentru un județ :

stratul l = proprietăti de graniță și tipuri de pământ (hărți de arii)

stratul 2 = rețele de drumuri și căi ferate (hărți de linii)

stratul 3 = caracteristici de teren (hărți de contur)

stratul 4 = localizare de școli și spitale (hărți de puncte)

Sistemele GIS stochează și procesează date în două formate :

– modelul vector – lumea este reprezentată ca un mozaic de linii care se intersectează, cu puncte ce reprezintă localizarea, și granițele entităților geografice. Datele spațiale sunt reprezentate ca arcuri, (linii), poligoane (ariile parcurse), puncte (noduri etichetate), noduri (puncte de intersecție).

– modelul raster – (cu celule de rețea) provine din tehnologiile de imagini aeriene, sau din sateliți, care reprezintă elementele geografice ca structuri de celule de rețea , denumite pixeli.

Fig.8 Reprezentarea datelor spațiale în cele două tipuri de modele

Tipul de model este foarte important în determinarea aplicațiilor potențiale ale modelului și modelul poate afecta tipul de analiză ce poate fi realizată. Uneori se poate utiliza un acces hibrid.

Natura oricăror activități economice, sau de orice alt tip cu dimensiune spațială, nu poate fi ințeleasă propriu-zis, fără să ne referim la caracteristicile lor spațiale, care sunt de două tipuri :

– localizarea – coordonatele locului, numele locului, codul poștal,etc.

atributele – caracteristici sau proprietăți asociate cu localitatea, păstrate în tabele, de exemplu populația, venituri anuale, vegetația, etc.

Fig 10 Schemă de principiu a unui GIS ; DBMS – sistem de administrare a bazei de date.

În toate activitățile pe care le desfășoară omul, este înconjurat de geografie și după cum s-a amintit, majoritatea informațiilor din societate sunt fie spațiale fie au o componentă spațială .

Exemplu de prezentare a unor caracteristici particulare ale datelor spațiale:

GEOMETRIE – Se specifică configurația elementului geografic : forma unei construcții, cursul unui râu, relieful terestru,etc.

LOCALIZARE – Se poate specifica în mai multe moduri :

metoda : coordonate, numele localității, codul poștal.

precizie : x<=l,0 m, numele orașului, codul poștal al sectorului, etc.

acuratete : centrul construcției, poziția ușii de la intrare, etc.

TOPOLOGIE -Se referă la relațiile spațiale între elementele geografice și descrierile utilizate; propozițiile încep cu următoarele expresii : În corelare cu, în interiorul, adiacent cu, la nord de, etc.

În tabelul de mai jos se prezintă unele exemple de tehnici utilizate în colectarea datelor geospațiale :

Elementul geografic Tehnica de colectare Output

l) Rețele de transport Observare terestră Hărți topografice 2) Tipuri de roci Întocmire de hărți geologice Hărți geologice 3) Utilizarea terenurilor Senzori electronici la Hard-copy și agricole bordul sateliților imagini digitale

4 Utilizarea terenurilor urbane Fotografiere aeriană Fotografii aeriene 5) Relieful terenului (țării) Altimetrie din satelit Model trasat digital 6) Caracteristicile populației Programe de recensământ Tabele database

7) Temperaturile oceanelor Geamanduri automate cu Hărți izoterme . sisteme de poziționare globală

8) Documente de criminalistică Rapoartele poliției Rapoarte statistice.

1.2.2 Tehnici de procesare și analiză

Un GIS funcțional și elaborat trebuie să realizeze produse noi și să se adapteze la integrarea diverselor tipuri de date, precum și la alegerea tipurilor de probleme.

In tabelul de mai jos, se prezintă exemple de probleme luate în studiu și metoda de rezolvare într-un GIS :

Întrebări Tipul de analiză

l) Ce se întâmplă dacă se scurg produse chimice intr-un râu ? MODELARE 2) Unde este Cordonul Verde , relativ la oraș ? INVENTAR 3) S-a schimbat populația în ultimii 10 ani ? INVENTAR 4) Ce debușeuri există în centrul orașului ? INVENTAR și MODELARE 5) Există un model spațial în legătură cu

proprietarii de mașini în câmpul Dvs. de acțiune ? ANALIZĂ SPATIALĂ

Problemele care se pun unui GIS pot fi după natura lor, de două tipuri :

a. Probleme simple (tip întrebări de localizare sau proprietate : unde? cine ?) puse unui singur "strat" de date .

b. Probleme analitice ( care presupun un studiu complex de situație ) Ex : dacă se construiește o șosea principală aici, în ce mod va fi afectat traficul ?

GIS prevede pentru problemele simple – capacități simple "point – and- click", iar pentru cele complexe, analize sofisticate prin instrumente care prevăd informații de timp pentru manageri și analiști.

Unele tipuri de instrumente analitice utilizate în rezolvarea unor sarcini (Tasks) GIS :

1.ANALIZA DE VECINĂTATE (proximity analysis):

Se utilizează un proces denumit " buffering" (zonare) pentru a determina relația de vecinătate dintre elemente geografice distinctive. (de exemplu inventarirea parcelelor de-a lungul unei șosele, evaluarea pagubelor în urma unui cutremur).

Fig. 11 Exemplu de "buffering" de-a lungul unei artere principale

2.ANALIZA SUPRAPUSĂ (overlay analysis):

Se integrează diverse straturi de date, prin superpoziționare sau asamblare spatială (de exemplu două sau mai multe straturi de hartă, utilizate pentru a se realiza un nou strat de hartă; metoda se preteaza la studii pe soluri, vegetație sau, proprietate de terenuri cu evaluare de taxe, etc.)

Fig. 13 Prezentare schematică a unei analize suprapuse

3.ANALIZA DE REȚEA (network analysis):

Sunt explorate legăturile dintre elemente geografice distincte (de exemplu pentru o rețea de drumuri: timpul de călătorie, accesibilitatea sau impedanța de-a lungul sistemului de drumuri, riscurile accidentelor, etc.)

4.ANALIZA DIGITALĂ DE TEREN (digital terrain analysis):

GIS poate construi modele tridimensionale în care topografa unei localizări geografice se reprezintă în coordonate x,y,z; datele de teren sunt astfel vizualizate tridimensional.

5.VIZUALIZAREA:

Pentru multe tipuri de operații geografice rezultatul final este mai bine vizualizat ca hartă sau ca grafice. Afișarea hărții poate fi integrată cu comentariu sonor, vedere tridimensională, imagini fotografice, multimedia, etc.

1.3 GIS și alte sisteme de informare geografică

Fig. 14 Natura interdisciplinară a GIS

O serie de informații geospațiale se pot obține prin metode moderne oferite de observarea aeriană a pământului :

1.Sistemul de poziționare globală – GPS (Global Positioning System)

GPS reprezintă un sistem de sateliți ai pământului care prevăd informații de timp și spațiu; aceste informații permit receptoarelor GPS să calculeze poziții pe pământ. Semnalele pot fi primite de la cel puțin trei sateliți cu scopul de a stabili poziția receptorului în coordonate latitudine/longitudine (sau în coordonatele unui sistem național de coordonate). Măsurătorile de la un al patrulea satelit sunt necesare pentru a calcula altitudinea poziției vizate. În principiu , configurația GPS constă din trei componente :

– "n" sateliți ( n=<3 )

– receptor aerian mobil

– receptor într-o bază de poziție geografică cunoscută (necesar pentru efectuarea corecțiilor diferențiale ale semnalelor inițiale de la sateliți).

Fiecare satelit are la bord un computer și un ceas atomic foarte precis. Computerul calculează orbita satelitului pentru o săptămână, de exemplu, și prezice condițiile ionosferice pentru acest interval. Consultându-și ceasul și datele generate de computer, satelitul își anunță poziția pe cer , la fiecare microsecundă.

2.Senzori electronici aerieni. (Remote sensing)

Se studiază fenomene percepute din aer sau de la sateliți. Se pot supraveghea arii foarte întinse, la un cost relativ scăzut. Asfel, este vorba de zonele arctice, deșerturi, arii împădurite, mlaștini și regiuni muntoase. Acest studiu prevede interpreți experimentați, cu cunoștințe de condițiile pământului (geomorfologie, vegetație, soluri și compoziție minerală).

Senzorii utilizați pot fi de două tipuri :

– senzori pasivi – operează asemănător ochiului omensc, prin detectarea radiației reflectate de către obiectele observate (radiație de la soare sau de la altă sursă de iluminare ).

– senzori activi – observarea activă se realizează într-o manieră inversă : energia este transmisă de către senzor însuși, reflectându-se înapoi la impactul cu obiectul ( ecou "backscatter") și este inregistrată de către senzor. În remote sensing, radarul de microunde ( Radio Detection And Ranging) operează prin senzori activi.

O imagine radar oferă posibilitatea observării unor fenomene sau aspecte ale suprafeței pământului prin obstacole ca : nori, apă, zăpadă sau vegetație subțire. Radarul este deasemeni foarte util, din cauză că accentuează neregularitățile de la suprafața pământului, observate pe imaginile obținute prin remote sensing.

1.4 Managementul unui GIS și aplicații

Fig. 15 Importanța cercetătorului în funcționarea GIS

Un factor deosebit de important pentru funcționarea eficientă a unui GIS îl constituie administrarea volumului mare de date spațiale. Această administrare se află într-un sistem complex de relații cu : structura de date, problema propusă pentru studiu, platformele hardware și software, dar, nu în ultimul rând, și cu managementul interfeței umane. Administrarea instalațiilor GIS poate implica deasemeni protejarea și instrucția personalului. Interfața umană poate fi adesea trecută cu vederea dând preferință poate, specificațiilor hardware sau cumpărării de noi database digitale.

Este la fel de importantă cunoașterea organizației personal ca și considerarea valorilor și beneficiilor funcționării GIS. Ca urmare, managementul GIS trebuie să includă programe de pregătire interne și externe, publicații referitoare la personal, ca și cele referitoare la hardware, software și date.

In legatură cu evoluția unui GIS, cu cât acesta este mai integrat într-o organizație largă de sisteme informaționale, forma de "output" se poate schimba. Rezultatele analizei GIS pot fi trecute direct în asfel de sisteme; astfel, output-ul poate lua mai repede forma ( ca hartă ,tabel, raport), ca un fișier care prevede direct input într-un alt sistem-computer.

Fig.16 Schema utilizării GIS de către autoritățile locale

Numeroase companii care au utilizat GIS în afacerile lor, au remarcat :

-fluidizarea serviciilor pentru clienți

-reducerea costurilor achizițiilor de teren, printr-o mai bună analiză

-reducerea costurilor de întreținere a flotei, printr-o logistică mai bună

-analize rapide de date, care au permis luarea de decizii optime

GIS reprezintă un instrument ideal pentru practicieni într-un domeniu larg de câmpuri de aplicare. În prezent este utilizat constant în departamentele guvernamentale, autorități locale, organizații comerciale, organizații preocupate de mediul înconjurător.

C A P I T O L U L 2

Aplicația Harta României – Nucleu GIS

După cum am prezentat în capitolul 1 al lucrării există un domeniu inepuizabil de aplicare a studiilor geografice bazate pe utilizarea GIS. Capitolul 2 se referă la programul denumit Harta României ce oferă un prim pas în reprezentarea diverselor elemente geografice de interes statistic, economic, turistic, sau didactic. În această etapă s-a studiat posibilitatea creerii de comenzi pentru reprezentarea pe hartă a unui oraș, cu opțiunea de afișare a rețelei de străzi a acestuia, și reprezentarea schematică a câtorva șosele care leaga diverse orașe. Importanța practică a unui astfel de nucleu GIS constă fară îndoială în oferirea unei game largi de informații, acumularea acestora într-un spațiu redus și accesul rapid la bazele de date.

Principalele date geospațiale pentru orașe s-au obținut din enciclopedii referitoare la România și pe baza acestora s-a construit o rețea de coordonate longitudine – latitudine care acoperă intreaga suprafață a țării și regiunile limitrofe.

2.1 Scurtă prezentare a programului

Aplicația Harta este un program care se încadrează în tehnologia GIS de gestionare și prelucrare a informațiilor geografice folosind un model hibrid de stocare a datelor spațiale.

Tipurile de date spațiale cuprind localizări ale orașelor prin utilizarea coordonatelor geografice: latitudine/longitudine folosind modelul vector. În program s-a implementat o funcție de transformare a acestor caracteristici pentru trecerea la coordonatele ecranului de monitor (modelul raster) și pentru a asigura dialogul utilizator-computer. Prin acest dialog funcția stabilește poziția unui oraș. Pe harta afișată, (hartă obținută prin scanare) programul figurează denumirea orașului într-o anumită culoare. Am ales culoarea neagră pentru orașele care nu au în baza de date rețeaua de străzi în format bitmap. Restul orașelor, care au hărți, apar pe ecran cu denumirea scrisă în culoarea albastru. Vizitarea unui oraș se realizează cu mouse-ul astfel: la "clic" pe numele orașului apare pe ecran rețeaua de străzi. După vizitare, numele orașului este tipărit cu ajutorul culorii roșu .

Structura generala a aplicației este prezentată în figura de mai jos.

Fig.17 Relația între componentele programului

2.2 Reprezentarea imaginilor pe calculator (formatul Bitmap)

În cadrul aplicatiei, pentru administrarea imaginilor în memoria calculatorului, am utilizat formatul bitmap.

Bitmap este un obiect grafic care crează, prelucrează și stochează imagini ca fișier pe un disk. Este unul din obiectele GDI care poate fi selectat intr-un "device context" (DC)" .

"Device context" este structura care defineste un set de obiecte grafice (penita,pensula,paleta pentru set de culori,etc.) si atributele asociate lor, precum si moduri grafice care au efect asupra "output"-ului. Dintre obiectele DC, vom reflecta mai mult despre bitmap.

Din perspectiva uunui programator, bitmap consta dintr-o colectie de structuri care specifica sau contin urmatoarele elemente :

a)un haeder care descrie rezolutia device-ului in care a fost creat un dreptunghi de pixeli, dimensiunea dreptunghiului, dimensiunea aranjamentului de bits, etc.

b)o paletă logică

c) un aranjament de bits care definește relațiile dintre pixeli și imaginea bitmap-ată, și intrări în paleta logică.

Fig.18 Elementele care servesc la obținerea unei imagini

Dimensiunile bitmap sunt în relație directă cu tipul de imagine conținută. Imaginile bitmap pot fi monocrome sau color. Într-o imagine, fiecare pixel corespunde unui bit sau mai multor biti din bitmap. Pentru imaginea monocromă, raportul bit/pixel = 1. Imaginile color sunt mult mai complexe. Numărul culorilor care pot fi afișate de un bitmap este =2 * număr Biti/pixel. Un bitmap de 256 culori cere 8 biti/pixel. Schema din figura de mai sus prezintă perspectiva programatorului asupra bitmap găsit în fișierul REDBRIK.BMP. Se arată paleta ordonată de 32 câte 32 pixeli, un dreptunghi colorat și șirul de indecși din harta de culori a paletei. Se dă o aranjare în paletă a dreptunghiurilor de 32 câte 32 pixeli și ordonarea indecșilor care leagă culorile harții din dreptunghi cu pixelii din paletă.

În exemplul de mai sus, dreptunghiul de pixeli a fost creat într-un device-display VGA folosind o paletă de l6 culori. Aceasta paletă cere indecșii de 4 biti; prin urmare, ordonările care întocmesc paleta de culori pe pixeli-culoare este compusă din 4 biti/index (În bitmap-ul de mai sus, sistemul întocmește -traduce- indecși la pixeli, începînd cu linia de jos, a regiunii dreptunghiulare, și încheie cu linia cea mai de sus). Prima linie a aranjamentului corespunde celui mai de jos rând de pixeli, scan line = 31.

Există două clase de bitmap :

I. DIB – formatul de fișier a fost desenat pentru a permite ca graficele întoc-mite bit folosind o singură aplicație, pot fi încărcate si afișate în altă aplicație, reținînd același aspect ca și originalul.

II. DDB – comună versiunilor de început ale Windows l6 bit.

DIB (independent) sunt bitmap-uri care conțin tabele – color device-independente. Un tabel color descrie câte valori de pixel corespund valorilor RGB color. RGB este un model pentru descrierea culorilor care sunt produse la descompunerea luminii albe.

Un DIB conține următoarele culori și informații de dimensiune:

-formatul color al device-ului in care a fost creată imaginea rectangulară.

-rezoluția device-ului in care a fost creată imaginea rectangulară.

-paleta pentru device-ul în care a fost creată imaginea rectangulară

-un aranjament de biti care indica RGB triplet pentru pixeli în imaginea rectangulară

-un indice de data-compresie, care indică schema de data-compresie (dacă există) utilizată pentru a reduce dimensiunea aranjamentului de biti.

Fig. 19 Formatul fișierului bitmap

Formatul unui fișier este o descriere a modului în care se citește sau se stochează date bitmap într-un fișier. Formatul fișierului și formatul folosit de Win32API sunt similare, dar nu identice. Formatul fișierului are header BITMAPFILEHEADER pe care formatul Win32API nu-l foloseste ca header. In figura 11 toate segmentele sunt folosite pentru formatul fisier, in timp ce pentru formatul Win32API excludem BITMAPFILEHEADER.

Segmentul BITMAPFILEHEADER conține informații despre tipul, dimensiunea și locul fișierului care conține un DIB. Sintaxa structurii BITMAPFILEHEADER este prezentată în continuare:

typedef struct tagBITMAPINFOHEADER{

// bmih

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount DWORD biCompression; DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

} BITMAPINFOHEADER;

Informația de culoare și dimensiune este păstrată într-o structură BITMAPINFO care constă dintr-o structură header de informații bitmap urmată de două sau mai multe structuri RBQUAD. Structura headarului de informații bitmap specifică dimensiunile dreptunghiului de pixeli, descris în tehnologia device's color și identifică scheme de compresie utilizate pentru a reduce dimensiunea bitmapului. Sintaxa structurii BITMAPINFO este prezentată în continuare:

typedef struct tagBITMAPINFO { // bmi

BITMAPINFOHEADER bmiHeader;

RGBQUAD bmiColors[1];

} BITMAPINFO;

Structura RGBQUAD identifică culorile care apar in dreptunghiul pixel.

Tipurile de bitmap header de bază sunt:

BITMAPCOREHEADER

BITMAPINFOHEADER

BITMAPV4HEADER

BITMAPV5HEADER

Ele se diferențiază după membrul Size care este primul și DWORD în fiecare din structuri.

BITMAPV5HEADER este o structură extinsă a lui BITMAPV4HEADER, care este o extensie a lui BITMAPINFOHEADER. BITMAPINFOHEADER SI BITMAPCOREHEADER au în comun cu alte structuri bitamap-headere, doar membrul Size.

Un Color table descrie modul in care valorile pixelilor corespund valorilor culorilor RGB.

Profile Data se referă fie la linked profile fie la embedded profile. Când formatul fișierului conține profile data, acesta va fi plasat la sfârșitul fișierului. Formatul Win32API plasează Profile Data imediat dupa Color table (daca este prezentă). Excepția formatului Win32API este pentru acele funcțiile Win32 care primesc un packed DIB , când Profile Data încep după BitmapBits ca un format fișier.

Există două varietăți de DIB-uri:

-"bottom-up" DIB, în care originea este în cel mai de jos colț în stânga

-"top-down" DIB, în care originea este în colțul cel mai de sus stânga.

Daca înălțimea unui DIB după cum este indicată de membrul Height al structurii header de informație bitmap este o valuare pozitivă avem "bottom-up" DIB; pentru o valuare negativă este vorba despre "top-down" DIB (acesta din urmă nu poate fi comprimat).

Formatul color este specificat în termeni de număr de plane color și biți color. Numărul planelor color este tot timpul 1. Numărul pentru bit color este 1 pentru bitmap monocrom, 4 pentru VGA, 8-16-24 sau 32 pentru bitmap-uri în alte device-uri de culori.

O aplicație poate folosi un DIB pentru a seta pixelii într-un device de afișare, apelînd funcția SetDIBitsToDevice.

Prezentăm în continuare sintaxa funcției:

int SetDIBitsToDevice(

HDC hdc, // handle to device context

int XDest, // x-coordinate of upper-

//left corner of

// dest. rect.

int YDest, // y-coordinate of

//upper-left corner of

// dest. rect.

DWORD dwWidth, // source rectangle

//width

DWORD dwHeight, // source

//rectangle height

int XSrc, // x coordinate of lower-left

//corner of source rect.

int YSrc, // ycoordinate of lower-left

// corner of source rect.

UINT uStartScan, // first scan line in array

UINT cScanLines, // number of scan lines

CONST VOID *lpvBits,// address of array with DIB

// bits

CONST BITMAPINFO *lpbmi, // address of structure

// with bitmap info.

UINT fuColorUse // RGB or palette indexes

);

O aplicație spreadsheet poate deschide hărți extinse și poate afișa în ferestre, folosind funcția SetDIBitsToDevice.

2.3 Controale ActiveX. Controlul LinkControl.

Complexitatea crescândă a dezvoltării aplicațiilor în cadrul unor medii complexe, așa cum este Windows, cu multele sale interfețe de programare a aplicțiilor (API), precum și nevoia de standardizare, de control al versiunilor, de accelerare a dezvoltării și de calcul distribuit au dus la apariția unei tehnologii numită programare bazată pe componenete.

2.3.1. Notiuni introductive referitoare la controale ActiveX

Componentele sunt entități software de dimensiuni mici (asemenea instanțelor unei clase) care efectuează operații specifice prin intermediul unor interfețe bine definite. Spre deosebire de instanțele claselor, componentele nu sunt legate definitoriu de o instanță a unui program sau de un sistem gazdă. Pot fi scrise într-o multitudine de limbaje și, cu toate acestea, comunică fără probleme prin intermediul interfețelor, cu programe și componente implementate în alte limbaje.

Microsoft a dezvoltat această tehnologie până la forma sa actuală, fiind denumită în prezent Componet Object Model (COM) – modelul componentelor obiectuale. S-ar putea întâlni și termeni înrudiți precum legarea și încapsularea obiectelor (Object Linking and Embedding – OLE) sau controale ActiveX. Acestea reprezintă implementări particulare ale programării COM. Propriu-zis COM este un standard independent de limbaj și de platformă care definește modul în care obiectele pot comunica între ele prin intermediul unui protocol acceptat în comun.

Cel mai important element privind obiectele COM îl reprezintă interfețele acestora; obiectele propriu-zise nu sunt decât cutii negre care implementează o funcționalitate particulară. Dar pentru a putea utiliza acestă funcționalitate, programele trebuie să respecte un contract bine definit privind transmiterea parametrilor și obținerea rezultatelor. Acest contract dintre programul client și obiect se numește interfață .

Se pot proiecta biblioteci API în termeni de interfață. Într-o aplicație client se poate scrie programul astfel încât să comunice cu un server prin intermediul acestor interfețe acceptate, indiferent de aplicația server utilizată. Deasemeni, se pot dezvolta componente de tip server care respectă definițiile interfețelor și se comercializează ca alternativă viabilă la componentele altor producători.

Fig. 20 Print screen în care se observă galeria de componente și controale. În planul doi al figurii – programul Harta care utilizează activeX-ul LincControl

Galeria de componente reprezintă o colecție de componente care pot fi integrate în propriile aplicații în scopul rafinării acestora. Visual C++ este insoțit de o gamă largă de controale ActiveX disponobile imediat, iar această mulțime poate fi îmbogățită (în orice moment) cu noi controale. Controalele ActiveX se bazează pe tehnologia COM, ceeace înseamnă că pot fi utilizate în Visual C++, Visual Basic, Visual J++ și în alte medii de programare care pot comunica cu obiecte COM.

Controale ActiveX dispun de mai multe proprietăți, metode și evenimente. Proprietățile permit modificarea aspectului controlului. Metodele permit fixarea sau determinarea datelor conținute în control. Evenimentele apelează codul care este scris în momentul în care utilizatorul intereacționează cu respectivul control (de exemplu, efectuarea unui clic pe un buton).

2.3.2. Structura și utilizarea controlului LincControl

În programul Harta României am creat control ActiveX "LincControl" pentru vizualizarea Numelui de Oraș pe hartă și pentru a permite utilizatorului interacțiunea cu baza de date corespunzătoare.

Structura principală a controlului cuprinde următorii membrii:

class CLincControlCtrl : public COleControl

a) Date

private:

BOOL haveMouse;

protected:

CString m_text; – numele oraș

CString m_path; – calea spre rețele străzi

COLORREF m_color; – culoarea denumirii oraș

public:

SIZE m_size; – dimensiunea controlului

LK_PRESSED 65341 – mesaj că a fost apăsat

b) Metode

void CLincControlCtrl::SetCaption(LPCTSTR lpszNewValue)

BSTR CLincControlCtrl::GetCaption()

void CLincControlCtrl::SetPath(LPCTSTR lpszNewValue)

BSTR CLincControlCtrl::GetPath()

::PostMessage(GetOwner()->m_hWnd,WM_COMMAND,wParam,lParam)

Fig.21 Ferestre din ActiveX-ul LincControl care ilustrează Clasele controlului, funcția de desenare, si galeria de componente.

Proprietățile LincControl-ului sunt interne și externe.

Proprietățile interne corespund funcțiilor care se ocupă cu afișarea nume oraș și a cerculețului asociat: Ellipse(0,3,10,13) in funcția OnDraw. Am realizat o afișare a numelui de oraș în patru culori astfel:

1) negru – pentru cazul in care nu avem rețeaua de străzi ;

2) albastru – dacă există calea către baza de date cu imagini – se apeleză funcția SetPath();

void CLincControlCtrl::SetPath(LPCTSTR lpszNewValue)

{

m_path = lpszNewValue;

if(!m_path.IsEmpty())

m_color = RGB(0,0,255);

SetModifiedFlag();

}

3) verde – când mouse-ul se află deasupra numelui orașului. Când părăsim controlul, se revine la culoarea inițială care poate fi roșu sau albastru – Evenimentul ON_WM_MOUSEMOVE cu funcția asociată OnMouseMove

4) roșu – indicând faptul că orașul a fost "vizitat" – adică clic pe denumirea orașului care produce evenimentul ON_WM_LBUTTONDOWN, cu funcția asociată OnLButtonDown.

Proprietățile externe reprezintă interfața cu fereastra principală care conține aceste controle și corespund actiunilor de creare și distrugere dinamică de către programul principal. Controalele create conform bazei de date cu orașe și care au atributul "vizibil" setat vor apărea pe hartă (în fereastra principală). Fiecare control cu proprietățile de mai sus conține încă patru atribute în mare parte preluate din baza de date. Când se creează un oraș se produc următoarele acțiuni:

este tipărit textul (numele orașului). Funcția SetCaption cu textul specificat, ca parametru realizează setarea.

void CLincControlCtrl::SetCaption(LPCTSTR lpszNewValue)

{

m_text = lpszNewValue;

}

Funcția GetCaption întoarce șirul de caractere asociat controlului, realizînd extragerea.

se dă calea catre fișierul cu imagini și se shimbă starea internă a controlui în funcție de existența sau inexistența (funcția SetPath) rețelei de străzi pentru un anumit oraș.

Funcția GetPath întoarce calea către fișierul cu imagini.

se stabilește poziția orașului în funcție de coordonatele longitudine/latitudine și o transformă în pixeli, adică în coordonatele ferestrei principale.

char Nume[10]; //nume orasului

int cx; //pozitia in pixeli pe Ox

char Par[10]; //paralela orasului

int cy; //pozitia in pixeli pe Oy

se setează dimensiunea textului (numele orașului), în raport cu lungimea textului afișat de control prin intermediul funcției GetTextExtent, metodă din clasa CDC.

CSize lg = dc->GetTextExtent(oras.Nume);

se anunță fereastra principală când controlul este apăsat; dacă are trimitere la fișierul cu imagini se stabilește un nou dialog. Controlul însuși primește mesajul că a fost apăsat prin intermediul evenimentului ON_WM_BUTTONDOWN. Cu funcția asociată trimitem către fereastra principală mesajul ON_WM_COMMAND în care wParam este egală cu o constantă unică definită în ambele aplicații. Funcția OnCommand cu doi parametrii din Harta Romaniei prinde mesajul și este apelată cand mesajul este ON_WM_COMMAND. Prin wParam verifică dacă este mesajul trimis de LincControl doar dacă wParam=LK_PRESSED. După aceasta se obține cu ajutorul funcției FromHandle, pointer către control. Se extrage din acest pointer cu GetPath, calea către fișierul cu imagini.(rețele de străzi)

BOOL CHartaDlg::OnCommand(WPARAM wParam, LPARAM lParam)

{

if(LOWORD(wParam)==LK_PRESSED)

{

//un oras care are o harta asociata a fost apasat cu mouse-ul

CLincControl* ctrl = (CLincControl*)FromHandle((HWND)lParam);

CHartaOrasDlg dlg;

ctrl->Refresh();

if(!ctrl->GetPath().IsEmpty())

{

dlg.SetPath(ctrl->GetPath());//preluam adresa bitmap-ului

//care contine harta

dlg.DoModal();//afisam ferestra de dialog, care va

// vizualiza harta resp.

}

return TRUE;

}

return CDialog::OnCommand(wParam, lParam);

}

După ce sitemul de operare (Windows) primește acest mesaj, îl plasează în coada de mesaje și apoi îl trimite catre variabila lParam. De la aceasta – control "handle" catre fereastra asociată cu controlul.

2.4 Prezentarea programului Harta României pe componente

Aplicația Harta este alcătuită din mai multe forme Visual C++ legate într-o ierarhie. Prima formă, care reprezintă fereastra principală a programului, este o interfață de tip dialog care conține un meniu și o imagine de tipul bitmap (harta României). Utilizatorul poate modifica bazele de date și/sau imaginea folosind titlurile de meniu: Orașe și Șosele, cu elementele de meniu respective.

2.4.1 Meniul Orașe

Meniul Orașe conține o serie de elemente de meniu dintre care enumerăm câteva:

Adaugă: pentru a pune datele spațiale ale unei localități în baza de date, și cu opțiunea de vizibil-invizibil pentru denumirea localității

Afișarea listei: afișează lista completă cu orașe existente în baza de date, precum și atributele fiecărui oraș

Fig.24 Dialogul de afișare a listei cu orașe

Ștergere: șteregerea unui oraș din baza de date

Fig.25 Ferestre ale opțiunilor de ștergere și modificare Oraș

Modificare: modificarea atributelor asociate unui oraș, (de exemplu modificarea cifrei populației sau vizibilitatea orașului pe hartă )

Datele caracteristice (atributele) sunt stocate în memorie. Aceste atribute sunt: denumirea localității, latitudinea, longitudinea, populația, calea pe care se ajunge la rețeaua de străzi.

2.4.2 Meniul Șosele

Un alt element geospațial luat în considerare de programul Harta se referă la trasarea șoselelor între localitățile aflate în baza de date. Utilizăm pentru aceasta meniul șosele care cuprinde opțiunile:

Adăugare: adăugarea unei șosele

Afișarea listei : afișarea listei complete cu șosele existente în baza de date și

atributele lor: lungime și orașe prin care trece o șosea

Ștergere: șterge o șosea din baza de date.

Evident, nu toate șoselele din figura corespund realitatii de pe teren, imaginea fiind prezinta doar un inceput de modelare.

Există în program înca o serie de opțiuni referitoare la relația dintre orase și sosele, că de exemplu: ce se intamplă cu soseaua dintre doua orase daca dispare unul dintre orase de pe harta ? Automat dispare imaginea soselei si inregistrarea ei din baza de date.

Fig.26 Fereastra de adăugare a unei șosele

2.4.3 Scurtă prezentare a unor funcții și structuri din programul Harta

In lucrare se prezintă unele aspecte referitoare la prelucrarea datelor spațiale colectate pentru această aplicație.

Clasa CHartaDlg este clasa asociată dialogului principal care conține harta României și meniurile Orașe și Soșele. De aceea această clasă va conține patru funcții asociate elementelor primului meniu (OnAdaugaOrase, OnAfiseazaOrase, OnStergereOrase, OnModficaOrase) și trei funcții asociate celui de-al doilea meniu, Sosele și funcția OnPaint. Aceasta funcție citește bitmap-ul care conține harta României și-l afișează în fereastra de dialog. Apoi desenează șoselele.

Fig.27 Clasele, structura orase și structura șosele in programul Harta României

Concluzii:

Lucrarea prezintă aspecte teoretice referitoare la utilizarea GIS în diverse domenii din societate contribuind prin produsele sale la adoptarea celor mai bune decizii de importanță pentru oraganizarea vieții. Partea practică este un nucleu GIS, constituind o aplicație grafică construită în Visual C++, pe o structură specifică unui sistem computerizat de informare geografică.

S-a ales ca subiect de lucru trasarea orașelor pe harta României, ținând cont de coordonatele lor geografice : latitudine /longitudine și specificând ca atribute denumirea orașelor și populația lor. Se poate opta pentru vizualizarea rețelelelor de străzi , în cazul principalelor orașe.

Denumirea orașului se schimbă în diverse culori, în funcție de informațiile pe le avem despre acesta.

S-a realizat un program pentru trasarea șoselelor imaginare între diferite orașe.

Se prezintă programele de lucru în Visual C++ pentru această aplicație.

Acest proiect de nucleu pentru un sistem GIS se poate dezvolta ulterior, cu includerea și a altor elemente geografice de interes, ca râuri și lacuri, precum și a rețelei de căi ferate.

Un astfel de proiect poate fi utilizat în studiul geografiei patriei pe calculator, în scop didactic. Deasemeni poate servi ca model de executare și a unor proiecte de interes pentru autoritățile locale, în realizarea unor hărți de cadastru sau a unor situații referitoare la structura populației, extinderea spațiilor de locuit, realizarea unor spații verzi sau organizarea serviciilor de urgență pentru necesitățile populației.

GLOSSAR :

ACCURACY – gradul în care informațiile de pe o hartă sau în database digitală, se armonizează cu valorile de control; accuracy nu este același lucru cu precizia.

ADDRESS MATCHING – mecanism de punere în relație a două fișiere, folosind adrese (stradă, cod poștal) cu diferite obiecte (obiecte în comun ).

AERIAL PHOTOGRAPHY – proces prin care sunt luate fotografii ale suprafeței pământului, de pe o platformă aeriana (de obicei avion). Obținerea de fotografii pe verticală, care sunt parțial suprapuse (imagine stereoscopică).

ALGORITHM – procedeu utilizat în computer pentru a rezolva probleme matematice; constau de obicei dintr-un set de reguli scrise in limbaj de computer.

AMERICAN NATIONAL STANDARDSS INSTITUTE (ANSI)- standardele ANSI au fost stabilite pentru mai multe elemente GIS și sisteme computerizate.

ANALOGUE – un semnal electronic variat continuu (contrast cu binary sau digital); termenul este utilizat deasemeni pentru a descrie produse tradiționale, hărți și fotografii aeriene.

ARC – o linie care uneste un set de puncte care pot forma o latură a unui poligon; punctele de la de la capătul arcului se numesc noduri.

AREA – o unitate fundamentală a informației geografice definită prin granițe continui, închise; deasemeni cunoscută ca poligon. Exemplele includ câmpuri, țări, lacuri, domenii locale de autoritate, districte școlare, etc.

ATTRIBUTES – Categorii de informații asociate cu elementele geografice- trăsaturi carcteristice de natură geografică; de exemplu, atributele unei linii reprezentînd un râu, pot include : numele râului, clasa râului, tipul de suprafață și agenția service.

AUTOMATED CARTOGRAPHY – proces de trasare a hărților cu ajutorul unor procedee afișate bazate pe computer, ca plotters sau monitoare.

AUTOMATED MAPPING/ FACILITIES MANAGEMENT (AM/FM) – sisteme folosite de autoritățile publice și alte grupuri, pentru administrarea unor database prevăzute să organizeze rețele de șosele, conducte sau rețele de cabluri.

BUFFERING – o operație analitică în GIS care generează o caracteristică sau un set de caracteristici definite printr-o distanță specifică în jurul unui element geografic.

CENSUS – o metodă de colectare de date utilizate pentru a obține date socio-economice pentru o întreagă populație; în multe țări, în lumea dezvoltată un recensământ se efectuează la fiecare l0 ani.

CHOROPLETH map – o formă de hartă tematică reprezentând clase de elemente asociate cu arii , prin intermediul densității de umbrire (hașurare).

COMPUTER AIDED DESIGN (CAD) – software folosit pentru generarea unui desen sau hărți; combinația dintre un pachet CAD cu o database, poate fi utilizată pentru a crea un GIS.

DATA – observații raportate care fac legătura între elemente ale lumii reale; datele pot fi cantitative (numerice) sau calitative (ne-numerice)

DATABASE- un set de date raportate , care fac legatura între grupuri de elemnte în lumea reală ; "geographical database se răsfiră în "inima" oricărui GIS."

NETWORK- o serie înlănțuită de șiruri de elemente; rețele de străzi, de râuri, de șosele .

PIXEL – o celulă de rețea , într-o rețea regulată; blocul de bază al construcției în modelul raster.

RASTER DATA – date geografice organizate în formă de rețea; fiecare celulă rețelei (pixel) conține un număr reprezentând valoarea sau clasa unui element.

REMOTE SENSING – procesul prin care imaginile suprafeței pământului se procură prin senzori electronici montați la bordul sateliților.

SPATIAL DATA – date geografice conținînd elemente ce descriu localizarea pe suprafața pământului.

VECTOR DATA – reprezentarea realității în formă de elemente discrete (puncte, linii sau arii) a căror localizări sunt stocate sub forma coordonatelor x,y.

Anexa 1

Exemple de aplicații GIS (conform bibliografiei)

A.

Apă, administrare, aeroport,analiza hărților, asistare afaceri.

C.

Cadastru, calitatea apei, călătorie, caracterizarea populației,cordonul verde, criminalitate,cutremur.

D.

Debușeuri, detaliu de deversare, drumuri.

E.

Ecranare ( de zgomot,de aspect )

G.

Grâu (recoltă ),lucernă, cereale.

I.

Impozite.

P.

Proprietari de mașini, produse chimice, proprietăți, pădure comercială., impădurire, ploi, populație.

R.

Relief, resurse, rețele străzi, recensământ, rețea de transport.

S.

Supraveghere spații inaccesibile, spitale, școli, sedimente ape curgătoare, schimbarea vegetației în timp.

T.

Taxe, terenuri, temperaturile oceanelor.

U.

Utilizare terenuri agricole, urgența,umiditate.

V.

Vegetație, venituri.

Anexa 2

Codul sursă al programului Harta României

// DlgSterg.cpp : implementation file

#include "stdafx.h"

#include "Harta.h"

#include "DlgSterg.h"

#include "DlgStS.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CDlgSterg dialog

CDlgSterg::CDlgSterg(CWnd* pParent /*=NULL*/)

: CDialog(CDlgSterg::IDD, pParent)

{

//{{AFX_DATA_INIT(CDlgSterg)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

}

void CDlgSterg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CDlgSterg)

DDX_Control(pDX, IDC_LST_ST_O, m_lstSterg);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CDlgSterg, CDialog)

//{{AFX_MSG_MAP(CDlgSterg)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CDlgSterg message handlers

BOOL CDlgSterg::OnInitDialog()

{

CDialog::OnInitDialog();

UINT nSize = sizeof(struct Orase);

ORASE oras;

CFile f;

CFileException e;

f.Open("orase.aaa",CFile::modeRead,&e);

f.SeekToBegin();

m_lstSterg.DeleteAllItems();

while(f.Read(&oras,nSize) == nSize)

m_lstSterg.InsertItem(0,oras.Nume);

return TRUE; // return TRUE unless you set the focus to a control

// EXCEPTION: OCX Property Pages should return FALSE

}

void CDlgSterg::OnOK()

{

if(AfxMessageBox("Vreti sa stergeti orasul selectat?",MB_YESNO)==IDYES)

{

POSITION pos;

pos = m_lstSterg.GetFirstSelectedItemPosition();

if(pos)

{

int nItem;

while(pos)

{

nItem = m_lstSterg.GetNextSelectedItem(pos);

m_strOras = m_lstSterg.GetItemText(nItem,0);

Stergere();

}

}

CDialog::OnOK();

}

}

void CDlgSterg::Stergere()

{

CFile f;

CFileException e;

ORASE oras;

UINT nSize = sizeof(struct Orase);

f.Open("orase.aaa",CFile::modeReadWrite,&e);

f.SeekToBegin();

LONG lOff = 0;

while((f.Read(&oras,nSize) == nSize)){

if(oras.Nume ==m_strOras)

break;

lOff+=nSize;

}

viz=oras.viz;

while(f.Read(&oras,nSize) == nSize)

{

f.Seek(lOff,CFile::begin);

f.Write(&oras,nSize);

lOff += nSize;

f.Seek(lOff+nSize,CFile::begin);

}

f.SetLength(lOff);

f.Close();

f.Open("sosele.aaa",CFile::modeReadWrite,&e);

SOSELE sosea;

UINT size=sizeof(struct Sosele);

while(f.Read(&sosea,size)==size)

{

for(int i=0;i<sosea.nr_orase;i++)

if(strcmp(sosea.orase[i],m_strOras)==0)

{

if(sosea.nr_orase>2)

{

for(int j=i;j<sosea.nr_orase-1;j++)

{

strcpy(sosea.orase[j],sosea.orase[j+1]);

}

sosea.nr_orase–;

f.Seek(-size,CFile::current);

f.Write(&sosea,size);

break;

}

else

{

LONG offset = f.Seek(-size,CFile::current);

f.Close();

CDlgStS dlg;

dlg.Stergere(sosea.orase[0],sosea.orase[1],sosea.lungime);

f.Open("sosele.aaa",CFile::modeReadWrite,&e); f.Seek(offset,CFile::begin);

break;

}

}

}

f.Close();

}

//DlgSterg.h :header file

#if !defined(AFX_DLGSTERG_H__F828DE01_D1E9_11D4_9AA9_9A59FBE9F050__INCLUDED_)

#define AFX_DLGSTERG_H__F828DE01_D1E9_11D4_9AA9_9A59FBE9F050__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// DlgSterg.h :

/////////////////////////////////////////////////////////////////////////////

// CDlgSterg dialog

class CDlgSterg : public CDialog

{

// Construction

public:

CString m_strOras;

void Stergere();

BOOL viz;

CDlgSterg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CDlgSterg)

enum { IDD = IDD_STERG };

CListCtrl m_lstSterg;

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CDlgSterg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(CDlgSterg)

virtual BOOL OnInitDialog();

virtual void OnOK();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_DLGSTERG_H__F828DE01_D1E9_11D4_9AA9_9A59FBE9F050__INCLUDED_)

// DlgStS.cpp : implementation file

#include "stdafx.h"

#include "Harta.h"

#include "DlgStS.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CDlgStS dialog

CDlgStS::CDlgStS(CWnd* pParent /*=NULL*/)

: CDialog(CDlgStS::IDD, pParent)

{

//{{AFX_DATA_INIT(CDlgStS)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

}

void CDlgStS::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CDlgStS)

DDX_Control(pDX, IDC_LIST_OR, m_lstOrase);

DDX_Control(pDX, IDOK, m_bttnSterg);

DDX_Control(pDX, IDC_LST_ST_S, m_ctlLst);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CDlgStS, CDialog)

//{{AFX_MSG_MAP(CDlgStS)

ON_NOTIFY(NM_CLICK, IDC_LST_ST_S, OnClickLstStS)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CDlgStS message handlers

BOOL CDlgStS::OnInitDialog()

{

CDialog::OnInitDialog();

CFile f;

CFileException e;

SOSELE sosea;

UINT nSize = sizeof(struct Sosele);

int nItem;

m_ctlLst.DeleteAllItems();

m_ctlLst.InsertColumn(0,"Oras sursa",LVCFMT_LEFT,85);

m_ctlLst.InsertColumn(1,"Oras destinatie",LVCFMT_LEFT,85);

m_ctlLst.InsertColumn(2,"Lungimea",LVCFMT_LEFT,58);

f.Open("sosele.aaa",CFile::modeRead,&e);

f.SeekToBegin();

CString str;

while(f.Read(&sosea,nSize) == nSize)

{

nItem = m_ctlLst.InsertItem(0,sosea.orase[0]);

m_ctlLst.SetItemText(nItem,1,sosea.orase[sosea.nr_orase-1]);

str.Format("%d",sosea.lungime);

m_ctlLst.SetItemText(nItem,2,str);

}

f.Close();

m_bttnSterg.EnableWindow(FALSE);

return TRUE; // return TRUE unless you set the focus to a control

// EXCEPTION: OCX Property Pages should return FALSE

}

void CDlgStS::Stergere(CString strS, CString strD,int lg)

{

CFile f;

CFileException e;

SOSELE sosea;

UINT nSize=sizeof(struct Sosele);

LONG lOff=0;

f.Open("sosele.aaa",CFile::modeReadWrite,&e);

f.SeekToBegin();

while(f.Read(&sosea,nSize) == nSize)

{

if((strcmp(sosea.orase[0],strS)==0)&&(strcmp(sosea.orase[sosea.nr_orase-1],strD)==0)

&& (lg == sosea.lungime))

break;

lOff+=nSize;

}

while(f.Read(&sosea,nSize) == nSize)

{

f.Seek(lOff,CFile::begin);

f.Write(&sosea,nSize);

lOff+=nSize;

f.Seek(lOff+nSize,CFile::begin);

}

f.SetLength(lOff);

}

void CDlgStS::OnOK()

{

if(AfxMessageBox("Vreti sa stergeti soseaua selectata?",MB_YESNO)==IDYES)

{

POSITION pos;

int nItem;

CString strS,strD;

int lg;

pos = m_ctlLst.GetFirstSelectedItemPosition();

while(pos)

{

nItem = m_ctlLst.GetNextSelectedItem(pos);

strS = m_ctlLst.GetItemText(nItem,0);

strD = m_ctlLst.GetItemText(nItem,1);

lg = atoi(LPCTSTR(m_ctlLst.GetItemText(nItem,2)));

Stergere(strS,strD,lg);

}

CDialog::OnOK();

}

}

void CDlgStS::OnClickLstStS(NMHDR* pNMHDR, LRESULT* pResult)

{

m_lstOrase.ResetContent();

POSITION pos;

int nItem;

CString strS,strD;

int lg;

pos = m_ctlLst.GetFirstSelectedItemPosition();

nItem = m_ctlLst.GetNextSelectedItem(pos);

strS = m_ctlLst.GetItemText(nItem,0);

strD = m_ctlLst.GetItemText(nItem,1);

lg = atoi(LPCTSTR(m_ctlLst.GetItemText(nItem,2)));

CFile f;

CFileException e;

SOSELE sosea;

UINT nSize=sizeof(struct Sosele);

f.Open("sosele.aaa",CFile::modeReadWrite,&e);

f.SeekToBegin();

while(f.Read(&sosea,nSize) == nSize)

{

if((strcmp(sosea.orase[0],strS)==0)&&(strcmp(sosea.orase[sosea.nr_orase-1],strD)==0)

&& (lg == sosea.lungime))

{

for(int i = 0;i<sosea.nr_orase;i++)

m_lstOrase.AddString(sosea.orase[i]);

break;

}

}

f.Close();

m_bttnSterg.EnableWindow();

*pResult = 0;

}

// DlgStS.h :header file

#if !defined(AFX_DLGSTS_H__F828DE02_D1E9_11D4_9AA9_9A59FBE9F050__INCLUDED_)

#define AFX_DLGSTS_H__F828DE02_D1E9_11D4_9AA9_9A59FBE9F050__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// DlgStS.h : header file

/////////////////////////////////////////////////////////////////////////////

// CDlgStS dialog

class CDlgStS : public CDialog

{

// Construction

public:

void Stergere(CString strS,CString strD,int lg);

CDlgStS(CWnd* pParent = NULL); // standard constructor

//{{AFX_DATA(CDlgStS)

enum { IDD = IDD_STERG_S };

CListBox m_lstOrase;

CButton m_bttnSterg;

CListCtrl m_ctlLst;

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CDlgStS)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(CDlgStS)

virtual BOOL OnInitDialog();

virtual void OnOK();

afx_msg void OnClickLstStS(NMHDR* pNMHDR, LRESULT* pResult);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_DLGSTS_H__F828DE02_D1E9_11D4_9AA9_9A59FBE9F050__INCLUDED_)

// Harta.cpp : Defines the class behaviors for the application.

#include "stdafx.h"

#include "Harta.h"

#include "HartaDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CHartaApp

BEGIN_MESSAGE_MAP(CHartaApp, CWinApp)

//{{AFX_MSG_MAP(CHartaApp)

// NOTE – the ClassWizard will add and remove mapping macros here.

// DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG

ON_COMMAND(ID_HELP, CWinApp::OnHelp)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CHartaApp construction

CHartaApp::CHartaApp()

{

// TODO: add construction code here,

// Place all significant initialization in InitInstance

}

/////////////////////////////////////////////////////////////////////////////

// The one and only CHartaApp object

CHartaApp theApp;

/////////////////////////////////////////////////////////////////////////////

// CHartaApp initialization

BOOL CHartaApp::InitInstance()

{

AfxEnableControlContainer();

// Standard initialization

// If you are not using these features and wish to reduce the size

// of your final executable, you should remove from the following

// the specific initialization routines you do not need.

#ifdef _AFXDLL

Enable3dControls(); // Call this when using MFC in a shared DLL

#else

Enable3dControlsStatic(); // Call this when linking to MFC statically

#endif

CHartaDlg dlg;

m_pMainWnd = &dlg;

int nResponse = dlg.DoModal();

if (nResponse == IDOK)

{

// TODO: Place code here to handle when the dialog is

// dismissed with OK

}

else if (nResponse == IDCANCEL)

{

// TODO: Place code here to handle when the dialog is

// dismissed with Cancel

}

// Since the dialog has been closed, return FALSE so that we exit the

// application, rather than start the application's message pump.

return FALSE;

}

// Harta.h : main header file for the HARTA application

#if !defined(AFX_HARTA_H__9803E565_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

#define AFX_HARTA_H__9803E565_D045_11D4_9AA9_89783E54EA4D__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#ifndef __AFXWIN_H__

#error include 'stdafx.h' before including this file for PCH

#endif

#include "resource.h" // main symbols

/////////////////////////////////////////////////////////////////////////////

// CHartaApp:

// See Harta.cpp for the implementation of this class

//

class CHartaApp : public CWinApp

{

public:

CHartaApp();

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CHartaApp)

public:

virtual BOOL InitInstance();

//}}AFX_VIRTUAL

// Implementation

//{{AFX_MSG(CHartaApp)

// NOTE – the ClassWizard will add and remove member functions here.

// DO NOT EDIT what you see in these blocks of generated code !

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

typedef struct Orase

{

char Nume[10];//nume orasului

int cx; //pozitia in pixeli pe Ox

char Par[10]; //paralela orasului

int cy; //pozitia in pixeli pe Oy

char Mer[10]; //sir de caractere pentru

//meridian

int Pop; //populatia

BOOL viz; //vizibil pe harta

char Path[10];//calea pentru harta oras

} ORASE;

typedef struct Sosele

{

char orase[15][15];//lista cu orasele

//prin care trece soseua

int nr_orase; //numarul de orase

int lungime; //lungimea soselei

} SOSELE;

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_HARTA_H__9803E565_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

// HartaDlg.cpp : implementation file

#include "stdafx.h"

#include "Harta.h"

#include "HartaDlg.h"

#include "OrasDlg.h"

#include "SosDlg.h"

#include "ListDlg.h"

#include "LSosDlg.h"

#include "DlgSterg.h"

#include "DlgStS.h"

#include "ModifOras.h"

#include "HartaOrasDlg.h"

#include "malloc.h"

#include "math.h"

#include "wingdi.h"//pt. functia care afiseaza bitmap

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CHartaDlg dialog

CHartaDlg::CHartaDlg(CWnd* pParent /*=NULL*/)

: CDialog(CHartaDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CHartaDlg)

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CHartaDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CHartaDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CHartaDlg, CDialog)

//{{AFX_MSG_MAP(CHartaDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_COMMAND(ID_ORASE_ADAUGA, OnOraseAdauga)

ON_COMMAND(ID_ORASE_AFISARELISTEI, OnOraseAfisarelistei)

ON_COMMAND(ID_SOSELE_ADAUGARE, OnSoseleAdaugare)

ON_COMMAND(ID_SOSELE_AFISARE, OnSoseleAfisare)

ON_COMMAND(ID_ORASE_STERGERE, OnOraseStergere)

ON_COMMAND(ID_SOSELE_STERGERE, OnSoseleStergere)

ON_COMMAND(IDD_MOD_ORASE, OnModOrase)

ON_WM_DESTROY()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CHartaDlg message handlers

BOOL CHartaDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About…" menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

CreateControls();//creem controale ActiveX coresp. oraselor

m_toolTip.Activate(TRUE);

EnableToolTips(TRUE);

return TRUE; // return TRUE unless you set the focus to a control

}

void CHartaDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CHartaDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() – cxIcon + 1) / 2;

int y = (rect.Height() – cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CFile f;

CFileException e;

f.Open("rom_map2.bmp",CFile::modeRead,&e);

CPaintDC cdc(this);

BITMAPFILEHEADER bfh;

BITMAPINFOHEADER bih;

BITMAPINFO binfo;

f.Read(&bfh,sizeof(BITMAPFILEHEADER));

f.Read(&binfo,sizeof(BITMAPINFO));

bih = binfo.bmiHeader;

BYTE* arr;

f.Seek(bfh.bfOffBits,CFile::begin);

arr = (BYTE*)malloc(bfh.bfSize-bfh.bfOffBits);

f.Read(arr,bfh.bfSize-bfh.bfOffBits);

SetDIBitsToDevice(cdc.GetSafeHdc(),0,0,bih.biWidth,bih.biHeight,

0,0,0,bih.biHeight,arr,&binfo,DIB_RGB_COLORS);

free(arr);

f.Close();

f.Open("sosele.aaa",CFile::modeRead,&e);

SOSELE sosea;

UINT size = sizeof(struct Sosele);

CPoint puncte[10];

CPen* pOldPen;

CPen pen(PS_SOLID,3,RGB(255,100,100));

pOldPen = (CPen*)cdc.SelectObject(&pen);

while(f.Read(&sosea,size)==size)

{

for(int i=0;i<sosea.nr_orase;i++)

{

puncte[i]=CautaOras(sosea.orase[i]);

}

cdc.Polyline(puncte,sosea.nr_orase);

}

cdc.SelectObject(pOldPen);

CDialog::OnPaint();

}

}

// The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CHartaDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

void CHartaDlg::OnOraseAdauga()

{

// TODO: Add your command handler code here

ORASE oras;

COrasDlg dlgOras;

CFile f;

CFileException e;

if(dlgOras.DoModal()==IDOK)

{

CString str;

str.Format("%dg %d' %d\"",dlgOras.m_nParal,dlgOras.m_nParalM,dlgOras.m_nParalS);

strcpy(oras.Par,str);

str.Format("%dg %d' %d\"",dlgOras.m_nMer,dlgOras.m_nMerM,dlgOras.m_nMerS);

strcpy(oras.Mer,str);

oras.cy = SecToPixelPar(dlgOras.m_nParal,dlgOras.m_nParalM,dlgOras.m_nParalS);

oras.cx = SecToPixelMer(dlgOras.m_nMer,dlgOras.m_nMerM,dlgOras.m_nMerS);

strcpy(oras.Nume,dlgOras.m_strNume);

strcpy(oras.Path,dlgOras.m_strPath);

oras.Pop = dlgOras.m_nPop;

oras.viz = dlgOras.m_bViz;

f.Open("orase.aaa",CFile::modeWrite,&e);

f.SeekToEnd();

f.Write(&oras,sizeof(struct Orase));

f.Close();

if(oras.viz)

{

CClientDC dc(this);

CSize lg = dc.GetTextExtent(oras.Nume);

CRect rect(CPoint(oras.cx,oras.cy),CSize(lg.cx+10,lg.cy)); m_linkCtrl[m_nrOrase].Create("",WS_VISIBLE,rect,this,1230+m_nrOrase);

m_linkCtrl[m_nrOrase].SetCaption(oras.Nume);

m_linkCtrl[m_nrOrase].SetPath(oras.Path);

CString toolText;

toolText.Format("Populatie: %d, Coordonate: %3.2f %3.2f",oras.Pop,oras.cx,oras.cy);

m_toolTip.AddTool(this,toolText,rect,1230+m_nrOrase++);

}

}

RedrawWindow();

}

void CHartaDlg::OnSoseleAdaugare()

{

// TODO: Add your command handler code here

CSosDlg sosea;

sosea.DoModal();

RedrawWindow();

}

void CHartaDlg::OnOraseAfisarelistei()

{

// TODO: Add your command handler code here

CListDlg lista; lista.DoModal();

}

void CHartaDlg::OnSoseleAfisare()

{

// TODO: Add your command handler code here

CLSosDlg sosDlg;

sosDlg.DoModal();}

void CHartaDlg::OnOraseStergere()

{

// TODO: Add your command handler code here

CDlgSterg dlg;

if(dlg.DoModal()==IDOK)//afisam dialog

{

if(dlg.viz==TRUE)

{

DestroyControls();

CreateControls();

}

RedrawWindow();

}

}

void CHartaDlg::OnSoseleStergere()

{

// TODO: Add your command handler code here

CDlgStS dlg;

dlg.DoModal();

RedrawWindow();

}

void CHartaDlg::OnModOrase()

{

CModifOras dlg;

if(dlg.DoModal()==IDOK)

{

DestroyControls();

CreateControls();

}

}

BOOL CHartaDlg::OnCommand(WPARAM wParam, LPARAM lParam)

{

// TODO: Add your specialized code here and/or call the base class

if(LOWORD(wParam)==LK_PRESSED)

{

CLincControl* ctrl = (CLincControl*)FromHandle((HWND)lParam);

CHartaOrasDlg dlg;

ctrl->Refresh();

if(!ctrl->GetPath().IsEmpty())

{

dlg.SetPath(ctrl->GetPath());

dlg.DoModal();

}

return TRUE;

}

return CDialog::OnCommand(wParam, lParam);

}

void CHartaDlg::CreateControls()

{

CRect rectHarta;

GetWindowRect(&rectHarta);

CDC* dc = GetDC();

CFile f;

CFileException e;

ORASE oras;

UINT size = sizeof(struct Orase);

m_nrOrase = 0;

f.Open("orase.aaa",CFile::modeRead,&e);

CString toolText;

while(f.Read(&oras,size)==size)

{

if(oras.viz)

{

CSize lg = dc->GetTextExtent(oras.Nume);

CRect rect(CPoint(oras.cx,oras.cy),CSize(lg.cx+10,lg.cy));

m_linkCtrl[m_nrOrase].Create("",WS_VISIBLE,rect,this,1230+m_nrOrase);

m_linkCtrl[m_nrOrase].SetCaption(oras.Nume);

CString path(oras.Path);

m_linkCtrl[m_nrOrase].SetPath(path);

toolText.Format("Populatie: %d, Coordonate: %3.2f %3.2f",oras.Pop,oras.cx,oras.cy);

m_toolTip.AddTool(this,toolText,rect,1230+m_nrOrase++);

}

}

f.Close();

}

void CHartaDlg::DestroyControls()

{

for(int i=0;i<m_nrOrase;i++)

{

int j = m_linkCtrl[i].GetDlgCtrlID();

if(m_toolTip.m_hWnd != NULL) m_toolTip.DelTool(this,m_linkCtrl[i].GetDlgCtrlID());

m_linkCtrl[i].DestroyWindow();

}

m_nrOrase = 0;

}

void CHartaDlg::OnDestroy()

{

// TODO: Add your message handler code here

DestroyControls();

m_toolTip.DestroyWindow();

CDialog::OnDestroy();

}

int CHartaDlg::SecToPixelMer(int gr, int min, int sec)

{

long dif = 3600*(gr-20) + 60*(min-15) +(sec-44);

return (18 + dif/70);

}

int CHartaDlg::SecToPixelPar(int gr, int min, int sec)

{

long dif = 3600*(48-gr) + 60*(15-min) +(6-sec);

return (30 + dif/49);

}

CPoint CHartaDlg::CautaOras(CString nume)

{

CFile f;

CFileException e;

f.Open("orase.aaa",CFile::modeRead,&e);

ORASE oras;

UINT size = sizeof(struct Orase);

while(f.Read(&oras,size)==size)

if(strcmp(oras.Nume,nume)==0)

return CPoint(oras.cx+5,oras.cy+8);

f.Close();

return CPoint(0,0);

}

int CHartaDlg::CalculateLength(int sx, int sy, int dx, int dy)

{

float mer = (abs(sy-dy)*70)*.02119;

float par = (abs(sx-dx)*49)*.03048;

return (int)sqrt(mer*mer + par*par);

}

// HartaDlg.h : header file

//{{AFX_INCLUDES()

#include "imgedit.h"

#include "LincControl.h"

//}}AFX_INCLUDES

#if !defined(AFX_HARTADLG_H__9803E567_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

#define AFX_HARTADLG_H__9803E567_D045_11D4_9AA9_89783E54EA4D__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////

// CHartaDlg dialog

class CHartaDlg : public CDialog

{

// Construction

public:

int CalculateLength(int sx,int sy,int dx, int dy);

void DestroyControls();

CHartaDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CHartaDlg)

enum { IDD = IDD_HARTA_DIALOG };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CHartaDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);

//}}AFX_VIRTUAL

// Implementation

protected:

CToolTipCtrl m_toolTip;

CLincControl m_linkCtrl[50];//controale coresp. oraselor vizibile

HICON m_hIcon;

// Generated message map functions

//{{AFX_MSG(CHartaDlg)

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

afx_msg void OnOraseAdauga();

afx_msg void OnOraseAfisarelistei();

afx_msg void OnSoseleAdaugare();

afx_msg void OnSoseleAfisare();

afx_msg void OnOraseStergere();

afx_msg void OnSoseleStergere();

afx_msg void OnModOrase();

afx_msg void OnDestroy();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

private:

CPoint CautaOras(CString nume);

int SecToPixelPar(int gr, int min, int sec);

int SecToPixelMer(int gr,int min,int sec);

int m_nrOrase;//nr oraselor vizualizate pe harta

void CreateControls();

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_HARTADLG_H__9803E567_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

// HartaOrasDlg.cpp : implementation file

#include "stdafx.h"

#include "Harta.h"

#include "HartaOrasDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CHartaOrasDlg dialog

CHartaOrasDlg::CHartaOrasDlg(CWnd* pParent /*=NULL*/)

: CDialog(CHartaOrasDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CHartaOrasDlg)

//}}AFX_DATA_INIT

}

void CHartaOrasDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CHartaOrasDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CHartaOrasDlg, CDialog)

//{{AFX_MSG_MAP(CHartaOrasDlg)

ON_WM_PAINT()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CHartaOrasDlg message handlers

BOOL CHartaOrasDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// TODO: Add extra initialization here

m_firstTime = TRUE;

return TRUE; // return TRUE unless you set the focus to a control

// EXCEPTION: OCX Property Pages should return FALSE

}

void CHartaOrasDlg::OnPaint()

{

CPaintDC cdc(this); // device context for painting

// TODO: Add your message handler code here

CFile f;

CFileException e;

if(f.Open(m_path,CFile::modeRead,&e)==0)

{

CString msg;

msg = "Nu pot deschide fisierul\n" + m_path;

MessageBox(msg,"Error");

return;

}

BITMAPFILEHEADER bfh;

BITMAPINFOHEADER bih;

BITMAPINFO binfo;

f.Read(&bfh,sizeof(BITMAPFILEHEADER));

f.Read(&binfo,sizeof(BITMAPINFO));

bih = binfo.bmiHeader;

BYTE* arr;

f.Seek(bfh.bfOffBits,CFile::begin);

arr = (BYTE*)malloc(bfh.bfSize-bfh.bfOffBits);

f.Read(arr,bfh.bfSize-bfh.bfOffBits);

if(m_firstTime==TRUE)

{

CRect rectDlg;

GetWindowRect(&rectDlg);

int cx = bih.biWidth;

int cy = bih.biHeight+25;

SetWindowPos(&wndTopMost,rectDlg.left,rectDlg.top,cx,cy,SWP_SHOWWINDOW);

m_firstTime = FALSE;

}

SetDIBitsToDevice(cdc.GetSafeHdc(),0,0,bih.biWidth,bih.biHeight,

0,0,0,bih.biHeight,arr,&binfo,DIB_RGB_COLORS);

free(arr);

f.Close();

// Do not call CDialog::OnPaint() for painting messages

}

void CHartaOrasDlg::SetPath(CString path)

{

m_path = path;

}

//HartaOrasDlg.h

#if !defined(AFX_HARTAORASDLG_H__D899CE14_29DC_11D5_9AAE_D092A3FA590B__INCLUDED_)

#define AFX_HARTAORASDLG_H__D899CE14_29DC_11D5_9AAE_D092A3FA590B__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// HartaOrasDlg.h : header file

//

/////////////////////////////////////////////////////////////////////////////

// CHartaOrasDlg dialog

class CHartaOrasDlg : public CDialog

{

// Construction

public:

void SetPath(CString path);

UINT m_nID;

CHartaOrasDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CHartaOrasDlg)

enum { IDD = IDD_HARTA_ORAS };

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CHartaOrasDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

private:

BOOL m_firstTime;

CString m_path;

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(CHartaOrasDlg)

virtual BOOL OnInitDialog();

afx_msg void OnPaint();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_HARTAORASDLG_H__D899CE14_29DC_11D5_9AAE_D092A3FA590B__INCLUDED_)

//linccontrol.cpp

// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++

// NOTE: Do not modify the contents of this file. If this class is regenerated by

// Microsoft Visual C++, your modifications will be overwritten.

#include "stdafx.h"

#include "linccontrol.h"

/////////////////////////////////////////////////////////////////////////////

// CLincControl

IMPLEMENT_DYNCREATE(CLincControl, CWnd)

/////////////////////////////////////////////////////////////////////////////

// CLincControl properties

CString CLincControl::GetCaption()

{

CString result;

GetProperty(0x1, VT_BSTR, (void*)&result);

return result;

}

void CLincControl::SetCaption(LPCTSTR propVal)

{

SetProperty(0x1, VT_BSTR, propVal);

}

CString CLincControl::GetPath()

{

CString result;

GetProperty(0x2, VT_BSTR, (void*)&result);

return result;

}

void CLincControl::SetPath(LPCTSTR propVal)

{

SetProperty(0x2, VT_BSTR, propVal);

}

/////////////////////////////////////////////////////////////////////////////

// CLincControl operations

void CLincControl::Refresh()

{

InvokeHelper(DISPID_REFRESH, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);

}

void CLincControl::AboutBox()

{

InvokeHelper(0xfffffdd8, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);

}

//linccontrol.h

// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++

// NOTE: Do not modify the contents of this file. If this class is regenerated by

// Microsoft Visual C++, your modifications will be overwritten.

/////////////////////////////////////////////////////////////////////////////

// CLincControl wrapper class

class CLincControl : public CWnd

{

protected:

DECLARE_DYNCREATE(CLincControl)

public:

CLSID const& GetClsid()

{

static CLSID const clsid

= { 0xff1a7f26, 0x2793, 0x11d5, { 0x9a, 0xab, 0xe9, 0x48, 0x2c, 0x52, 0x2a, 0xd } };

return clsid;

}

virtual BOOL Create(LPCTSTR lpszClassName,

LPCTSTR lpszWindowName, DWORD dwStyle,

const RECT& rect,

CWnd* pParentWnd, UINT nID,

CCreateContext* pContext = NULL)

{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }

BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,

const RECT& rect, CWnd* pParentWnd, UINT nID,

CFile* pPersist = NULL, BOOL bStorage = FALSE,

BSTR bstrLicKey = NULL)

{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,

pPersist, bStorage, bstrLicKey); }

// Attributes

public:

CString GetCaption();

void SetCaption(LPCTSTR);

CString GetPath();

void SetPath(LPCTSTR);

// Operations

public:

void Refresh();

void AboutBox();

};

// ListDlg.cpp : implementation file

//

#include "stdafx.h"

#include "Harta.h"

#include "ListDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CListDlg dialog

CListDlg::CListDlg(CWnd* pParent /*=NULL*/)

: CDialog(CListDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CListDlg)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

}

void CListDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CListDlg)

DDX_Control(pDX, IDC_LIST_ORASE, m_ctlLista);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CListDlg, CDialog)

//{{AFX_MSG_MAP(CListDlg)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CListDlg message handlers

BOOL CListDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// TODO: Add extra initialization here

CFile f;

CFileException e;

m_ctlLista.InsertColumn(0,"Nume",LVCFMT_LEFT,100);

m_ctlLista.InsertColumn(1,"Paralela",LVCFMT_LEFT,80);

m_ctlLista.InsertColumn(2,"Meridian",LVCFMT_LEFT,80);

m_ctlLista.InsertColumn(3,"Populatie",LVCFMT_CENTER,60);

m_ctlLista.InsertColumn(4,"Vizibil",LVCFMT_CENTER,50);

m_ctlLista.DeleteAllItems();

int nItem;

UINT nSize = sizeof(struct Orase);

ORASE oras;

CString str;

f.Open("orase.aaa",CFile::modeRead,&e);//deschidem BD "orase.aaa"

f.SeekToBegin();

while(f.Read(&oras,nSize) == nSize)//citim urmatoare inregistrare…

{

nItem = m_ctlLista.InsertItem(0,oras.Nume);

m_ctlLista.SetItemText(nItem,1,oras.Par);

m_ctlLista.SetItemText(nItem,2,oras.Mer);

str.Format("%d",oras.Pop);

m_ctlLista.SetItemText(nItem,3,str);

str.Format("%d",oras.viz);

m_ctlLista.SetItemText(nItem,4,str);

}

f.Close();

return TRUE; // return TRUE unless you set the focus to a control

// EXCEPTION: OCX Property Pages should return FALSE

}

//ListDlg.h

#if !defined(AFX_LISTDLG_H__9803E573_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

#define AFX_LISTDLG_H__9803E573_D045_11D4_9AA9_89783E54EA4D__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// ListDlg.h : header file

//

/////////////////////////////////////////////////////////////////////////////

// CListDlg dialog

class CListDlg : public CDialog

{

// Construction

public:

CListDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CListDlg)

enum { IDD = IDD_LIST_ORASE };

CListCtrl m_ctlLista;

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CListDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(CListDlg)

virtual BOOL OnInitDialog();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_LISTDLG_H__9803E573_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

// LSosDlg.cpp : implementation file

//

#include "stdafx.h"

#include "Harta.h"

#include "LSosDlg.h"

#include "stdlib.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CLSosDlg dialog

CLSosDlg::CLSosDlg(CWnd* pParent /*=NULL*/)

: CDialog(CLSosDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CLSosDlg)

// NOTE: the ClassWizard will add member initialization here

//}}AFX_DATA_INIT

}

void CLSosDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CLSosDlg)

DDX_Control(pDX, IDC_LIST_ORASE, m_lstOrase);

DDX_Control(pDX, IDC_LIST_SOS, m_ctlList);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CLSosDlg, CDialog)

//{{AFX_MSG_MAP(CLSosDlg)

ON_NOTIFY(NM_CLICK, IDC_LIST_SOS, OnClickListSos)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CLSosDlg message handlers

BOOL CLSosDlg::OnInitDialog()

{

CDialog::OnInitDialog();

m_ctlList.InsertColumn(0,"Oras sursa",LVCFMT_LEFT,120);

m_ctlList.InsertColumn(1,"Oras destinatie",LVCFMT_LEFT,120);

m_ctlList.InsertColumn(2,"Lungime",LVCFMT_CENTER,62);

m_ctlList.DeleteAllItems();

CFile f;

CFileException e;

SOSELE sosele;

int nItem;

CString str;

UINT nSize = sizeof(struct Sosele);

f.Open("sosele.aaa",CFile::modeRead,&e);

f.SeekToBegin();

while(f.Read(&sosele,nSize) == nSize)

{

nItem=m_ctlList.InsertItem(0,sosele.orase[0]);

m_ctlList.SetItemText(nItem,1,sosele.orase[sosele.nr_orase-1]);

str.Format("%d",sosele.lungime);

m_ctlList.SetItemText(nItem,2,str);

}

f.Close();

return TRUE; // return TRUE unless you set the focus to a control

// EXCEPTION: OCX Property Pages should return FALSE

}

void CLSosDlg::OnClickListSos(NMHDR* pNMHDR, LRESULT* pResult)

{

// TODO: Add your control notification handler code here

m_lstOrase.ResetContent();

CFile f;

CFileException e;

SOSELE sosele;

CString strS,strD;

int lg;

POSITION pos = m_ctlList.GetFirstSelectedItemPosition();

if(pos!=NULL)

{

int nItem = m_ctlList.GetNextSelectedItem(pos);

strS = m_ctlList.GetItemText(nItem,0);

strD = m_ctlList.GetItemText(nItem,1);

lg = atoi(LPCTSTR(m_ctlList.GetItemText(nItem,2)));

UINT nSize = sizeof(struct Sosele);

f.Open("sosele.aaa",CFile::modeRead,&e);

f.SeekToBegin();

while(f.Read(&sosele,nSize) == nSize)

{

if((strcmp(sosele.orase[0],strS)==0)&&(strcmp(sosele.orase[sosele.nr_orase-1],strD)==0)

&& (sosele.lungime == lg))

{

for(int i=1;i<sosele.nr_orase-1;i++)

m_lstOrase.AddString(sosele.orase[i]);

break;

}

}

f.Close();

}

*pResult = 0;

}

//LSosDlg.h

#if !defined(AFX_LSOSDLG_H__9803E575_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

#define AFX_LSOSDLG_H__9803E575_D045_11D4_9AA9_89783E54EA4D__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// LSosDlg.h : header file

//

/////////////////////////////////////////////////////////////////////////////

// CLSosDlg dialog

class CLSosDlg : public CDialog

{

// Construction

public:

CLSosDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CLSosDlg)

enum { IDD = IDD_LIST_SOS };

CListBox m_lstOrase;

CListCtrl m_ctlList;//var. pt. lista in care afisam sosele

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CLSosDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(CLSosDlg)

virtual BOOL OnInitDialog();

afx_msg void OnClickListSos(NMHDR* pNMHDR, LRESULT* pResult);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_LSOSDLG_H__9803E575_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

// ModifOras.cpp : implementation file

//

#include "stdafx.h"

#include "Harta.h"

#include "ModifOras.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CModifOras dialog

CModifOras::CModifOras(CWnd* pParent /*=NULL*/)

: CDialog(CModifOras::IDD, pParent)

{

//{{AFX_DATA_INIT(CModifOras)

m_nume = _T("");

m_viz = FALSE;

m_pop = 0;

m_modif = FALSE;

m_path = _T("");

//}}AFX_DATA_INIT

}

void CModifOras::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CModifOras)

DDX_Control(pDX, IDC_LISTA_ORASE, m_listOrase);

DDX_Text(pDX, IDC_MOD_NUME, m_nume);

DDX_Check(pDX, IDC_MOD_VIZ, m_viz);

DDX_Text(pDX, IDC_MOD_POP, m_pop);

DDX_Text(pDX, IDC_MOD_PATH, m_path);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CModifOras, CDialog)

//{{AFX_MSG_MAP(CModifOras)

ON_LBN_SELCHANGE(IDC_LISTA_ORASE, OnSelchangeListaOrase)

ON_EN_CHANGE(IDC_MOD_NUME, OnChangeModNume)

ON_EN_CHANGE(IDC_MOD_POP, OnChangeModPop)

ON_BN_CLICKED(IDC_MOD_VIZ, OnModViz)

ON_EN_CHANGE(IDC_MOD_PATH, OnChangeModPath)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CModifOras message handlers

BOOL CModifOras::OnInitDialog()

{

CDialog::OnInitDialog();

PopulListei();

m_listOrase.SetCurSel(0);

CString nume;

m_listOrase.GetText(0,nume);

CompletareDate(nume);

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control

// EXCEPTION: OCX Property Pages should return FALSE

}

void CModifOras::OnOK()

{

// TODO: Add extra validation here

SaveModif();

CDialog::OnOK();

}

void CModifOras::PopulListei()

{

CFile f;

CFileException e;

f.Open("orase.aaa",CFile::modeRead,&e);

f.SeekToBegin();

UINT size = sizeof(struct Orase);

ORASE oras;

m_listOrase.ResetContent();

while(f.Read(&oras,size)==size)

{

m_listOrase.AddString(oras.Nume);

}

f.Close();

}

void CModifOras::CompletareDate(CString oras)

{

CFile f;

CFileException e;

f.Open("orase.aaa",CFile::modeRead,&e);

f.SeekToBegin();

m_posCur = 0;

UINT size = sizeof(struct Orase);

while(f.Read(&m_orasCurent,size)==size){

if(m_orasCurent.Nume==oras)

{

m_nume = oras;

m_pop = m_orasCurent.Pop;

m_viz = m_orasCurent.viz;

m_path = m_orasCurent.Path;

break;//am gasit orasul cautat

}

m_posCur++;

}

UpdateData(FALSE);

f.Close();}

void CModifOras::OnSelchangeListaOrase()

{

// TODO: Add your control notification handler code here

if(m_modif)

{

SaveModif();

}

CString oras;

int pos = m_listOrase.GetCurSel();

PopulListei();

m_listOrase.SetCurSel(pos);

m_listOrase.GetText(pos,oras);

CompletareDate(oras);

}

void CModifOras::SaveModif()

{

if(!m_modif) return;

if(MessageBox("Salvati modificarile facute?","",MB_OKCANCEL)==IDOK)

{

CFile f;

CFileException e;

UpdateData();

strcpy(m_orasCurent.Nume,m_nume);

m_orasCurent.Pop = m_pop;

m_orasCurent.viz = m_viz;

strcpy(m_orasCurent.Path,m_path);

f.Open("orase.aaa",CFile::modeReadWrite,&e);

f.Seek((LONG)(m_posCur*sizeof(struct Orase)),CFile::begin);

f.Write(&m_orasCurent,sizeof(struct Orase));

f.Close();

}

m_modif = FALSE;

}

void CModifOras::OnChangeModNume()

{

// TODO: If this is a RICHEDIT control, the control will not

// send this notification unless you override the CDialog::OnInitDialog()

// function and call CRichEditCtrl().SetEventMask()

// with the ENM_CHANGE flag ORed into the mask.

// TODO: Add your control notification handler code here

m_modif = TRUE;

}

void CModifOras::OnChangeModPop()

{

// TODO: If this is a RICHEDIT control, the control will not

// send this notification unless you override the CDialog::OnInitDialog()

// function and call CRichEditCtrl().SetEventMask()

// with the ENM_CHANGE flag ORed into the mask.

// TODO: Add your control notification handler code here

m_modif = TRUE;

}

void CModifOras::OnModViz()

{

// TODO: Add your control notification handler code here

m_modif = TRUE;

}

void CModifOras::OnChangeModPath()

{

// TODO: If this is a RICHEDIT control, the control will not

// send this notification unless you override the CDialog::OnInitDialog()

// function and call CRichEditCtrl().SetEventMask()

// with the ENM_CHANGE flag ORed into the mask.

// TODO: Add your control notification handler code here

m_modif = TRUE;

}

//ModifOras.h

#if !defined(AFX_MODIFORAS_H__229A2741_2053_11D5_9AA9_F28868989B0A__INCLUDED_)

#define AFX_MODIFORAS_H__229A2741_2053_11D5_9AA9_F28868989B0A__INCLUDED_

#include "Harta.h" // Added by ClassView

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// ModifOras.h : header file

//

/////////////////////////////////////////////////////////////////////////////

// CModifOras dialog

class CModifOras : public CDialog

{

// Construction

public:

void SaveModif();

UINT m_posCur;

void CompletareDate(CString oras);

ORASE m_orasCurent;

BOOL m_modif;

void PopulListei();

CModifOras(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CModifOras)

enum { IDD = IDD_MOD_ORASE };

CListBox m_listOrase;

CString m_nume;

BOOL m_viz;

int m_pop;

CString m_path;

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CModifOras)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(CModifOras)

virtual BOOL OnInitDialog();

virtual void OnOK();

afx_msg void OnSelchangeListaOrase();

afx_msg void OnChangeModNume();

afx_msg void OnChangeModPop();

afx_msg void OnModViz();

afx_msg void OnChangeModPath();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MODIFORAS_H__229A2741_2053_11D5_9AA9_F28868989B0A__INCLUDED_)

// OrasDlg.cpp : implementation file

//

#include "stdafx.h"

#include "Harta.h"

#include "OrasDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// COrasDlg dialog

COrasDlg::COrasDlg(CWnd* pParent /*=NULL*/)

: CDialog(COrasDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(COrasDlg)

m_strNume = _T("");

m_strPath = _T("");

m_nPop = 0;

m_bViz = TRUE;

m_nMer = 0;

m_nMerM = 0;

m_nMerS = 0;

m_nParal = 0;

m_nParalM = 0;

m_nParalS = 0;

//}}AFX_DATA_INIT

}

void COrasDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(COrasDlg)

DDX_Text(pDX, IDC_NUME, m_strNume);

DDX_Text(pDX, IDC_PATH, m_strPath);

DDX_Text(pDX, IDC_POP, m_nPop);

DDX_Check(pDX, IDC_VIZ, m_bViz);

DDX_Text(pDX, IDC_MERID, m_nMer);

DDV_MinMaxInt(pDX, m_nMer, 20, 29);

DDX_Text(pDX, IDC_MERID_M, m_nMerM);

DDV_MinMaxInt(pDX, m_nMerM, 0, 59);

DDX_Text(pDX, IDC_MERID_S, m_nMerS);

DDV_MinMaxInt(pDX, m_nMerS, 0, 59);

DDX_Text(pDX, IDC_PARAL, m_nParal);

DDV_MinMaxInt(pDX, m_nParal, 43, 48);

DDX_Text(pDX, IDC_PARAL_M, m_nParalM);

DDV_MinMaxInt(pDX, m_nParalM, 0, 59);

DDX_Text(pDX, IDC_PARAL_S, m_nParalS);

DDV_MinMaxInt(pDX, m_nParalS, 0, 59);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(COrasDlg, CDialog)

//{{AFX_MSG_MAP(COrasDlg)

ON_BN_CLICKED(IDC_VIZ, OnViz)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// COrasDlg message handlers

void COrasDlg::OnViz()

{

// TODO: Add your control notification handler code here

UpdateData();

GetDlgItem(IDC_PATH)->EnableWindow(m_bViz);

if(!m_bViz) m_strPath="";

}

void COrasDlg::OnOK()

{

// TODO: Add extra validation here

CFile f;

CFileException e;

f.Open("orase.aaa",CFile::modeRead,&e);

UINT size = sizeof(struct Orase);

ORASE oras;

while(f.Read(&oras,size)==size)

if(strcmp(oras.Nume,m_strNume)==0)

{

AfxMessageBox("Orasul cu numele acesta deja este in lista!");

return;

}

f.Close();

CDialog::OnOK();

}

//OrasDlg.h

#if !defined(AFX_ORASDLG_H__9803E572_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

#define AFX_ORASDLG_H__9803E572_D045_11D4_9AA9_89783E54EA4D__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// OrasDlg.h : header file

//

/////////////////////////////////////////////////////////////////////////////

// COrasDlg dialog

class COrasDlg : public CDialog

{

// Construction

public:

COrasDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(COrasDlg)

enum { IDD = IDD_ADD_ORAS };

CString m_strNume;

CString m_strPath;

int m_nPop;

BOOL m_bViz;

int m_nMer;

int m_nMerM;

int m_nMerS;

int m_nParal;

int m_nParalM;

int m_nParalS;

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(COrasDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(COrasDlg)

afx_msg void OnViz();

virtual void OnOK();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_ORASDLG_H__9803E572_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

//resurce.h

//{{NO_DEPENDENCIES}}

// Microsoft Developer Studio generated include file.

// Used by Harta.rc

//

#define IDM_ABOUTBOX 0x0010

#define IDD_ABOUTBOX 100

#define IDS_ABOUTBOX 101

#define IDD_HARTA_DIALOG 102

#define IDR_MAINFRAME 128

#define IDR_MENU1 132

#define IDD_ADD_ORAS 133

#define IDD_LIST_ORASE 134

#define IDD_ADD_SOS 135

#define IDD_LIST_SOS 136

#define IDD_STERG 137

#define IDD_STERG_S 139

#define IDD_MOD_ORASE 140

#define IDB_BITMAP1 141

#define IDB_HARTA_BMP 144

#define IDD_HARTA_ORAS 147

#define IDB_BITMAP2 150

#define IDC_PICTURE 1000

#define IDC_NUME 1001

#define IDC_PARAL 1002

#define IDC_MERID 1003

#define IDC_POP 1004

#define IDC_PATH 1005

#define IDC_VIZ 1006

#define IDC_LIST_ORASE 1007

#define IDC_PARAL_S 1007

#define IDC_SUR 1008

#define IDC_PARAL_M 1008

#define IDC_DEST 1009

#define IDC_MERID_S 1009

#define IDC_HLP 1010

#define IDC_MERID_M 1010

#define IDC_LIST_SOS 1011

#define IDC_HLP_ST_O 1012

#define IDC_LST_ST_O 1013

#define IDC_HLP_ST_S 1014

#define IDC_LST_ST_S 1016

#define IDC_MOD_NUME 1018

#define IDC_LISTA_ORASE 1019

#define IDC_MOD_POP 1020

#define IDC_MOD_VIZ 1021

#define IDC_MOD_PATH 1022

#define IDC_LIST_SOSEA 1028

#define IDC_ADAUGA 1029

#define IDC_STERGE 1030

#define IDC_STERGE_TOT 1031

#define IDC_LIST_OR 1031

#define ID_ORASE_ADAUGA 32771

#define ID_ORASE_AFISARELISTEI 32772

#define ID_SOSELE_ADAUGARE 32773

#define ID_SOSELE_AFISARE 32774

#define ID_ORASE_STERGERE 32775

#define ID_SOSELE_STERGERE 32776

// Next default values for new objects

//

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE 162

#define _APS_NEXT_COMMAND_VALUE 32777

#define _APS_NEXT_CONTROL_VALUE 1032

#define _APS_NEXT_SYMED_VALUE 101

#endif

#endif

// SosDlg.cpp : implementation file

//

#include "stdafx.h"

#include "string.h"

#include "Harta.h"

#include "SosDlg.h"

#include "HartaDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CSosDlg dialog

CSosDlg::CSosDlg(CWnd* pParent /*=NULL*/)

: CDialog(CSosDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CSosDlg)

//}}AFX_DATA_INIT

}

void CSosDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CSosDlg)

DDX_Control(pDX, IDC_STERGE_TOT, m_bttnStergeTot);

DDX_Control(pDX, IDC_STERGE, m_bttnSterge);

DDX_Control(pDX, IDC_LIST_SOSEA, m_lstSosea);

DDX_Control(pDX, IDC_LIST_ORASE, m_lstOrase);

DDX_Control(pDX, IDC_ADAUGA, m_bttnAdauga);

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CSosDlg, CDialog)

//{{AFX_MSG_MAP(CSosDlg)

ON_BN_CLICKED(IDC_ADAUGA, OnAdauga)

ON_BN_CLICKED(IDC_STERGE, OnSterge)

ON_BN_CLICKED(IDC_STERGE_TOT, OnStergeTot)

ON_LBN_SELCHANGE(IDC_LIST_SOSEA, OnSelchangeListSosea)

ON_LBN_SELCHANGE(IDC_LIST_ORASE, OnSelchangeListOrase)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CSosDlg message handlers

BOOL CSosDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// TODO: Add extra initialization here

CFile f;

CFileException e;

//completam lista cu orase existente

m_lstOrase.ResetContent();

m_lstSosea.ResetContent();/

m_bttnAdauga.EnableWindow(FALSE); m_bttnSterge.EnableWindow(FALSE);

m_bttnStergeTot.EnableWindow(FALSE);

ORASE oras;

UINT nSize = sizeof(struct Orase);

f.Open("orase.aaa",CFile::modeRead,&e);

f.SeekToBegin();

while(f.Read(&oras,nSize) == nSize)

{

m_lstOrase.AddString(oras.Nume);

}

f.Close();

return TRUE; // return TRUE unless you set the focus to a control

// EXCEPTION: OCX Property Pages should return FALSE

}

void CSosDlg::OnOK()

{

// TODO: Add extra validation here

UpdateData();

int nr = m_lstSosea.GetCount();

if(nr<2)//ac. nr trebuie sa fie >= 2

{

AfxMessageBox("Trebuie sa specificati cel putin doua orase!");

}

else

{

if(Verificare() == TRUE)

{

CFile f;

CFileException e;

f.Open("sosele.aaa",CFile::modeWrite,&e);

SOSELE sosele;

CString str;

CPoint puncte[20];

int l=0;

for(int i=0;i<nr;i++)

{

CFile file;

CFileException e;

file.Open("orase.aaa",CFile::modeRead,&e);

ORASE oras;

UINT size = sizeof(struct Orase);

m_lstSosea.GetText(i,str);

while(file.Read(&oras,size)==size)

{

if(strcmp(oras.Nume,str)==0)

{

puncte[l++]=CPoint(oras.cx,oras.cy);

break;

}

}

file.Close();

}

CHartaDlg dlg;

sosele.lungime=0;

for(i=0;i<l-1;i++)

{

sosele.lungime+=dlg.CalculateLength(puncte[i].x,puncte[i].y,

puncte[i+1].x,puncte[i+1].y);

}

for(i=0;i<nr;i++)

{

m_lstSosea.GetText(i,str);

strcpy(sosele.orase[i],str);

}

sosele.nr_orase = nr;

f.SeekToEnd();

f.Write(&sosele,sizeof(struct Sosele));

f.Close();

CDialog::OnOK();

}

else

AfxMessageBox("Aceasta sosea exista");

}

}

BOOL CSosDlg::Verificare()

{

CFile f;

CFileException e;

f.Open("sosele.aaa",CFile::modeRead,&e);

SOSELE sosea;

UINT size = sizeof(struct Sosele);

int nr = m_lstSosea.GetCount();

while(f.Read(&sosea,size)==size)

if(sosea.nr_orase == nr)

{

CString str,strInv;

for(int i=0;i<nr;i++)

{

m_lstSosea.GetText(i,str);

m_lstSosea.GetText(nr-i-1,strInv);

if(strcmp(sosea.orase[i],str)!=0 &&

strcmp(sosea.orase[i],strInv)!=0)

break;

}

if(i==nr)

return FALSE;

}

return TRUE;

}

void CSosDlg::OnAdauga()

{

// TODO: Add your control notification handler code here

int nr = m_lstOrase.GetCurSel();

if(nr == LB_ERR)

{

AfxMessageBox("Trebuie sa selectati un oras din lista cu orase existente");

return;

}

CString oras;

m_lstOrase.GetText(nr,oras);

m_lstOrase.DeleteString(nr);

if(m_lstSosea.GetCount()==0)

m_bttnStergeTot.EnableWindow();

m_lstSosea.AddString(oras);

m_bttnAdauga.EnableWindow(FALSE);

}

void CSosDlg::OnSterge()

{

// TODO: Add your control notification handler code here

int nr = m_lstSosea.GetCurSel();

CString str;

m_lstSosea.GetText(nr,str);

m_lstSosea.DeleteString(nr);

m_lstOrase.AddString(str);

if(m_lstSosea.GetCount()==0)

{

m_bttnStergeTot.EnableWindow(FALSE);

m_bttnSterge.EnableWindow(FALSE);

}

}

void CSosDlg::OnStergeTot()

{

// TODO: Add your control notification handler code here

CString str;

for(int i=0;i<m_lstSosea.GetCount();i++)

{

m_lstSosea.GetText(i,str);

m_lstOrase.AddString(str);

}

m_lstSosea.ResetContent();

m_bttnStergeTot.EnableWindow(FALSE);

m_bttnSterge.EnableWindow(FALSE);

}

void CSosDlg::OnSelchangeListSosea()

{

// TODO: Add your control notification handler code here

if(!m_bttnSterge.IsWindowEnabled())

m_bttnSterge.EnableWindow();

if(m_bttnAdauga.IsWindowEnabled())

m_bttnAdauga.EnableWindow(FALSE);

}

void CSosDlg::OnSelchangeListOrase()

{

// TODO: Add your control notification handler code here

if(!m_bttnAdauga.IsWindowEnabled())

m_bttnAdauga.EnableWindow();

if(m_bttnSterge.IsWindowEnabled())

m_bttnSterge.EnableWindow(FALSE);

}

//SosDlg.h

#if !defined(AFX_SOSDLG_H__9803E574_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

#define AFX_SOSDLG_H__9803E574_D045_11D4_9AA9_89783E54EA4D__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

// SosDlg.h : header file

//

/////////////////////////////////////////////////////////////////////////////

// CSosDlg dialog

class CSosDlg : public CDialog

{

// Construction

public:

BOOL Verificare();

CSosDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data

//{{AFX_DATA(CSosDlg)

enum { IDD = IDD_ADD_SOS };

CButton m_bttnStergeTot;

CButton m_bttnSterge;

CListBox m_lstSosea;

CListBox m_lstOrase;

CButton m_bttnAdauga;

//}}AFX_DATA

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CSosDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

// Generated message map functions

//{{AFX_MSG(CSosDlg)

virtual BOOL OnInitDialog();

virtual void OnOK();

afx_msg void OnAdauga();

afx_msg void OnSterge();

afx_msg void OnStergeTot();

afx_msg void OnSelchangeListSosea();

afx_msg void OnSelchangeListOrase();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_SOSDLG_H__9803E574_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

// stdafx.cpp : source file that includes just the standard includes

// Harta.pch will be the pre-compiled header

// stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

// stdafx.h : include file for standard system include files,

// or project specific include files that are used frequently, but

// are changed infrequently

//

#if !defined(AFX_STDAFX_H__9803E569_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

#define AFX_STDAFX_H__9803E569_D045_11D4_9AA9_89783E54EA4D__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers

#include <afxwin.h> // MFC core and standard components

#include <afxext.h> // MFC extensions

#include <afxdisp.h> // MFC Automation classes

#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls

#ifndef _AFX_NO_AFXCMN_SUPPORT

#include <afxcmn.h> // MFC support for Windows Common Controls

#endif // _AFX_NO_AFXCMN_SUPPORT

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__9803E569_D045_11D4_9AA9_89783E54EA4D__INCLUDED_)

B I B L I O G R A F I E :

1."Grafica interactivă " – I. Dumitrescu ș.a.

Ed. Universității Ploiești, Ploiești 1993

2."O introducere în GIS" – Andrew Williams, Kingston College

3."Un proiect de istorie a GIS" – www.geog.buffalo.edu/ncgia/gishist/

4."Introduction to GIS" – THE KINGSTON UNIVERSITY

GIS – Professional Training Programme

5."Ce este GIS ?" – www.esri.com/library/gis/index.html

6."GIS și datele geospatiale"- Dr Munir Morad, Kingston University

7."O aplicație editor de imagine în Visual C++, pentru geografie"

Autor: Nichita Ion Mihail, Îndrumător: Dorel Dușmănescu

Sesiunea de comunicari stiintifice UPG Ploiesti, Mai 2001 Ploiesti

8. Utilizare Visual C++ 6 – Jon Bates, Tim Tompkins Editura Teora

Similar Posts