Makale Özeti

Günümüzde Harita ve GIS teknolojisinin oldukça fazla gelişmesi sonucu kişilerin gidecekleri yerleri görme ve etüt yapma imkânları oldukça artmıştır. Özellikle kent bilgi sistemleri, kent rehberleri ve dijital şehir haritaları gibi alanlarda nerdeyse mükemmele yakın veri tabaları oluşturulmuştur.

Makale

Compact Flash II (CF-II) Portundan Bagli GPS kullanımı
Günümüzde Harita ve GIS teknolojisinin oldukça fazla gelişmesi sonucu kişilerin gidecekleri yerleri görme ve etüt yapma imkânları oldukça artmıştır. Buna paralel olarak kişiler Mobil aletlerinde Navigasyon yazılımlarını kullanma konusunda büyük yol almışlardır. Özellikle kent bilgi sistemleri, kent rehberleri ve dijital şehir haritaları gibi alanlarda nerdeyse mükemmele yakın veri tabaları oluşturulmuştur. Kişiler artık bu veritabanlarına bağlı olarak gidecekleri yerleri seçip ve bir GPS (Geographic Point System) Aygıtı ile gidecekleri yönü bulabilmektedirler.

Günümüz şartlarında bütün PDA’ler de CF-II portuna bağlı bir GPS aleti kullanılabilmektedir. Bununla birlikte basit bir harita yardımı ve Ufak haritacılık bilgileri herkes ile basit bir Navigasyon sistemi yapabilir.

Ben şimdi sadece CF-II portuna bağlı GPS den bulunduğum Coğrafi kordinatları ve hareket halindeyken hızımı gösterecek bir yazılım yapıyorum.

Ben inndir.com adresinden indirebileceğiniz third party bir Compact Framework ile CF-II portuna bağlı GPS’i açacağım.

Bu Frameworkten bahsedecek olursa açık kodlu geliştirilmeye açık bir framework olarak internetten indirebiliyorsunuz. Microsoft Compact Framawork’u de içerdiği ile ilgili bir makale okumuştum ama bazı sınıflar için kullandığınız PDA üzerine Microsoft Compact Frameoword’u de kurarsanız sizin için faydalı olur.

Yeni Bir Proje açıyoruz. Projeyi açarken 2 farklı yol izleyebilirsiniz. Bunlardan birisi Standart “Smart Device Application” diğeri ise kurduğunuz Third party Framework sınıflarını otomatik olarak içeren “OpenNETCF Application”. İkisi arasında bek fark yok Sadece OpenNETCF Application sınıfları otomatik olarak içinde bulundurur. Eğer Standart seçerseniz OpenNETCF sınıflarını import etmeniz gerekir o kadar. Ben OpenNETCF Application Seçerek devam ediyorum.

Şimdi Aşağıdaki Gibi bir form Tasarımı oluşturuyoruz. Ve kodlarımızı yazmaya başlıyoruz. Bu formun yanında birde adı clck olan Timer nesnesi ekliyoruz. Timer nesnesi ekran bileşenlerini guncellemek için kullanılacak.

'Makalede Kod içi tanımlarda Comment kullanmak gayet pratiktir. Hem yazan
'hemde Copy-Paste yapan için. Bende bu şekilde comment blocklar halinde 'yazacağım.


Imports OpenNETCF.IO.Serial.GPS

'3. Parti Framework ile GPS'i kullanacağımızı için IO paketi altında Serial GPS sınıfını import ediyoruz

Imports System.IO

'OpenNETCF IO bileşenleri için Microsoft Compact Framework IO bileşen sınıfını
'import etmemiz gerekiyor

Imports System

'Standart System çağrıları için sistem Sınıfı import ediliyor

Public Class Form1


Inherits System.Windows.Forms.Form

Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu

Public WithEvents MyGps As New GPS

'Kullanacağım GPS nesnesi burada tanımlanıyor. GPS nesnesi bir form
'bileşeni olmadığından kendimiz tanımlayıp WirhEvents ile olaylarınıda
'kullanacağımızı belirtiyoruz.


Public str1, str2, str3 As String

'Ekran bileşenlerini guncellemek için kullanacağım değişkenler

Public Sub New()

MyBase.New()

'Form üstündeki kontrollerin oluşması için gerekli yordam çağrısı

InitializeComponent()

'kontroller oluştuktan sonraki temel Ayarların yapılacağı bölüm

'GPS Maksimum BaudRate 19200 Bps

MyGps.MaxBaudRate = OpenNETCF.IO.Serial.BaudRates.CBR_19200

'GPS Minimum BaudRate 4800 Bps

MyGps.MinBaudRate = OpenNETCF.IO.Serial.BaudRates.CBR_4800

End Sub

'Form overrides dispose to clean up the component list.

Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)

MyBase.Dispose(disposing)

End Sub

'Buraya kadar olan kısımda Nesne ve kontrolleri oluşturduk. Şimdi yapacağımız
'asıl olaya gelmiş bulunuyoruz. Artık bu aşamadan sonra GPS’imizi çalıştırıp
'koordinatları görmeye başlıyoruz. Formumuz aktif olurken istediğimiz işlerin
'bir listesini görelim.

'Ekran ne sıklıkla güncellenecek
'Otomatik Bulma olacak mı?
'GPS hangi port tan bağlı
'GPS ne hızla bilgi gönderecek

'İşte Form_Load yordamı tetiklendiğinde bunlara çözüm bulmaya çalışalım

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'Bilgilerin ekranda güncelleme sıklığı ile ilgili timer bileşeni
'1000 ms(1 sn) 1 defa bilgi güncellemesi

clck.Interval = 1000

MyGps.AutoDiscovery = False
'otomatik bulma iptal edildi. Çünkü bunu biz yapacağız :)

MyGps.ComPort = "COM4:"
'GPS'in PDA'nın CF-II portuna bağlı olduğunu varsayıyoruz
'Sizler Bir Listeden GPS'inizin PDA'ın hangi portundan bağlandığını bulabilirsiniz

MyGps.BaudRate = OpenNETCF.IO.Serial.BaudRates.CBR_4800
'GPS'in saniyede kaç bit veri göndereceği

Application.DoEvents()
'Uygulamada GPS'e bağlı işlemler beklenirken diğerlerin kilitlenmemesi için Standart Thread
'metodu gibi çalışmasını sağlar.

End Sub

'GPS 'in Trace Durumunda, Trace Log dosyasına yazacağı 1 satırı verir

Private Sub MyGps_Sentence(ByVal sender As Object, ByVal e As GpsSentenceEventArgs) Handles MyGps.GpsSentence

End Sub

'GPS 'in durum yordamı.

Private Sub MyGps_GpsCommState(ByVal sender As Object, ByVal e As GpsCommStateEventArgs) Handles MyGps.GpsCommState

Select Case e.State

Case States.AutoDiscovery ' Otomatik Bulmaya Ayarlı ise
GPSDurum.Text = "Otomatik Bulma"

Case States.Opening ' Açılıyorsa
GPSDurum.Text = "Başlatılıyor"

Case States.Running ' Çalışıyorsa
GPSDurum.Text = "Başladı"

Case States.Stopping ' Kapatılıyorsa
GPSDurum.Text = "Durduruluyor"

Case States.Stopped ' Kapatıldıysa
GPSDurum.Text = "Durduruldu"

Case Else
GPSDurum.Text = ""

End Select

End Sub

'Butun GPS ler Uydulardan gelen nokta ve zaman bileşenlerine göre
'Kişinin ne kadar süratle yer değiştirdiğini gösterebilmektedir.
'GPS'ler ulusal uydulardan veri aldıklarından dolayı hız bilgisini Mph
' (Mil Per Hours) cinsinden göstermektedir

'Ancak bunu formuller doğrultusunda kişiler Kmh'ye çevirebilmektedir.
Private Sub MyGps_Movement(ByVal sender As Object, ByVal e As Movement) Handles MyGps.Movement

str3 = e.SpeedMph.ToString("000.000") & " Mph"

End Sub

'GPS aygıları dünya etrafındaki 24+4 uydudan kişinin
'koordinatlarını hesaplar. Bir GSP aygıtı ne kadar çok uydudan bilgi alırsa
'kişinin koordinatları o kadar hassas ve doğru olur Ortalama bir GPS
'hassasiyeti 3 mt iken harita muhendislik hizmetleri yapan bir firmada GIS
'yazılımı geliştirirken 2 mm hassasiyetli GPS lerin kullanıldığına şahitlik
'etmiştim :)

'Bir GPS'in enurettiği en doğru sonuç hareket halindeyken elde ettiği
'sonuçtur. Alttaki yordamda GPS'in pozisyonu Enlem ve Boylam cinsinden
'bularak ilgili alanlarda saklıyor Ancak bir GPS ortalama olarak
'Saniyede 10 adet veri aldığından dolayı bu yordam saniyede 10 kez çalışıp 'ilgili alanları saniyede 10 kez güncelleme gereksinimi duyacaktır.
'Bu yazdığımız programda extra bir
'iş yükü oluşturacağından dolayı ben bunu Class içinde Public olarak
'tanımlanmış STR1 ve STR2 değerlerinde tutarak saniyede 1 defa
'guncellemesi için bir timer yordamı yazacağım.

Private Sub MyGps_Position(ByVal sender As Object, ByVal pos As Position) Handles MyGps.Position

Dim Yon1, Yon2 As String

Select Case pos.DirectionLongitude
'Gre
enwich Gözlem evine Göre Boylam yönü

Case CardinalDirection.East
Yon1 = "Dogu"

Case CardinalDirection.West
Yon1 = "Bati"

Case Else
Yon1 = "Duragan"

End Select

Select Case pos.DirectionLatitude
'Ekvatora göre Enlem yönü

Case CardinalDirection.North
Yon2 = "Kuzey"

Case CardinalDirection.South
Yon2 = "Guney"

Case Else
Yon2 = "Duragan"

End Select

str1 = pos.Longitude_Sexagesimal.ToString & " " & Yon1 & " Boylamı"
'Derece, Dakika, Saniye cinsinden Boylam değerlerinin yakalanması

str2 = pos.Latitude_Sexagesimal.ToString & " " & Yon2 & " Enlemi"
'Derece dakika saniye cinsinden Enlem değerlerinin yakalanması

End Sub

'GPS'in gerek uydudan gerek yazılımdan kaynaklanan hatalarını
'yakalayabileceğiniz bir olay

'TRY Catch blokları yerine direk bu olayı kullanabiliyorsunuz.

Private Sub MyGps_Error(ByVal sender As Object, ByVal exception As Exception, ByVal message As String, ByVal gps_data As String) Handles MyGps.Error

MessageBox.Show(message + " " + gps_data, "Hata Oluştu", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)

End Sub

'GPS aygıtı dünya uzerinde dolayan 24 asıl ve 4 yedek uydudan
'hangilerini ne güçlükte sinyal ile yakaladığını bu yordam sayesinde
'programa bildirir. Unutmayın ki bu sinyal güçleri etrafınızdaki bina
'ağaç, havadaki bulut, havanın karlı ya da yağmurlu olmasına göre farklılık
'gösterir ve ne kadar güçlü sinyal alabiliyorsanız bulunduğunuz konum o
'kadar hassas olarak gösterilmektedir.


Private Sub MyGps_Satellite(ByVal sender As Object, ByVal sat As Satellite()) Handles MyGps.Satellite

Dim sat1 As Satellite
' Bizim GPS Class'ımız bulduğu uydularla ilgili verileri
'Satelite tipinde bir dizi olarak gönderdiğinden Satelite tipinde bir Sat1
'değişkeni tanımlayıp Aşağıdaki döngüde her uydu için ayrı ID ve Sinyal
'gücü değerini göstermekteyiz.


ltsUydu.Items.Clear()

Try

For Each sat1 In sat 'Bulunan her uydu için

If sat1.Active = True Then ' Eğer uygu aktifse

ltsUydu.Items.Add(sat1.ID.ToString("00") + ":" + BarUret(sat1.SNR))

'Numarasını ve Sinyal gücünü BarUret Fonksiyonunun
'dönus değerine göre listeye ekle

End If

Next

Catch ex As Exception

End Try

End Sub

'100 uzerinden degerler olarak gelen uydu sinyalini ListBox
'içinde bar mantığı ile göstermek uzere yazdığım fonksiyon. Bu fonksiyona göre
' her 3 br lik sinyal 1 bar şeklinde gösterilmektedir.

Function BarUret(ByVal deger As Integer) As String

Dim i As Integer, br As String, say As Integer = 0
For i = 1 To deger

say += 1
If say = 3 Then

br = br + "|"
say = 0

End If

Next
Return br

End Function

Private Sub GPSBaslat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GPSBaslat.Click

MyGps.Start() 'GPS'in sinyal bulmaya başlamasını sağlar
clck.Enabled = True 'Alan güncellemesini yapacak olan 1 sn lik timerı başlatır

End Sub

Private Sub GPSDurdur_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GPSDurdur.Click

MyGps.Stop() 'GPS'in sinyal bulmaya başlamasını iptal et
clck.Enabled = False 'Güncellemeyi yapacak olan timer'i iptal et

End Sub

'her Saniyede 1 defa Alanları güncelleme işlemi yapan Timer yordamı.

Private Sub clck_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles clck.Tick

Try

LblBoylam.Text = str1 'Boylam Bilgisini Aktar
LblEnlem.Text = str2 'Enlem Bilgisini Aktar
LblHiz.Text = str3 ' Hiz bilgisini Aktar

Catch ex As Exception

End Try

End Sub

Private Sub BtnKapat_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnKapat.Click

MyGps.Stop() 'GPS'i durdur ve Programı kapat
Application.Exit()

End Sub

End Class
Ben Programı Pocket PC 2002 ve Toshiba Arm işlemcili bir PDA uzerinde Derleyip çalıştırdım. Sonucu Fotoğraf makinesi ile çekip gösteriyorum Çünkü PDA uzerinde Screen Shot alma ile ilgili bir yöntem bilmiyorum.

Programı Çalıştırdığımızda oluşan Sonuç Aşağıdaki Gibi :)

  


Compact Flash II aletlerinden söz etmişken nasıl bir alet olduğunuda göstermeden geçemeyeceğim. Aşağıdaki resimde internetten rahat rahat alabileceğiniz bir CF-II Gps bulunmaktadır.


 
 
Ertuğrul Kara
ertugrulkara@msn.com