C# Enlem ve Boylam ile Şehir Öğrenme

By Burak TUNGUT - 21.11.2012 - Kategori Windows Phone 8

Bu makale ile enlem ve boylam bilgisini parametre olarak alıp, geriye plaka bilgisini döndüren bir method yazacağız.
Tüm bu işlemleri yapabilmek için öncelikle GeoCode adındaki Google Api'sini inceliyor ve örnek içinde kullanıyor olacağız.

Bir senaryo düşünelim,
Uygulamamız Türkiye de ki tüm hastanelerin konumlarını içeren bir bilgiye sahip ve GPS yardımıyla en yakın hastaneleri görmek istiyoruz. Bu durumda önümüze 2 yol çıkacaktır.

  1. Tüm hastanelerin enlem ve boylamları mevcut olduğundan dolayı, GPS ile konumumuzu alarak fizik derslerimizden hepimizin hatırladığı 2 nokta arasındaki fark (x ve y koordinatlarının kendi aralarında kare farklarının toplamları) formülü ile belli bir aralıktaki verileri alabiliriz. Ancak İstanbul gibi bir yerde uzaklık-yakınlık konusu için belli bir aralığı girebilmek pekde kolay olmayacaktır :)
  2. Ve bizim bu makale ile kullanacağımız yol ise yine GPS den enlem ve boylam bilgisini çekmek ve bu bilgiler ile hangi şehirde olduğumuzu bulmak, o şehirdeki tüm hastaneleri listelemek olacaktır.

Tabi ki uygulama için hastane gibi bir entity yaratmaya kalkmayacağız. Sadece Enlem ve boylam bilgisi ile nasıl bilgiler alabileceğimizi göreceğiz.
Tüm bu bilgileri çekebileceğimiz neyseki bir Google Api'si mevcut. Enlem ve boylam bilgisini alan ve geriye çeşitli bilgiler geri döndüren bu api yi inceleyelim,

http://maps.google.com/maps/api/geocode/xml?latlng={latlng}&sensor={sensor}&region={region}

İlk parametre enlem,boylam ikinci parametre false olarak kullanacağımız sensör ve üçüncü parametremiz ise tr olarak kullanacağımız bölge değerlerini alacaktır.
İstanbul da rasgele bir nokta seçelim. Aslında bu noktada emulatörümüzü kullanabiliriz,

Emülatörümüzün sağ tarafında en alttaki butona tıklayarak Tools sayfamıza ulaşalım ve Location bölgesinde arama kutusuna İstanbul yazıp enter diyelim. İstanbula herhangi bir noktaya resimdeki gibi sizde işaretleyin. Alt kısımda işaretlediğiniz noktanın enlem ve boylam bilgilerine ulaşacaksınız.

http://maps.google.com/maps/api/geocode/xml?latlng=41.0843,028.9886&sensor=false&region=tr

Linki tarayıcımıza yapıştırdığımız da ise işaretlediğimiz nokta ile ilgili bir çok adres bilgisine ulaşacaksınız. Biz daha çok posta kodu olan "34060" sayısı ile ilgileniyoruz.
Ancak xml tasarımını inceleyecek olursak hemen hemen tüm elementler aynı isimde olduğu için posta kodunu yakalama işlemini biraz daha değişik bir şekilde yapacağız. Benim aklıma ilk gelen ayırt edici özellik 5 haneli bir girdi olmasının yanında bir de sayı olmasıydı. İşte tamda bunun için aşşağıdaki gibi bir kontrol algoritması yazalım.

public static bool isPostalCode(string postalCode)
        {
            bool durum = false;
                try
                {
                    if (postalCode.Length == 5)
                    {
                        Convert.ToInt32(postalCode);
                        durum = true;
                    }
                }
                catch
                {
                    durum = false;
                }
            return durum;
        }

String olarak aldığı posta kodu bilgisinin sayısal olup olmadığını öncelikle try-catch blokları arasında kontrol eden algoritmamız aynı zaman da if koşul bloğu ile de 5 haneli olup olmadığınıda gözden geçiriyor.
 

public static string getPlaka(string latitude, string longitude)
        {
            string plaka = "-1";
            XmlTextReader xmlDocument = new XmlTextReader("http://maps.google.com/maps/api/geocode/xml?latlng=" + latitude.Replace(',', '.').Trim() + "," + longitude.Replace(',', '.').Trim() + "&sensor=false®ion=tr");
            try
            {
                while (xmlDocument.Read())
                {
                    switch (xmlDocument.NodeType)
                    {
                        case XmlNodeType.Text:
                            {
                                if (isPostalCode(xmlDocument.Value))
                                {
                                    plaka = xmlDocument.Value.ToString();
                                    plaka = plaka.Substring(0, 2);
                                }
                                break;
                            }
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            return plaka;
        }

Plaka kodunu almak üzere ise yukarıdaki gibi kodumuzu yazıyoruz. Öncelikle kalıp olarak adresi alıyor sadece enlem ve boylam bilgisini parametreler ile dolduruyor ve dosyamızı xml okumaya maruz bırakıyoruz. Elementlerin arasında kalan kısımların okunması için xmlNodeType enum listesinindeki Text bilgisini kıstas olarak kullanıyor ve gelen her bilgiyi isPostalCode methoduna gönderiyoruz. True dönmesi halinde ise posta kodunun ilk 2 hanesini yani plaka bilgisini elde ediyor ve return ediyoruz.

Girdiğimiz bilgiler doğrultusunda 34 bilgisine ulaşıyor olacağız.
Her ne kadar makale adına bakacak olursak geriye şehir bilgisinin dönmesini bekleyenler olabilir ancak plaka bilgisin aldıktan sonra şehir bilgisine ulaşmak pek de zor denilemez :)
 

Bir sonraki makalem de görüşmek üzere, esen kalın :)

H.Burak TUNGUT
Bilgisayar Mühendisliği Öğrencisi

Yorum Bırak

Facebook
Son Yorumlar