Makale Özeti

Artık günlük hayatta kullandığımız son model pocket pc'lerin çoğunda tümleşik GPS bulunmaktadır. Bu GPS'ler son kullanıcılar tarafından sadece bir yol bulma uygulaması olarak anlaşılsa da yazılımcıların bu konuya bakış açısı farklıdır. Donanımsal olarak bulunan bu özellik koordinat belirlemenin mümkün olması ve internet tabanlı harita sunucularının SDK'larını dışarı açmasıyla yazılımcıların ufkunu açmıştır.

Makale

Merhabalar,

Artık günlük hayatta kullandığımız son model pocket pc'lerin çoğunda tümleşik GPS bulunmaktadır. Bu GPS'ler son kullanıcılar tarafından sadece bir yol bulma uygulaması olarak anlaşılsa da yazılımcıların bu konuya bakış açısı farklıdır. Donanımsal olarak bulunan bu özellik koordinat belirlemenin mümkün olması ve internet tabanlı harita sunucularının SDK'larını dışarı açmasıyla yazılımcıların ufkunu açmıştır. Birçok yazılımcı araç takip, personel takip uygulamasından, satışta olan emlakların gösterilmesine kadar çok geniş bir yelpazede uygulamalar yazmayı düşünmüştür. İleride GPS cihazlarının bir web servis aracılığı ile yol yoğunluk durumuna göre karar verebilir duruma gelmesi bizi farklı bir boyuta taşıyacaktır. Şimdi bu özelliği mobil uygulamalarımızda nasıl kullanabileceğimizi bir örnek ile inceleyelim.

Örnek uygulamamız, kullanıcının mobil cihazından aldığımız yer bilgilerini harita üzerinde gösterdiğimiz bir uygulama olacak. Mobil cihazda çalışan uygulama server'a kullanıcının GPS ile aldığı yer bilgilerini gönderecek. Ardından da server'da tuttuğumuz enlem boylam bilgilerinden kullanıcının bulunduğu yerleri Virtual Earth kullanarak harita üzerinde görüntüleyeceğiz. Virtual Earth'ün uygulamalarımızda kullanımı, detaylı bilgi ve bu makalede kullanacağım Virtual Earth ile yer bilgilerinin haritada nasıl gösterebileceğinize yazmış olduğum başka bir makaleden ulaşabilirsiniz.

İlk olarak GPS ile edinilmiş yer bilgilerinin tutulacağı veritabanını basitçe tasarlayalım. Veritabanında GPS verisi takip edilecek kullanıcı bilgilerinin tutulduğu bir tablo ile GPS verilerinin tutulduğu tabloları oluşturmak yeterli olacaktır. Tabloları aşağıdaki gibi tasarlayalım:

 

Kullanıcı bilgilerinin tutulduğu tabloyu GPSUsers, GPS'den elde edilen verilerin tutulduğu tabloyu ise GPSInformation olarak adlandıralım. Şimdi sırada kullanıcının yer bilgilerini server'a gönderecek olan uygulama var. Yeni bir solution oluşturup, device application ekleyelim. Bu uygulamada kullanıcı seçimi yapılacak bir form olsun, diğer bir forma da bir timer ekleyelim ve kullanıcı seçimi yapıldıktan sonra GPS Başlat adında bir menu item'a tıklandığında 10 saniyede bir GPS ile elde edilen enlem boylam bilgileri server'a gönderilsin. Formları aşağıdaki gibi tasarlayalım:

       

İlk olarak kullanıcı seçme formunun kodunu yazalım:

private void frmChooseUser_Load(object sender, EventArgs e)
{
    GPSUser
insGPSUser = new GPSUser();
    DataTable
insDataTableGPSUser = insGPSUser.SelectGPSUsers();
    cmbUser.DataSource = insDataTableGPSUser;
    cmbUser.ValueMember = "GPSUserId";
    cmbUser.DisplayMember = "GPSUserName";
}
private
void btnOK_Click(object sender, EventArgs e)
{
    ApplicationVariables
.UserId = Convert.ToInt32(cmbUser.SelectedValue);
    this
.Close();
}

Kullanıcı seçme ekranının Load'ında GPSUser nesnesinin SelectGPSUsers fonksiyonunu kullanarak veritabanındaki GPSUsers tablosundaki kullanıcıları kullanıcı combobox'ına dolduruyoruz. OK butonuna tıklandığında ise ApplicationVariables adındaki static class'ta tuttuğumuz UserId değişkenine combobox'ta seçili olan değeri atıyoruz. UserId değişkenini anaformda GPS verilerini veritabanına insert ederken kullanacağız. ApplicationVariables class'ı aşağıdaki gibidir:
public static class ApplicationVariables
{
    private
static int _UserId;
    public
static int UserId
    {
        get
{ return ApplicationVariables._UserId; }
        set
{ ApplicationVariables._UserId = value; }
    }
}

Sırada anaformumuz var. İlk olarak Kullanıcı Seç menuitem'a tıklandığında Kullanıcı Seçme formumuzu açtıracak kodu yazalım:
private void menuItem3_Click(object sender, EventArgs e)
{
    frmChooseUser
insFrmChooseUser = new frmChooseUser();
    insFrmChooseUser.ShowDialog();
}

Şimdi sıra GPS işlemlerini yaptırmaya geldi. GPS işlemleri, GPS API'si kullanılarak yapılabiliyor. http://www.treaple.com/ArticlesDetails.aspx?id=62 adresinde GPS API'si hakkında detaylı bilgiye erişebilirsiniz. Ben de bu adresteki örnek kodu indirdim ve class'ları projeye ekledim. Bu class'lar içindeki içindeki GPS class'ı ile kalan işlemlerimize devam edebiliriz. Formumuzda insGPS adında class level bir GPS tipinde değişken tanımlayalım ve Load'da GPS nesnesinin Open metodunu kullanarak cihazımızdaki GPS'i etkinleştirelim:
GPS insGPS = new GPS();
private
void frmGPS_Load(object sender, EventArgs e)
{
    insGPS.Open();
}

Ardından formdaki timer'ın Tick event'ine aşağıdaki kodu yazalım:
private void timer1_Tick(object sender, EventArgs e)
{
   
try
   
{
        if
(insGPS.GetDeviceState().DeviceState == GpsServiceState.On)
        {
            GPSInformation
insGPSInformation = new GPSInformation();
            GPSPosition
insGpsPosition = insGPS.GetPosition();
            insGPSInformation.GPSUserId = ApplicationVariables.UserId;
            insGPSInformation.Latitude = Convert.ToDecimal(insGpsPosition.Latitude);
            insGPSInformation.Longitude = Convert.ToDecimal(insGpsPosition.Longitude);
            insGPSInformation.InsertGPSInformation(insGPSInformation);
        }
    }
    catch
(Exception)
    {
        throw
;
    }
}

Kodda, insGps nesnesinin GetPosition() fonksiyonunu kullanarak insGpsPosition nesnesini oluşturuyoruz. insGpsPosition nesnesinin Latitude ve Longitude property'lerinden kullanıcının enlem ve boylam bilgilerini alıyoruz. Ardından oluşturduğumuz GPSInformation nesnesinin property'lerine değerleri atayarak, veritabanında GPSInformation tablosuna insert ediyoruz.

Son olarak menüdeki GPS Başlat menuitem'ına tıklanınca, timer'ı enabled edelim:
private void menuItem2_Click(object sender, EventArgs e)
{
    if
(ApplicationVariables.UserId == 0)
    {
        MessageBox
.Show("Lütfen kullanıcı seçiniz.");
        return
;
    }
    timer1.Enabled = true;
}

Böylece bu noktaya kadar kullanıcının yer bilgilerini alacağımız uygulamamızı yazmayı tamamlamış oluyoruz. Şimdi sırada topladığımız bu bilgileri Virtual Earth kullanarak haritada gösterme işlemine geldi. Solution'a yeni bir web uygulaması ekleyelim. Uygulamada kullanıcının GPS bilgilerini almak istediği iki tarih arasını seçebileceği bir calendar kontrolleri, kişileri seçebileceği bir checkboxlist, Virtual Earth haritası ve bir buton olsun. Ardından da butonun click event'ine aşağıdaki kodu yazalım:
protected void btnGPS_Click(object sender, EventArgs e)
{
    GPSInformation
insEntGPSInformation = new GPSInformation();
    DateTime
dtBaslangic = new DateTime(calBaslangic.SelectedDateTime.Value.Year, calBaslangic.SelectedDateTime.Value.Month, calBaslangic.SelectedDateTime.Value.Day, Convert.ToInt32(txtBaslangicSaat.Text), Convert.ToInt32          (txtBaslangicDakika.Text), 0);
    DateTime
dtBitis = new DateTime(calBitis.SelectedDateTime.Value.Year, calBitis.SelectedDateTime.Value.Month, calBitis.SelectedDateTime.Value.Day, Convert.ToInt32(txtBitisSaat.Text), Convert.ToInt32(txtBitisDakika.Text), 0);
    List
<int> ids = new List<int>();
    for
(int i = 0; i < cblKisiler.Items.Count; i++)
    {
        if
(cblKisiler.Items[i].Selected)
        {
            ids.Add(Convert.ToInt32(cblKisiler.Items[i].Value));
        }
    }
    string
addpolyline = "function AddPolyline(){ ";
    foreach
(int id in ids)
    {
        DataTable
insDataTableGPSInformation = insEntGPSInformation.SelectGPSInformationByGPSUserIdAndGPSDataTime(id, dtBaslangic, dtBitis);
        string
script = "function GetPoints" + id.ToString() + "(){return new Array(";
        foreach
(DataRow dr in insDataTableGPSInformation.Rows)
        {
            script = script + "new VELatLong(" + dr["Latitude"].ToString().Replace(",", ".") + "," + dr["Longitude"].ToString().Replace(",", ".") + "),";
        }
        if
(script.EndsWith(","))
        {
            script = script.Substring(0, script.Length - 1);
        }
        script = script + ");}";
        ScriptManager
.RegisterClientScriptBlock(this, this.GetType(), "koordinat" + id.ToString(), script, true);
        Color
c = GetColor(id);
        addpolyline = addpolyline + "var points" + id.ToString() + " = GetPoints" + id.ToString()
            + "(); var shape" + id.ToString() + " = new VEShape(VEShapeType.Polyline, " +
            "points"
+ id.ToString() + ");" +
            " shape"
+ id.ToString() + ".SetLineColor(new VEColor(" + c.R.ToString() + " , " + c.G.ToString() + "," + c.B.ToString() + ", 1.0)); " +
            " shape"
+ id.ToString() + ".SetFillColor(new VEColor(" + c.R.ToString() + " , " + c.G.ToString() + ", " + c.B.ToString() + ", 0.5)); "
           
+ " map.AddShape(shape" + id.ToString() + "); shape" + id.ToString() + ".HideIcon(); map.SetMapView(points" + id.ToString() + "); ";
    }
    addpolyline = addpolyline + "}";
    ScriptManager
.RegisterClientScriptBlock(this, this.GetType(), "rota", addpolyline, true);
    ScriptManager
.RegisterClientScriptBlock(this, this.GetType(), "harita", "GetMap();", true);
}

Kodda veritabanında GPSInformation tablosundan GPSUserId ve GPSDataTime alanlarına göre GPS yer bilgilerini çekiyoruz ve bu çektiğimiz enlem boylam bilgileri ile Virtual Earth map kontrolünde gösterilmek üzere javascript kodunu oluşturuyoruz. Bu arada birden fazla kullanıcı seçilmişse çizilen çizgilerde renkler farklı olsun diye GetColor fonksiyonunu kullanarak SetLineColor ve SetFillColor metodlarıyla her kişiye ait olan çizgiyi farklı renkte çiziyoruz. Dizayn kısmını ve sayfadaki kodun kalanını örnek uygulamayı indirip inceleyebilirsiniz.

Web uygulamasını çalıştırıp veritabanında kayıtlı tarihleri ve kullanıcıları seçerek Haritada Göster butonuna tıkladığımızda aşağıdaki gibi şekilde haritamız çizilecektir:



Haritada bir kullanıcı turuncu, diğeri ise lacivert renkte gösterilmiştir. Hangi kullanıcının hangi lokasyondan ne zaman geçtiği gibi bilgileri de uygulamaya ekleyebilir, haritaya çizgiden farklı olarak poligon gibi şekiller çizebilirsiniz. Görüldüğü gibi GPS ve Virtual Earth birlikte kullanıldığında ortaya oluşturması ilginç ve bir o kadar da zevkli uygulamalar çıkabilir.

Umarım makalem sizin için faydalı olmuştur.

Işıl Orhanel
http://www.isilorhanel.net

 


 

Örnek uygulamayı buradan indirebilirsiniz.