fisiere in formatul KML (standard Google) Arad 2017 – LISTA FIGURILOR Figura 2-1 Crearea aplicațiilor în Visual… [303991]
UNIVERSITATEA DE VEST “VASILE GOLDIȘ”
ARAD
FACULTATEA DE ȘTIINTE ECONOMICE INFORMATICĂ ȘI INGINERIE
LUCRARE DE LICENȚĂ
Program informatic de generare
fisiere in formatul KML (standard Google)
Arad
2017 –
LISTA FIGURILOR
Figura 2-1 Crearea aplicațiilor în Visual C#…………………………………………………………5
Figura 3-1 Cuvinte cheie în C#…………………………………………………………………………..8
Figura 3-2 Cuvinte cheie contextuale în C#…………………………………………………………10
Figura 3-3 Crearea unui fișier KML in Google Maps……………………….……….10
Figura 4-1 Crearea mărcilor de poziție în Google Earth……………….….…………14
Figura 4-2 Crearea de poligoane în Google Earth……………………..…………….15
Figura 4-3 Crearea căilor in Google Earth…………………………………………………………..16
Figura 4-4 Salvarea fișierelor KML in Google Earth…………………..…………….17
Figura 4-5 Salvarea fișierelor KML in Google Earth…………………..…………….18
Figura 4-6 Accesarea pe suportul SQL…………………….………………..………..25
Figura 4-7 Rezultat după rularea fișierului KML in Google Earth………..…………43
Figura 4-8 Reprezentarea grafică a fișierului KML in Google Earth….……..………43
CUVÂNT ÎNAINTE
Această lucrare reprezintă lucrarea de licență în cadrul UNIVERSITĂȚII DE VEST „VASILE GOLDIȘ”, [anonimizat].
Detalii despre fisiere KML in formatul Google standard. KML (Keyhole Markup Language) este un format de fișier bazat pe XML folosit pentru a [anonimizat], [anonimizat].
[anonimizat] o hartă. You can either email it to friends or you can upload it to Google Maps (Google My Maps feature) and share it with everyone. Putem să o trimitem prin e-mail prietenilor sau să o încărcam în Hărți Google (caracteristica Hărți Google My) și să o distribuim tuturor.
Din februarie 2015, [anonimizat]://maps.google.com/ – nu vor mai încărca fișiere KML / [anonimizat]. However, we know that KML files are a [anonimizat]'[anonimizat] . [anonimizat] o modalitate foarte utilă de a [anonimizat]-[anonimizat] (lat, long).
[anonimizat], [anonimizat] , optimizari de directii de mers reprezentate grafic.
INTRODUCERE
Descriere
Aplicatia de generare fisiere KML in formatul Google standard.
Din februarie 2015, [anonimizat]://maps.google.com/ – nu vor mai încărca fișiere KML / [anonimizat]. However, we know that KML files are a [anonimizat]'[anonimizat] . [anonimizat] o modalitate foarte utilă de a lucra cu datele geografice. S-a adăugat KML în Google My Maps.
Generarea unui astfel de standard era necesara la nivel mondial, conform coordonatelor si standardelor GPS (lat,long).
Figura – Aplicația Google Earth
DESPRE FORMATUL KML + Google
KML (Keyhole Markup Language) este un format de fișier bazat pe XML folosit pentru a afișa date geografice într-un browser Earth, cum ar fi Google Earth, Google Maps și Google Maps for mobile.
Standardul KMLGoogle My Maps este un instrument puternic pentru crearea cu ușurință a hărților personalizate pentru partajarea și publicarea online. You can upload a KML file to My Maps, and display the map on your site with a simple HTML Embed code. Putem să încărcam un fișier KML în Hărțile mele se afișează harta pe site printr-un cod HTML simplu de încorporat. Consider using My Maps if: Se ia în considerare utilizarea My Maps dacă:
Your data changes infrequently. Datele se modifică rar.
You'd like access to a simple, WYSIWYG map editor. Se dorește accesarea unui simplu editor de hărți.
Your site displays fewer than 2500 maps per day. Site-ul afișează mai puțin de 2500 de hărți pe zi.
PROCESE NECESARE PENTRU A GENERA FIȘIERUL KML
Aplicația este scrisa in limbajul de programare c# si poate genera un fisier kml in standardul Google.Pentru a genera acest fisier KML in standardul Google ne trebuie o baza de date de la furnizorul de GPS sau provider.
Sau doar de un exemplu de baze de date cu coordonate GPS.Aceasta baza de date se poate popula prin serviciu api de date de la providerul de GPS.Neaparat aceasta baza de date sub forma unui trajectory Data, care contine cronologic coordonatele gps a unei masini, ne va furniza o traiectorie cat mai precisa a masinii urmarite.
Va urma putin mai jos un exemplu de baza de date si un format de baza de date furnizat de provider.
TEHNOLOGIE ȘI PROVENIENȚĂ
Tehnologia Microsoft
Microsoft Windows este numele unei serii de sisteme de operare create de compania Microsoft. Microsoft a introdus Windows pe piață pentru prima dată în noiembrie 1985, ca un supliment la MS-DOS, deoarece interfețele grafice erau din ce in ce mai apreciate. Microsoft Windows a ajuns cu timpul să predomine pe piața de calculatoare mici, întrecând Mac OS, care fusese introdus pe piață mai înainte de către compania Apple Computers, astăzi numită Apple Inc.. La conferința IDC Directions din 2004, vicepreședintele IDC a constatat că Windows deține aproximativ 90 % din piața de sisteme de operare.
Visual Studio2015
Visual Studio include un set complet de instrumente de dezvoltare pentru generarea de aplicații ASP.NET, Servicii Web XML, aplicații desktop și aplicații mobile. Visual Basic, Visual C++, Visual C# și Visual J# toate folosesc același mediu de dezvoltare integrat (IDE) care le permite partajarea instrumentelor și facilitează crearea de soluții folosind mai multe limbaje de programare. Aceste limbaje permit să beneficieze de caracteristicile .NET Framework care oferă acces la tehnologii cheie care simplifica dezvoltarea de aplicații web ASP și XML Web Services cu Visual Web Developer.
Limbajul C#
Limbajul C# a fost dezvoltat de o echipă restrânsă de ingineri de la Microsoft, echipă din care s-a evidențiat Anders Hejlsberg (autorul limbajului Turbo Pascal și membru al echipei care a proiectat Borland Delphi). C# este un limbaj simplu, cu circa 80 de cuvinte cheie și 12 tipuri de date predefinite. El permite programarea structurată, modulară și orientată obiectual, conform perceptelor moderne ale programării profesioniste.
Principiile de bază ale programării orientate pe obiecte (ÎNCAPSULARE, MOȘTENIRE, POLIMORFISM) sunt elemente fundamentale ale programării C#. În mare, limbajul moștenește sintaxa și principiile de programare din C++. Sunt o serie de tipuri noi de date sau funcțiuni diferite ale datelor din C++, iar în spiritul realizării unor secvențe de cod sigure (safe), unele funcțiuni au fost adăugate (de exemplu, interfețe și delegări), diversificate (tipul struct), modificate (tipul string) sau chiar eliminate (moștenirea multiplă și pointerii către funcții). Unele funcțiuni (cum ar fi accesuldirect la memorie folosind pointeri) au fost păstrate, dar secvențele de cod corespunzătoare se consideră „nesigure”.
Crearea aplicațiilor consolă
Pentru a realiza aplicații consolă (ca și cele din Borland Pascal sau Borland C) în mediul de dezvoltare Visual Studio, trebuie să instalăm o versiune a acestuia, eventual mediul free Microsoft Visual C# 2008 Express Edition de la adresa http://www.microsoft.com/express/download/
După lansarea aplicației, din meniul File se alege opțiunea NewProject apoi alegem ConsoleApplication, modificând numele aplicației în caseta Name:
Figura – Crearea aplicațiilor în Visual C#
Structura unui program C#
Majoritatea cărților care tratează limbaje de programare încep cu un exemplu, devenit celebru, apărut pentru prima dată în ediția din 1978 a cărții „The C Programming Language” a lui Brian W. Kernighan și Dennis M. Ritchie, „părinții” limbajului C. Vom prezenta și noi acest exemplu adaptat la limbajul C#.
O aplicație C# este formată din una sau mai multe clase, grupate în spații de nume (namespaces). Este obligatoriu ca doar una din aceste clase să conțină un „punct de intrare” (entry point), și anume metoda (funcția) Main.
Clasa (class), în termeni simplificați, reprezintă principalul element structural și de organizare în limbajele orientate spre obiecte, grupând date cât și funcții care prelucrează respectivele date. Spațiul de nume (Namespaces): din rațiuni practice, programele mari, sunt divizate în module, dezvoltate separat, de mai multe persoane.
Din acest motiv, există posibilitatea de a apărea identificatori cu același nume. Pentru a evita erori furnizate din acest motiv, în 1955 limbajul C++ introduce noțiunea și cuvântul cheie namespace. Fiecare mulțime de definiții dintr-o librărie sau program este grupată într-un spațiu de nume, existând astfel posibilitatea de a avea într-un program definiții cu nume identic, dar situate în alte spații de nume.
În cazul în care, într-o aplicație, unele clase sunt deja definite, ele se pot folosi importând spațiile de nume care conțin definițiile acestora. Mai menționăm faptul că un spațiu de nume poate conține mai multe spații de nume.
Cuvinte cheie în C#
Cuvintele cheie sunt identificatori predefiniți cu semnificație specială pentru compilator. Definim în C# următoarele cuvinte cheie:
Figura – Cuvinte cheie în C#
Pentru a da semnificații specifice codului, în C# avem și cuvinte cheie contextuale:
Figura – Cuvinte cheie contextuale în C#
În general, cuvintele cheie nu pot fi folosite în programele pe care le scriem, dându-le o altă semnificație. În cazul în care, totuși, dorim să le dăm o altă semnificație, va trebui să le scriem cu simbolul „@” ca prefix. Datorită neclarităților care pot să apară, se va evita folosirea cuvintelor rezervate în alte scopuri.
SQL Server
În funcție de volumul activităților implicate de administrarea unei baze de date SQL, sarcinile de administrare pot fi repartizate pe mai multe categorii de utilizatori ai bazei de date. Administratorul bazei de date (DBA) este, în funcție de complexitatea și mărimea unei baze de date, o persoană sau mai multe persoane, care să execute următoarele sarcini administrative:
• Instalarea și dezvoltarea sever-ului SQL;
• Alocarea memoriei sistemului și planificarea cerințelor viitoare de memorie ale acestuia;
• Crearea bazei de date și a obiectelor acesteia (tabele, viziuni, indecși);
• Modificarea structurii bazei de date în funcție de cerințele dezvoltatorilor de aplicații;
• Definirea utilizatorilor bazei de date și întreținerea sistemului de securitate;
• Controlul și monitorizarea accesului utilizatorilor la baza de date;
• Monitorizarea și optimizarea performanțelor bazei de date;
• Definirea și asigurarea politicii de salvarea sau copiere (backup) și refacere (recovery) a bazei de date;
• Arhivarea datelor;
• Asigurarea legăturii cu firma pentru suportul tehnic și licența de utilizare a produselor SQL. Dezvoltatorii de aplicații proiectează și implementează aplicații cu baze de date SQL, executând următoarele sarcini:
• Proiectarea și dezvoltarea unei aplicații, precum și a structurilor de date ale acesteia;
• Estimarea cerințelor de memorie pentru aplicație; • Definirea modificărilor structurilor de date ale unei aplicații;
• Transmiterea tuturor informațiilor despre activitățile de mai sus către administratorul bazei de date;
• Stabilirea măsurilor de securitate pentru aplicație. Administratorul de aplicații se ocupă cu administrarea unei aplicații.
Utilizatorii finali ai bazei de date au acces la baza de date prin intermediul unei aplicații sau a instrumentelor SQL, executând în special următoarele activități:
• Adăugarea, modificarea și ștergerea datelor din baza de date în concordanță cu drepturile de acces pe care le are;
• Generarea unor rapoarte cu datele din baza de date. Administratorul de rețea este responsabil cu administrarea produselor SQL de rețea. Pentru a putea executa sarcinile de administrare a unei baze de date o persoană trebuie să aibă privilegii (drepturi) atât la nivelul bazei de date SQL, cât și la nivelul sistemului de operare al serverului pe care se află baza de date. Prin urmare un administrator trebuie să aibă:
• Cont de administrator pentru sistemul de operare, care să-i permită să execute comenzile sistemului de operare;
• Cont de administrator SQL definit de două conturi de utilizator (SYS și SYSTEM cu parolele CHANGE_OF_INSTALL și respectiv MANAGER);
• Rol de DBA, care este creat automat la momentul creării unei baze de date SQL. Acest rol conține toate privilegiile bazei de date SQL. Datorită faptului că un administrator execută activități pe care un utilizator obișnuit nu le poate executa este necesar ca acesta să poată fi autentificat înainte de a executa activitățile de administrare. Pentru autentificarea administratorului există două metode: autentificarea folosind sistemul de operare și autentificarea folosind fișierul de parole.
Autentificarea folosind sistemul de operare se face utilizând două conturi de administrator: OSOPER (sub care poate executa STARTUP, SHUTDOWN, ALTER DATABASE OPEN/MOUNT, ALTER DATABASE BACKUP, ARCHIVELOG și RECOVER) și contul OSDBA (care conține toate privilegiile de sistem cu opțiunea ADMIN OPTION, precum și rolul OSOPER). Sub contul OSDBA se poate executa comanda CREATE DATABASE. Autentificarea folosind fișierul de parole permite definirea parolelor de acces pentru fiecare utilizator. După stabilirea unui utilizator ca administrator, de exemplu utilizatorul SCOTT cu parola TIGER, acestuia îi va fi atribuit unul din privilegiile SYSDBA sau SYSOPER, cu comanda GRANT.
După aceasta utilizatorul SCOTT se va conecta la baza de date ca SYSDBA sau SYSOPER cu comanda CONNECT. Exemplu: GRANT SYSDBA TO scott GRANT SYSOPER TO scott CONNECT scott/tiger AS SYSDBA CONNECT scott/tiger AS SYSOPER Administrarea fișierului cu parole include operațiile de definire a fișierului cu parole, setarea parametrului de inițializare a bazei de date REMOTE_LOGIN_PASSWORDFILE, adăugarea de utilizatori în acest fișier și întreținerea fișierului cu parole.
Crearea fișierului cu parole se execută cu utilitarul ORAPWD, care are trei parametrii: FILE, PASSWORD și ENTRIES, dintre care primii doi sunt obligatorii, iar ultimul este opțional. Acești parametrii definesc numele fișierului cu parole, parola pentru utilizatorul SYS și respectiv numărul de utilizatori care pot executa activități de administrator (DBA). Setarea parametrului de inițializare REMOTE_LOGIN_PASSWORDFILE cu una din valorile NONE, EXCLUSIVE și SHARED permite utilizarea fișierului cu parole.
Valoarea NONE determină ca baza de date SQL să funcționeze fără fișier de parole, valoarea EXCLUSIVE determină ca fișierul de parole să fie folosit exclusiv de către o singură bază de date, iar valoare SHARED determină ca fișierul de parole să fie folosit de către mai multe baze de date.
Pentru a avea un grad mare de securitate pentru baza de date, va trebui ca imediat după crearea fișierului cu parole parametrul de inițializare REMOTE_LOGIN_PASSWORDFILE să fie setat pe valoarea EXCLUSIVE. Adăugarea de utilizatori în fișierul cu parole se face la momentul atribuirii privilegiilor SYSDBA sau SYSOPER unui anumit utilizator.
Exemplu:
1. Se creează fișierul cu parole conform indicațiilor de mai sus;
2. Se setează parametrul de inițializare REMOTE_LOGIN_PASSWORDFILE cu valoarea EXCLUSIVE;
3. Se conectează utilizatorul SYS, cu parola CHANGE_OF_INSTALL ca SYSDBA folosind comanda CONNECT SYS/change_of_install AS SYSDBA
4. Se pornește o instanță și se creează o bază de date, dacă este necesar, sau se montează și se deschide o bază de date existentă;
5. Se creează utilizatorii care se doresc a fi administratori și care să fie adăugați în fișierul cu parole, folosind comanda CREATE USER user1 IDENTIFIED BY parola1
6. Se atribuie unul din privilegiile SYSDBA sau SYSOPER acestui utilizator cu una din comenzile: GRANT SYSDBA TO user1 sau GRANT SYSOPER TO user1
7. Utilizatorul USER1 este adăugat în fișierul cu parole și se poate conecta acum ca SYSDBA sau SYSOPER cu acest nume de utilizator în loc de numele SYS, folosind una din comenzile: CONNECT USER1/parola1 AS SYSDBA sau CONNECT USER1/parola1 AS SYSOPER .
Listarea membrilor fișierului cu parole se face din viziunea $PWFILE_USERS folosind comanda SELECT * FROM V$PWFILE_USERS Întreținerea fișierului cu parole se referă la executarea activităților de extindere, relocare, ștergere sau schimbare a stării acestui fișier.
Descrierea aplicației
Prezentare generală fișiere KML
Noțiuni de bază
KML (Keyhole Markup Language) este un format de fișier bazat pe XML folosit pentru a afișa date geografice într-un browser Earth, cum ar fi Google Earth, Google Maps și Google Maps for mobile. With KML, you can display pretty much everything on a map. Cu KML, se poate afișa aproape totul pe o hartă. You can either email it to friends or you can upload it to Google Maps (Google My Maps feature) and share it with everyone. Se poate trimite prin e-mail prietenilor sau încărca în Hărți Google (caracteristica Hărți Google My) , ulterior distribuită tuturor. But best of all, you can upload the file to an online host, and use the KMLs to be displayed on any of your custom maps (ie on your blogs, websites, etc). Dar, cel mai bine, se încărca fișierul într-o gazdă online unde se utilizează fișierele KML pentru a fi afișate pe oricare dintre hărțile personalizate (adică pe blogurile, site-urile dvs. web etc.). This way, you can customize the maps' look & feel and its behaviour to suit your needs. În acest fel, se personalizează aspectul și simțul hărților și comportamentul acestuia pentru a se potrivi nevoilor utilizatorilor.
Figura – Crearea unui fișier KML in Google Maps
Step 1: Creating Placemarks Pasul 1: Crearea mărcilor de poziție
Placemark is simply a point on the map. Placemark este pur și simplu un punct de pe hartă.
To create a Placemark, zoom in to the area where you want to place a placemark and click the Add Placemark button on the Google Earth toolbar (the yellow push pin icon). Pentru a crea un marcator de locație, se marește zona în care se dorește plasarea unui marcator de locație prin clic pe butonul Adăugați marcatorul de semne din bara de instrumente Google Earth (pictograma galbenă a butonului de împingere).
Drag the placemark to the exact location where you want it to be. Se trage marcatorul de locație în locația exactă în care dorim să fie.For the Description you can actually add HTML codes that will be displayed as callout ballon when the placemark is clicked. Pentru descriere, se poate adăuga de fapt coduri HTML care vor fi afișate ca balon de avertizare atunci când se face clic pe marcatorul de locație. You can add pictures, YouTube videos, Flash files, Internet links and even bookmarks into your balloon. Putem adăuga imagini, videoclipuri YouTube, fișiere Flash, link-uri Internet și chiar marcaje în balon. click image to enlarge. Se utilizează clic pe imagine pentru a mări.
Figura – Crearea mărcilor de poziție în Google Earth
The Style, Color tab allows you to change the color of the placemark icon. Fila Stil, Color permite modificarea culoarea pictogramei marcatorilor de locație, unde tab-ul Altitudine are o importanta mare setat pe valoarea Be sure to set it to Relative to ground as shown in the image. Relativ .Acest lucru permite vizualizarea fișierul KML în Hărți Google.
Pasul 2: Crearea de poligoane
With polygon, you can create overlays on the map that denotes an area (ie service coverage, public parks, parking spaces, etc). Cu poligon, se pot crea suprafețe pe hartă care denumește o zonă (acoperire de servicii, parcuri publice, locuri de parcare etc.). Similar to adding placemarks, zoom in to the area where you want to overlay a polygon and click the Add Polygon button on the Google Earth toolbar. Similar cu adăugarea marcatorilor de locație, se poate mari zona în care se doreste suprapunerea un poligon, prin actionarea clic pe butonul „Adăugați un poligon” din bara de instrumente Google Earth. Click on the map to add multiple points that will form the polygon. Dacă se face click pe hartă se pot adăuga mai multe puncte care vor forma poligonul.Right click to remove points. Prin clic dreapta se elimină punctele.
Figura – Crearea de poligoane în Google Earth
The Description tab allows you to add HTML codes that display texts, photos, tables, etc. The Style, Color tab allows you to change the color of the polygon overlay. Fila Descriere permite adăugarea de coduri HTML care afișează texte, fotografii, tabele etc. Fila Stil, Color permite modificarea culoarii suprapunerii poligonului. Be sure to adjust the opacity so that it is semi-transparent. Se va asigura ajustarea opacitații astfel încât să fie semi-transparentă. For me 40%-50% opacity is just nice.Nivelul de 40% -50% al opacitatii este indicat.
Most importantly is the Altitude tab. Tab-ul Altitudine este cel mai important și trebuie setat pe Be sure to set it to Relative to ground.Relative la pământ. This will enable the KML file that you will later create to be able to be viewed on Google Maps. Acest lucru permite ca fișierul KML care se va crea ulterior, să poată fi vizualizat în Hărți Google.
Step 3: Creating Paths Pasul 3: Crearea căilor
Figura – Crearea căilor in Google Earth
Paths are just lines. Căile sunt doar linii !
Similar to Placemarks and Polygons, you can also add description, change style and color. Similar cu marcajele de locație și poligoanele, se pot adăuga, de asemenea, descriere, stil de schimbare și culoare. Click on the map to place multiple points that will form the path, and right click to remove points. Prin clic pe hartă se pot plasa mai multe puncte care vor forma calea. Prin clic dreapta se elimina punctele.
Be sure to set the Altitude to Relative to ground. Se va asigura că este setată Altitudinea la Relativ la masă. This will enable the KML file that you will later create to be able to be viewed on Google Maps. Acest lucru permite ca fișierul KML pe care îl se va crea ulterior să poată fi vizualizat în Hărți Google.
Step 4: Saving Your KML Files Pasul 4: Salvarea fișierelor KML
Figura – Salvarea fișierelor KML in Google Earth
Show All Items
Once youre done adding Placemarks, Polygons or Path, right-click on the item in the Places section of the Sidebar and choose Save Place As. După ce s-a făcut adăugarea marcatorilor de locație, a poligoanelor sau a căii, se face clic dreapta pe elementul din secțiunea Locuri din bara laterală și alege Salvați locul .
Choose KML in Save as Type dropdown. Se alege fișierul KML în meniul drop-down Salvare ca tip. Name it, and click Save. Se redenumește , ulterior se salvează.
NOTE: KMZ is a zipped version of KML. NOTĂ: KMZ este o versiune ZIP a fișierului. For this tutorial I'm sticking with KML. Pentru acest tutorial m-am lipit de KML.
You can save each Placemark, Polygon or Path individually, each into a separate KML file. Se poate salva fiecare marcaj de locație, poligon sau traseu individual, fiecare într-un fișier KML separat. Or you can group all of them in one folder, and save the folder as one KML file. Sau se poate grupa toate într-un singur director și salva dosarul ca fișier KML.
Dimensiunea maximă a fișierului încărcat (KML brut, GeoRSS brut sau KMZ comprimat)
3MB 3MB
Maximum uncompressed KML file size Dimensiunea maximă a fișierului KML necomprimată
10MB 10MB
Maximum number of network Links Numărul maxim de legături de rețea
10 10
Maximum number of total document-wide features Numărul maxim de caracteristici totale pentru document
1,000 1000
Number of KML layers Numărul de straturi KML
There is a limit on the number of KML Layers that can be displayed on a single Google Map. Există o limită a numărului de straturi KML care pot fi afișate pe o singură hartă Google. If you exceed this limit, none of your layers will appear on the map, and an error will be reported in your web browser's JavaScript console. Dacă se depășește această limită, niciunul dintre straturi nu va apărea pe hartă, iar o eroare va fi raportată în consola JavaScript a browserului Web. The limit is based on a combination of the number of KMLLayer classes created and the total length of all the URLs used to create those layers. Limita se bazează pe o combinație a numărului de clase KMLLayer create și a lungimii totale a tuturor adreselor URL utilizate pentru crearea acestor straturi. Each new KMLLayer you create will take up a portion of the limit for the layer and a further portion of the limit depending on the length of the URL where the KML file was loaded from. Fiecare nou KML KML care se creaza, va ocupa o parte din limita pentru strat și o altă porțiune a limitei în funcție de lungimea adresei URL de unde a fost încărcat fișierul KML. Consequently, the number of layers you can add will vary by application; În consecință, numărul de straturi pe care se pot adăuga, va varia în funcție de aplicație; on average, you should be able to load between 10 and 20 layers without hitting the limit. În medie, ar trebui să se poată încărca între 10 și 20 de straturi fără să se atingă limita. If you still hit the limit, use a URL shortner (such as https://goo.gl) to shorten the KML URLs. Dacă totuși s-a atins limita, se va utiliza un shortner de adrese URL (cum ar fi https://goo.gl) pentru a scurta adresele URL KML. Alternatively, create a single KML file consisting of NetworkLinks to the individual KML URLs. Alternativ, se poate crea un singur fișier KML format din Rețeaua de link-uri către adresele URL individuale KML.
Elementele KML compatibile
The Google Maps JavaScript API supports the following KML elements. JavaScript API-ul Google Maps acceptă următoarele elemente KML. The KML parser generally silently ignores XML tags it does not understand. Parserul KML ignoră, în tăcere, etichetele XML pe care nu le înțelege.
Placemarks Marcatori de locație
Icons icoane
Folders Dosare
Descriptive HTML—Entity replacement via <BalloonStyle> and <text> Descrierea HTML-Entity înlocuire prin <BalloonStyle> și <text>
KMZ (compressed KML, including attached images) KMZ (KML comprimat, inclusiv imaginile atașate)
Polylines and polygons Poliline și poligoane
Styles for polylines and polygons, including color, fill, and opacity Stiluri pentru polilinii și poligoane, inclusiv culoarea, umplerea și opacitatea
Network links to import data dynamically Link-uri de rețea pentru a importa date dinamic
Ground overlays and screen overlays Suprafețele de la sol și suprapunerile ecranului
Următorul tabel oferă detalii complete despre elementele KML acceptate. Pentru a putea genera un fisier google KML trebuie neaparat stiut urmatoarele elemente :
Opțiuni pentru stratul KML
The KmlLayer() constructor optionally passes a number of KmlLayerOptions : Constructorul KmlLayer() trece opțional un număr de KmlLayerOptions :
map specifies the Map on which to render the KmlLayer . map specifică Map pe care să se facă KmlLayer . You can hide a KmlLayer by setting this value to null within the setMap() method. Se poate ascunde un KmlLayer setând această valoare la null în cadrul setMap() .
preserveViewport specifies that the map should not be adjusted to the bounds of the KmlLayer 's contents when showing the layer. KmlLayer specifică faptul că harta nu trebuie ajustată la limitele conținutului KmlLayer atunci când se afișează stratul. By default, when displaying a KmlLayer , the map is zoomed and positioned to show the entirety of the layer's contents. În mod implicit, când se afișează un KmlLayer , harta este mărite și poziționată pentru a afișa întregul conținut al stratului.
suppressInfoWindows indicates that clickable features within the KmlLayer should not trigger the display of InfoWindow objects. suppressInfoWindows indică faptul că funcțiile care pot fi KmlLayer în cadrul KmlLayer nu ar trebui să declanșeze afișarea obiectelor InfoWindow .
Additionally, once the KmlLayer is rendered, it contains an immutable metadata property containing the layer's name, description, snippet and author within a KmlLayerMetadata object literal. În plus, odată ce KmlLayer este redat, acesta conține o proprietate de metadata imuabilă care conține numele, descrierea, fragmentul și autorul KmlLayerMetadata într-un obiect KmlLayerMetadata literal. You can inspect this information using the getMetadata() method. Examinarea acestor informații se poate face utilizând metoda getMetadata() . Because rendering of KmlLayer objects requires asynchronous communication to an external server, you will want to listen for the metadata_changed event, which will indicate that the property has been populated. Deoarece randarea obiectelor KmlLayer necesită comunicare asincronă cu un server extern, se va vizualiza evenimentul metadata_changed , ceea ce va indica faptul că proprietatea a fost populată.
The following example constructs a KmlLayer from the given GeoRSS feed: Următorul exemplu construiește un KmlLayer din feedul dat GeoRSS:
function initMap() { Funcția initMap () {
var map = new google.maps.Map(document.getElementById('map'), { Var harta = nou google.maps.Map (document.getElementById ('map'), {
zoom: 4, Zoom: 4,
center: {lat: 49.496675, lng: -102.65625} Centru: {lat: 49.496675, lng: -102.65625}
}); });
var georssLayer = new google.maps.KmlLayer({ Var georssLayer = nou google.maps.KmlLayer ({
url: 'http://api.flickr.com/services/feeds/geo/?g=322338@N20&lang=en-us&format=feed-georss' Url: "http://api.flickr.com/services/feeds/geo/?g=322338@N20&lang=en-us&format=feed-georss"
}); });
georssLayer.setMap(map); georssLayer.setMap (harta);
} }
<div id="map"></div> <Div id = "harta"> </ div>
/* Always set the map height explicitly to define the size of the div / * Setați întotdeauna în mod explicit înălțimea hărții pentru a defini dimensiunea div
* element that contains the map. * Element care conține harta. */ * /
#map { #Hartă {
height: 100%; Înălțime: 100%;
} }
/* Optional: Makes the sample page fill the window. / * Opțional: face ca pagina de probă să umple fereastra. */ * /
html, body { Html, body {
height: 100%; Înălțime: 100%;
margin: 0; Marja: 0;
padding: 0; Umplutura: 0;
} }
<!– Replace the value of the key parameter with your own API key. <! – Înlocuiți valoarea parametrului cheie cu propria cheie API. –> ->
<script async defer <Script async amânare
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap"> src = "https://maps.googleapis.com/maps/api/js?key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk&callback=initMap">
</script> </ Script>
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 4,
center: {lat: 49.496675, lng: -102.65625}
});
var georssLayer = new google.maps.KmlLayer({
url: 'http://api.flickr.com/services/feeds/geo/?g=322338@N20&lang=en-us&format=feed-georss'
});
georssLayer.setMap(map);
}
Detalii despre caracteristicile KML
Because KML may include a large number of features, you may not access feature data from the KmlLayer object directly. Deoarece KML poate include un număr mare de funcții, este posibil ca accesarea sa nu se facă direct din caracteristicile obiectul KmlLayer . Instead, as features are displayed, they are rendered to look like clickable Maps JavaScript API overlays. În schimb, pe măsură ce sunt afișate caracteristicile, ele sunt redate pentru a arăta ca suprapuneri API-uri JavaScript Hărți clicabile. Clicking on individual features, by default, brings up an InfoWindow containing KML <title> and <description> information on the given feature. Prin accesarea clic drepta pe caracteristicile individuale, în mod implicit, se afișează un InfoWindow care conține informații despre <title> și <description> KML pentru caracteristica dată. Additionally, a click on a KML feature generates a KmlMouseEvent , which passes the following information: În plus, un clic pe o caracteristică KML generează un KmlMouseEvent , care transmite următoarele informații:
position indicates the latitude/longitude coordinates at which to anchor the InfoWindow for this KML feature. position indică coordonatele latitudinii / longitudinii la care se ancorează InfoWindow pentru această caracteristică KML. This position is generally the clicked location for polygons, polylines, and GroundOverlays, but the true origin for markers. Această poziție este, în general, locația clic pentru poligoane, poliline și GroundOverlays, dar originea adevărată pentru markere.
pixelOffset indicates the offset from the above position to anchor the InfoWindow “tail.” For polygonal objects, this offset is typically 0,0 but for markers includes the height of the marker. pixelOffset indică decalajul de la position mai sus pentru a ancora coada InfoWindow . Pentru obiectele poligonale, această decalare este de obicei 0,0 dar pentru markere include înălțimea markerului.
featureData contains a JSON structure of KmlFeatureData . featureData conține o structură JSON a KmlFeatureData .
Accesarea de pe suportul SQL
Pentru a genera acest fisier KML in standardul Google este nevoie de o baza de date de la furnizorul de GPS sau provider. Sau, doar de un exemplu de baze de date cu coordonate GPS.
Aceasta baza de date se poate popula prin serviciu api de date de la providerul de GPS.
Neaparat aceasta baza de date sub forma unui trajectory Data, care contine cronologic coordonatele gps a unei masini, ea va furniza o traiectorie cat mai precisa a masinii urmarite.
un exemplu de baza de date si un format de baza de date furnizat de provider.
Select TOP 100 * from dbo.VehicleTrajectory
Figura -6 Accesarea pe suportul SQL
Unde lat = latitudine
Lng = Longitudine
Speed = viteza
Moment = data, ora,minut,secunda
Un punct este generat de longitudine si latitudine. P= (lat,lng).
Aceste date trebuie regasite si in formatul kml generat punctele (lat,lng) .
Dupa cum se poate vedea speed poate avea si valoarea zero. Ceea ce indica o stationare a masinii in punctul respectiv. Ora si coordonatele fiind luate din baza de date.
Pentru a genera grafic trebuie legate aceste pruncte prin linii . fisierul kml generat va fi prezentat grafic in programul Google Earth prin puncte unite prin linii.
Vehiculele pentru care se va genera fisierul KML sunt urmatoarele :
SELECT * FROM dbo.VehiclePos
Rularea aplicației
Programul e scris in limbajul C#, iar rezultatul rularii e un fisier cu extensia .kml care poate fi deschis direct de care aplicatia googleEarth.
Exemplu de fisier generat este :
<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Document>
<Style id="style1">
<LineStyle>
<colorMode>random</colorMode>
<width>4</width>
</LineStyle>
</Style><Placemark>
<name>masina3</name>
<styleUrl>#style1</styleUrl>
<LineString>
<tessellate>15667</tessellate>
<coordinates>
</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>masina2</name>
<styleUrl>#style1</styleUrl>
<LineString>
<tessellate>15574</tessellate>
<coordinates>
21.40702,46.16272,0 21.41205,46.16117,0 21.41727,46.15973,0 21.42298,46.15824,0 21.42822,46.15696,0 21.43274,46.15589,0 21.43703,46.15483,0 21.44191,46.15366,0 21.4474,46.15234,0 21.45519,46.15048,0 21.45721,46.14991,0 21.45639,46.14748,0 21.45678,46.14871,0 21.45726,46.14996,0 21.45768,46.14989,0 21.46237,46.14875,0 21.46639,46.14779,0 21.47044,46.14685,0 21.47383,46.14621,0 21.46896,46.1472,0 21.46398,46.14837,0 21.45851,46.14968,0 21.4571,46.14999,0 21.45626,46.14749,0 21.45645,46.14786,0 21.45708,46.14971,0 21.45443,46.15069,0 21.44756,46.1523,0 21.44029,46.15404,0 21.42012,46.15895,0 21.40691,46.16273,0 21.4068,46.16238,0 21.40673,46.16029,0 21.40688,46.16203,0 21.40694,46.16279,0 21.40335,46.16395,0 21.39953,46.16516,0 21.39526,46.16644,0 21.3907,46.16787,0 21.38583,46.16949,0 21.38276,46.17063,0 21.38057,46.17145,0 21.37678,46.17313,0 21.37293,46.17377,0 21.36961,46.17464,0 21.36557,46.17557,0 21.36182,46.17636,0 21.35795,46.17721,0 21.35426,46.17802,0 21.34864,46.17926,0 21.34819,46.17929,0 21.33823,46.18039,0 21.33496,46.18083,0 21.33165,46.18143,0 21.32749,46.18206,0 21.32473,46.18263,0 21.32579,46.1847,0 21.32535,46.18532,0 21.32529,46.18602,0 21.32545,46.18841,0 21.32409,46.18918,0 21.31994,46.18991,0 21.31601,46.19074,0 21.31261,46.19142,0 21.30906,46.19215,0 21.30701,46.19264,0 21.30461,46.1936,0 21.30134,46.195,0 21.29818,46.1969,0 21.29617,46.19866,0 21.29547,46.19912,0 21.29392,46.19998,0 21.29078,46.20139,0 21.28741,46.20147,0 21.2872,46.20138,0 21.28741,46.20081,0 21.29292,46.20051,0 21.29554,46.19894,0 21.29802,46.19692,0 21.30104,46.19489,0 21.30458,46.19346,0 21.30669,46.19249,0 21.3075,46.19197,0 21.31007,46.19173,0 21.31374,46.19106,0 21.3177,46.19025,0 21.32165,46.18951,0 21.32246,46.18925,0 21.32531,46.18808,0 21.32564,46.18711,0 21.32413,46.18353,0 21.3235,46.18251,0 21.32517,46.18228,0 21.32929,46.18169,0 21.3335,46.18101,0 21.33784,46.18037,0 21.34173,46.18066,0 21.34485,46.18005,0 21.34797,46.17931,0 21.35105,46.17866,0 21.3542,46.17793,0 21.3579,46.17712,0 21.36139,46.17636,0 21.36506,46.17555,0 21.36849,46.17485,0 21.37204,46.17388,0 21.37234,46.17345,0 21.3829,46.17054,0 21.39475,46.16658,0 21.40707,46.16266,0 21.40687,46.16026,0 </coordinates>
</LineString>
</Placemark>
</Document></kml>
Formatul bazei de date vehicule este :
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[VehiclesPos](
[vehicle_id] [nchar](50) NULL,
[name] [nchar](50) NULL,
[lat] [float] NULL,
[lng] [float] NULL,
[Localitatea] [nvarchar](50) NULL,
[Adresa] [nvarchar](250) NULL,
[DataOra] [datetime] NULL,
[Model] [nvarchar](50) NULL
) ON [PRIMARY]
unde
[vehicle_id] este un identificator de vehicul,
[name] este un numele vehicul,
[lat] este latitudinea la momentul restectiv,
[lng] este longitudinea la momentul respectiv,
[DataOra] este data si ora cand s-a preluat coordonata gps,
[Model] este tipul vehicul.
Formatul bazei de date a traiectoriei este urmatorul :
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[VehiclesTrajectory](
[vehicle_id] [nchar](50) NULL,
[moment] [nvarchar](50) NULL,
[lat] [float] NULL,
[lng] [float] NULL,
[speed] [float] NULL,
[azimuth] [float] NULL
) ON [PRIMARY]
GO
unde
[vehicle_id] este un identificator de vehicul,
[moment] este data si ora cand s-a preluat coordonata gps,
[lat] este latitudinea la momentul restectiv,
[lng] este longitudinea la momentul respectiv,
[speed] este viteza vehicul la momentul respectiv,
[azimuth] este directia vehicul la momentul respectiv.
Descrierea programului :
În C # există câteva obiecte care utilizează resursele sistemului. În C # se pot scrie fie codul pentru a crea o instanță nouă în resursă, sau, pe de altă parte, se pot crea pur și simplu unde se pot utiliza, folosind blocul de instrucțiuni în care obiectul creat este închis, iar resursele sunt apoi permise să fie folosite din nou de alte procese. Acest lucru asigură că cadrul va lua cele mai bune măsuri pentru fiecare proces. S-a utilizat “using” pentru a avea acces la toate resursele necesare conectarii la baza de date si apoi manipularii unui fisier xml(kml). Defapt acest format kml e foarte asemanator cu formatul xml, folosit in .net .
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Xml;
Conectarea la o bază de date necesită un șir de conexiuni. Acest șir are informațiile despre serverul pe care se va conecta, despre baza de date pe care se va solicita și despre acreditările care se utilizează pentru conectare. Fiecare bază de date are propria sa proprietate, propriul server, numele și tipul de informații de conectare, prin care se poate conecta la baza de date pentru a citi / scrie datele de pe ea.
În calcul, un șir de conexiune este un șir care specifică informații despre o sursă de date și mijloacele de conectare la ea. Acesta este transmis în cod la un driver sau furnizor care stau la baza pentru a iniția conexiunea. În timp ce este folosit în mod obișnuit pentru o conexiune de baze de date, sursa de date ar putea fi, de asemenea, o foaie de calcul sau un fișier text.
.NET Framework furnizează întotdeauna implementarea de bază a lucrului cu datele și funcțiile de bază pe care e pot utilize in cod . Datele pot fi extrase din anumite fișiere, pot fi date în aplicația dvs., dintr-un software de bază de date etc. În .NET se poate lucra cu acestea, utilizând spațiile de nume furnizate de cadrul .NET.
. OLEDB, SQL, LINQ sunt exemplele de bază ale unui astfel de tip de lucrări, în SQL se conectează la Baze de date și în acest spațiu de nume . Cu toate acestea, spațiul de nume pe care urmează a fi folosit este System.Data.SqlClient nu System.Data.Sql , deși cel de-al doilea spațiu de nume funcționează și cu funcții legate de SQL, dar SqlClient este singurul spațiu de nume pe care se va cauta în acest scenariu .
În toate bazele de date, există două tipuri de metode de conectare. Autentificarea Windows și autentificarea bazei de date. În autentificarea Windows, baza de date este autentificată utilizând acreditările utilizatorului din ferestrele (OS), iar în autentificarea bazei de date se trimite numele de utilizator și parola, pentru a vă conecta la baza de date.
În cazul meu de față, autentificarea a fost Windows, așa că a trebuit scrisă partea Integrated Security=True în interiorul șirului.Dacă se utilizează autentificarea bazei de date, se va furniza câmpurile de nume de utilizator și parolă din șir.
Conexion string este adresa de accesare la baza de date unde se pot lua date, care apoi se transformă in formatul kml folosit de Google pentru a reprezenta traiectoria. In cazul curent este:
public const string cs = "Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename='C:\\kmlTest\\MyData\\Database1.mdf';Integrated Security=True";
SqlConnection conn = null;
conn = new SqlConnection(cs);
conn.Open();
SqlConnection conn1 = new SqlConnection(cs);
conn1.Open();
Conectarea la o bază de date, așa cum s-a menționat deja, este un proces lung de deschidere a conexiunii, închiderea conexiunii și așa mai departe. Repetarea acestui proces pentru fiecare utilizator din aplicație nu este o abordare bună și va încetini procesele de executare a codului. Deci, în execuțiile programelor, multe astfel de conexiuni ar fi deschise și închise și din nou deschise care sunt identice. Aceste procese sunt consumatoare de timp și nu sunt opuse bunei UX.
În .NET Framework ADO.NET joacă un rol în acest proces și minimizează procesul de deschidere și închidere pentru a face execuția programului un pic mai rapid prin crearea, ceea ce noi numim Pool Connection . Această tehnică reduce numărul conexiunilor deschise, salvând instanța conexiunii, pentru fiecare conexiune nouă pe care o caută doar pentru conexiunea deja deschisă și apoi dacă există conexiunea, nu încearcă să creeze o conexiune nouă, în caz contrar deschide o nouă conexiune Conexiune bazată pe Stringul de conectare.
Trebuie reținut că numai conexiunile cu aceeași configurație pot fi reunite. Orice conexiune cu chiar o singură diferență ar necesita o piscină nouă pentru sine. În general, se bazează pe ConnectionString a conexiunii. Se poate afla cum diferă acestea prin modificarea valorilor din șirul de conectare.
NameSpace: System.Data.SqlClient
Acest ansamblu (spațiu de nume) al .NET Framework conține toate clasele necesare pentru conectarea la bazele de date, citirea / scrierea datelor în bazele de date.
Erori, rapoartele de succes sunt generate de acesta.
Se va folosi acest spațiu de nume direct și clasele pe care le conține în codul nostru, pentru a vă conecta la baza de date. Pentru a executa comenzile pentru a citi datele din el sau pentru a actualiza înregistrările sau pentru a adăuga altele ca întreg.
Conexiunea la baza de date se va face pentru a obtine lista de masini pentru care se genereaza fisierul grafic din tabela de Vehicule. Pentru aceasta se va utilize comanda SQLCommand care executa pe serverul SQL o instructiune sql. In acest caz se selectează id pentru crearea propriei liste de masini.
SqlCommand comanda_masini = new SqlCommand("SELECT [vehicle_id],[name] FROM [dbo].[VehiclesPos]",conn1);
Citirea datelor :
În acest proiest s-a atasat o baza de date care se va citi pentru a prelua informatii.
În SQL, se utilizeaza în cea mai mare parte instrucțiunea SELECT pentru a obține datele din baza de date pentru a afișa. în spațiul de nume existã un SqlDataReader clasã prezent pentru SqlCommand care returneazã obiectul Reader pentru date. Se folosește acest lucru pentru a citi datele și pentru fiecare coloanã furnizați rezultatele pe ecran.
Se creeaza un obiect SQLReader si se citesc datele din el .Preluarea datelor utilizând un SQLReader implică crearea unei instanțe a obiectului Command și apoi crearea unui SQLReader apelând Command.ExecuteReader pentru a prelua rânduri dintr-o sursă de date. De exemplu
SqlDataReader masina = comanda_masini.ExecuteReader();
SqlDataReader oferă un flux de date fără buffer, care permite logicii procedurale să proceseze eficient rezultatele dintr-o sursă de date în mod succesiv. SqlDataReader este o alegere bună atunci când se recuperează cantități mari de date, deoarece datele nu sunt memorate în cache.
Avand aceasta lista cu vehicule pentru care se dorește generarea fișierul grafic KML, va fi nevoie pentru a face o parcurgere a listei de vehicule, in vederea obținerii listeia cu coordonate GPS la fiecare vehicul dorit.
Formatul KML cere aceste detalii care se pot furniza usor din bazele de date Rezultatul, adica fisierul kml se afla in testKML.kml.
Se utilizează Clasa XmlTextWriter care se va regăsi in System.XML.
Aceasta clasa XmlTextWriter oferă o modalitate rapidă de a genera fluxuri sau fișiere care conțin date XML conforme cu W3C Extensible Markup Language (XML) 1.0 și cu Namespaces în recomandări XML.
using (XmlTextWriter writer = new
XmlTextWriter("c:\\testKML.kml", Encoding.UTF8))
Se va crea aceast fisier gol xml care trebuie sa conțină un anumit format standard kml.
Va trebui inițializat inceputul documentului kml.
Un exemplu de document KML este:
<?xml version="1.0" encoding="UTF-8"?> <? Xml version = "1.0" codare = "UTF-8"?>
<kml xmlns= "http://www.opengis.net/kml/2.2" > <Kml xmlns = "http://www.opengis.net/kml/2.2" >
<Document> <Document>
<Placemark> <Placemark>
<name> New York City </name> <Nume> New York </ nume>
<description> New York City </description> <Description> New York City </ description>
<Point>
<coordinates> -74.006393,40.714172,0 </coordinates>
</Point>
</Placemark> </ Placemark>
</Document> </ Document>
</kml> </ kml>
Vor urma cativa pasi pentru a genera acest tip de fisier.
Pasul 1 se declară formatul kml (<kml></kml>) si apoi partea de inceput a fisierului.
Reprezintă un scriitor care oferă o modalitate rapidă de a genera fluxuri sau fișiere care conțin date XML conforme cu W3C Extensible Markup Language (XML) 1.0 și cu Namespaces în recomandări XML.
Se recomandă utilizarea System.Xml ., Clasa XmlWriter în schimb.
Dupa cum se vede mai sus acest tip cere anumit HEAD inceput de fisier pentru a fi recunoscut de Google Earth, pentru a putea fi citit si apoi reprezentat.
Fara aceste linii de inceput fisierul nu va fi recunoscut de decompilatorul GoogleEarth.
Trebuie insearat linia de
<?xml version="1.0" encoding="UTF-8"?> <? Xml version = "1.0" codare = "UTF-8"?>
iar apoi am inserat linia de <kml xmlns= "http://www.opengis.net/kml/2.2" > <Kml xmlns = "http://www.opengis.net/kml/2.2" > care zice explicit ca e un fisier kml.
writer.WriteStartElement("kml");
writer.WriteAttributeString("xmlns", "http://earth.google.com/kml/2.0");
writer.WriteWhitespace(Environment.NewLine);
Definirea stilurilor : (<style></style>).
Fiecare caracteristica in formatul xml trebuie sa fie si inchisa . Se deschide dar apoi trebuie sa aiba o corespondenta in inchidere. De ex. (<style>STILUL MEU</style>).
Silul este definit chiar aici prin writer.WriteStartElement("Style");
writer.WriteStartElement("Document");
writer.WriteWhitespace(Environment.NewLine);
writer.WriteStartElement("Style");
writer.WriteAttributeString("id","style1");
Se vor genera coordonatele pentru fiecare vehicul din lista mea de vehicule obtinuta mai sus, parcurgand lista de vehicule si facand o cerere la baza de date cu coordonate. In cazul de față face cererea la VehiclesTrajectory.
SqlDataReader coordonatele=null;
int i = 0;
//se parcurge lista de masini
while (masina.Read())
{
string id_masina_curenta = masina[0].ToString().Trim();
}….
Iau doar punctele care au viteza speed>30 pentru ca baza de date e foarte stufoasa si poate sa dureze f mult generarea acestui fisier kml
SqlCommand comanda = new SqlCommand("SELECT [lat],[lng] FROM [dbo].[VehiclesTrajectory] where azimuth>0 and (moment) BETWEEN '" + startm + "' and '" + stopm + "' and speed>30 and vehicle_id=" + id_masina_curenta.Trim() + " order by moment asc", conn);
Coodonatele le tin in variabila coordonatele.
SqlDataReader coordonatele=null;
Pentru popularea ei voi face o comanda pe serverul SQL care va fi executata pe server. Rezultatul va fi in streamul coordonatele.
coordonatele = comanda.ExecuteReader();
Astfel se va obține o lista de coordonate pentru fiecare vehicul. In cazul in care vehiculul nu are coordonate in perioada aceea se va popula cu null ceea ce nu ma impiedica sa sa inserez in kml doar <coordonates></coordonates>. Nu va da eroare compilatorul google care va citi fisierul kml.
Pentru o colorare mai diversa a fisierului si a obtine o grafica s-a colorat separat fiecare traiectorie. Acest lucru s-a putut face usor din cauza ca la atributul colorMode si s-a atașat o valoare de random. Astfel ca fiecare traiectorie va avea alta culoare.
writer.WriteElementString("colorMode","random");
Marcatori de locatie foloseste atributul <Placemark></Placemark>.
writer.WriteStartElement("Placemark");
O marcator de locatie este una dintre cele mai frecvent utilizate functtii din Google Earth. Marcheaza o pozitie pe suprafata Pamântului, folosind o penseta galbena ca pictograma. Cel mai simplu marcator de locatie include doar un element <Point>, care specifica locatia marcajului de pozitie. Se poate specifica un nume si o pictograma personalizata pentru marcatorul de locatie se poate adăuga si alte elemente de geometrie.
Liniile se vor trage intre coordontate folosind macatorul de linii : <LineString> </LineString>. Traiectoria va fi desenata prin unirea punctelor (coordonatelor ) prin linii.
Deci in sectiunea <LineString> se vor insera coordonatele.
Dupa cum se poate vedea si mai jos s-a utilizat instructinile folosind obiectul writer si metoda WriteStartElement pentru a insera marcatorul de linii.
writer.WriteWhitespace(Environment.NewLine);
writer.WriteElementString("name", masina[1].ToString().Trim()); writer.WriteWhitespace(Environment.NewLine);
writer.WriteElementString("styleUrl", "#style1"); writer.WriteWhitespace(Environment.NewLine);
writer.WriteStartElement("LineString"); writer.WriteWhitespace(Environment.NewLine);
writer.WriteElementString("tessellate", id_masina_curenta); writer.WriteWhitespace(Environment.NewLine);
In macatorul de coordinate (<coordonates></coordonates>) s-a inserat coordonatele vehicului. Era necesara o parcurgere din baza de date a coordonatelor pentru a creea lista de coordonate pentru vehicolul curent.
Pentru aceasta in fisierul kml s-a folosit linia de comanda :
writer.WriteStartElement("coordinates");
Aceasta scrie in fisierul kml sectiunea <coordonates></coordonates>.
In cadrul sectiunii de coordonate trebuie inserat efectiv coordonatele pentru vehicul citite din baza de date .
Selectia coordonatelor pentru un anumit vehicul se face pe coloana [vehicle_id], se interogheaza baza de date punandu-se argument de cautare vehicle_id.
SqlCommand comanda = new SqlCommand("SELECT [lat],[lng] FROM [dbo].[VehiclesTrajectory] where azimuth>0 and (moment) BETWEEN '" + startm + "' and '" + stopm + "' and speed>30 and vehicle_id=" + id_masina_curenta.Trim() + " order by moment asc", conn);
Pentru a nu incarca foarte multe coordinate fac o cautare diferentiata pe o anumită perioada . Optiunea BETWEEN face o selectie intre o anumita data si o alta data. Data de start cautare si data de stop cautare. In cazul acesta se face cautare pe o zi a coordonatelor vehiculului, iar pentru a specifica care vehicul se caută, se pune optiunea and vehicle_id=" + id_masina_curenta.Trim() care face o selectie detaliata doar pe un vehicul. Functia Trim() sterge spatiile goale.
Inserarea coordonatelor in fisierul kml se face în secțiunea care urmeaza:
while (coordonatele.Read())
{
Console.WriteLine(coordonatele[1].ToString() + "," + coordonatele[0].ToString() + ",0 ");
writer.WriteRaw(coordonatele[1].ToString() + ",");
writer.WriteRaw(coordonatele[0].ToString() + ",0 ");
}
writer.WriteEndElement(); writer.WriteWhitespace(Environment.NewLine);
writer.WriteEndElement(); writer.WriteWhitespace(Environment.NewLine);
writer.WriteEndElement(); writer.WriteWhitespace(Environment.NewLine);
//se inchide conexiunea la baze de date
coordonatele.Close();
}
writer.WriteEndDocument();
}
}
Se foloseste clasa XmlTextWriter care oferă o modalitate rapidă de a genera fluxuri sau fișiere care conțin date XML conforme cu W3C Extensible Markup Language (XML) 1.0 și cu Namespaces în recomandări XML.
În documentatia online :
https://msdn.microsoft.com/en-us/library/system.xml.xmltextwriter(v=vs.110).aspx
writer e un obiect din clasa XmlTextWriter.
cu writer se manipuleaza fisierul care urmeaza a fi generat.
Se parcurge tabela de coordinate . comanda care executa in c# acest lucru este :
SqlCommand comanda = new SqlCommand("SELECT [lat],[lng] FROM [dbo].[VehiclesTrajectory] where azimuth>0 and (moment) BETWEEN '" + startm + "' and '" + stopm + "' and speed>30 and vehicle_id=" + id_masina_curenta.Trim() + " order by moment asc", conn);
Dupa cum se poate observa se selecteaza doar coordonatele cu speed > 30;
Se iau doar punctele care au viteza speed>30 pentru ca baza de date e foarte stufoasa si poate sa dureze f mult generarea acestui fisier kml.
Rezultatul rulării acestei aplicații va fi în următorul fișier KML:
<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Document>
<Style id="style1">
<LineStyle>
<colorMode>random</colorMode>
<width>4</width>
</LineStyle>
</Style><Placemark>
<name>masina3</name>
<styleUrl>#style1</styleUrl>
<LineString>
<tessellate>15575</tessellate>
<coordinates>
</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>masina2</name>
<styleUrl>#style1</styleUrl>
<LineString>
<tessellate>15578</tessellate>
<coordinates>
</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>masina1</name>
<styleUrl>#style1</styleUrl>
<LineString>
<tessellate>15579</tessellate>
<coordinates>
</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>masina4</name>
<styleUrl>#style1</styleUrl>
<LineString>
<tessellate>15580</tessellate>
<coordinates>
</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>masina5</name>
<styleUrl>#style1</styleUrl>
<LineString>
<tessellate>15583</tessellate>
<coordinates>
</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>masina6</name>
<styleUrl>#style1</styleUrl>
<LineString>
<tessellate>15587</tessellate>
<coordinates>
</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>masina7</name>
<styleUrl>#style1</styleUrl>
<LineString>
<tessellate>15591</tessellate>
<coordinates>
</coordinates>
</LineString>
</Placemark>
<Placemark>
<name>masina8</name>
<styleUrl>#style1</styleUrl>
<LineString>
<tessellate>15593</tessellate>
<coordinates>
22.45838,46.52896,0 22.45906,46.5283,0 22.46168,46.52682,0 22.46307,46.52521,0 22.46415,46.52348,0 22.46377,46.52167,0 22.46388,46.51983,0 22.4648,46.51865,0 22.46678,46.51685,0 22.46819,46.51515,0 22.46804,46.51324,0 22.46802,46.51156,0 22.46784,46.50984,0 22.46827,46.50804,0 22.46923,46.50624,0 22.47079,46.50443,0 22.47241,46.50253,0 22.47284,46.50025,0 22.47286,46.49709,0 22.47326,46.4938,0 22.47477,46.49084,0 22.47468,46.48791,0 22.47563,46.48609,0 22.4769,46.48473,0 22.47991,46.4789,0 22.48252,46.4727,0 22.48579,46.46642,0 22.49114,46.46022,0 22.49513,46.4543,0 22.49498,46.45191,0 22.49985,46.44943,0 22.50367,46.4481,0 22.50817,46.44392,0 22.51462,46.43934,0 22.52132,46.43469,0 22.52231,46.4335,0 22.52459,46.42855,0 22.53161,46.4237,0 22.53248,46.42319,0 22.53316,46.42161,0 22.53418,46.42009,0 22.53537,46.41792,0 22.55291,46.39271,0 22.55401,46.38401,0 26.75267,46.24262,0 </coordinates>
</LineString>
</Placemark>
<name>masina10</name>
<styleUrl>#style1</styleUrl>
<LineString>
<tessellate>15607</tessellate>
<coordinates>
</coordinates>
</LineString>
</Placemark>
</Document></kml>
Mai jos se pot vedea si grafic unele rezultate vazute cu programul googleEarth. Fisiere kml generate cu softul c# si vizualizate cu Google Earth.
Figura -7 Rezultat după rularea fișierului KML in Google Earth
Figura -8 Reprezentarea grafică a fișierului KML in Google Earth
CONCLUZII ȘI CONTRIBUȚII
În această lucrare de licență am pus în practică cunoștințele despre fisierele si standardul KML creat de compania Google. Mi s-a parut interesant diversitatea si complexitatea acestui standard KML, numarul mare de optiuni si generarea unui astfel de fisier care poate fi citit de programul Google Earth mi s-a parut un lucru util care poate fi extins mai departe.
Nu doar generarea unei traiectorii pentru un vehicul, ci chiar generarea unor traiectorii pe o zi sau 2 zile (avand in vedere numarul enorm de mare de coordonate pot ajunge si la 10-20.000 de coordonate pe zi trebuie sa limitam totusi perioada de generare) a unei flote in care sa se vada acoperirea traiectoriei acestei flote. Fiecare traiectorie a vehiculului fiind colorata separat cu alta culoare pentru a se diferentia traiectoriile intre ele in cadrul unei flote.
Am invățat să utilizez următoarele tehnologii:
Tehnologia Microsoft
Visual Studio2015 comunity
Limbajul c#
Microsoft SQL express 2012
Prin realizarea acestui software utilizatorii vor putea personaliza aspectul hărților și comportamentul acestuia pentru a se potrivi nevoilor lor.
Aceste fisiere kml au si limitari 3MB maxim un fisier de date, care poate limita numarul de vehicule pentru care se genereaza acoperirea prin traiectorii. Sau in cazul acestei limitary se poate da o generare maxim pe 1 zi a unei flote mai mari. Sau pentru un vehicul se poate da maxim pe 2-3 zile o traiectorie, datele depasind usor 3Mb.
Bibliografie:
[1]Limbajul c#
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/
http://colegiulbratianu.ro/wp-content/themes/theme53309/documente/software/DotNet.pdf
[2]XmlTextWriter Class
https://msdn.microsoft.com/en-us/library/system.xml.xmltextwriter(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/system.xml.xmltextwriter(v=vs.110).aspx
[3]formatul KML
https://developers.google.com/kml/
https://developers.google.com/kml/documentation/
https://developers.google.com/kml/documentation/kmlreference
http://doc.arcgis.com/ro/arcgis-online/reference/kml.htm
https://developers.google.com/kml/
https://developers.google.com/kml/documentation/
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: fisiere in formatul KML (standard Google) Arad 2017 – LISTA FIGURILOR Figura 2-1 Crearea aplicațiilor în Visual… [303991] (ID: 303991)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
