C# ve Google Reverse GeoCoding Kullanımı

Batuhan Düzgün tarafından yayınlanmıştır 10. February 2012 08:06

Merhaba arkadaşlar , uzun bir aradan sonra tecrübe ettiğim konuları ve bilgileri paylaşmak adına makalelerime devam ediyorum. Yaklaşık 6-7 aylık uzun bir ara vermek zorunda kaldım. Hosting firması ile yaşadığım sorunlar nedeniyle ve son sınıf olmamın verdiği yoğunluk sebebiyle bu süre uzadı.

 

Bu makalemizin konusu en etkili kullanabildiğim programlama dillerinden biri olan C# ile Google Reverse GeoCoding teknolojisini incelemek olacaktır.

 

Google Reverse GeoCoding Nedir?

Google Reverse Geo Coding, Google’ın bizlere sunmuş olduğu konum bilgisi sorgulama teknolojisidir. Bu teknolojide, Javascript API’ler ile veya HTTP protokolünü kullanarak , yani GET-POST yöntemlerini kullanarak  , verilen enlem-boylam koordinatlarında yer alan adresi öğrenebildiğimiz bir yapıya sahiptir.

Bizim yapacağımız yöntemde HTTP protokolü üzerinden bir WebRequest yapıp bunun sonucunda dönen WebResponse cevabındaki veriyi ayıklayıp işe yarar hale getirmek olacaktır. Yapılan WebRequest isteğinin sonuç formatı JSON ve XML tabanlı alınabilir. Biz JSON formatında bir sonuç alacağız ve bir sonraki makalede  JSON formatında  aldığımız WebResponse cevabı nasıl ayrıştırıp, veritabanına kaydettiğimizi göstereceğim.

Örneğin : Aşağıda verilen linkte ilgili link ile bir WebRequest yapıldığında  40.565656 ve 56.23942823 koordinatlarına ait adres bilgisini eldebiliyoruz.

"http://maps.google.com/maps/geo?q=40.56565656,56.23942823&sensor=false&output=json&sensor=false&key=ABQIAAAA3lJ6auW4FmhoVG_dtMJ6xTMd7dQWYwJ4W1aWrlt9eXBgn5luxRmRmIpGW95R0MuycWRB9kj15PtPA"

 

Projenin Hazırlanması

İlk iş olarak veritabanımızı oluşturuyoruz. Veritabanımızın adını  “CoordinatesDB” olarak belirledim. Daha sonra bu veritabanına iki adet tablo ekleyelim. İlk tablomuz konum bilgilerinin tutulacağı tablodur. İsmine  “Position” olarak belirledim. Aşağıda tabloyu Create ettiğim T-SQL kodu mevcuttur.

Hemen ardından Google Reverse GeoCoding’den  konum sorgulama sonucu gelen adres bilgisini ve konum bilgisini tutacağımız tablomuzu Create ediyoruz.

Yukarıdaki tablo koordinat bilgilerini , Google Reverse GeoCoding ‘ den dönen adres bilgisini ve HttpWebRequest ile HttpWebResponse arasında geçen ölçülen zaman değerini  tutacağız.

 

Karakter Katarı İşleyen Sınıf …

Aşağıda yazmış olduğum sınıf yapısı, karakter katarı işleme ve WebRequest için gerekli olan link bilgisinin son halinin oluşturulduğu metodları içermektedir.

 

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

 

namespaceGoogleReverse_NT_Service_App

{

    class GoogleReverseGeoCodingClass

    {

        //Linke ait değişiklik göstermeyen karakter katarı ifadeleri

        //Prefix adlı değişkendi ifade google linki ve geo sözcüğü ile bunun bir geo sorgusu olduğunu belirtiyoruz.

        string Prefix = "http://maps.google.com/maps/geo?q=";

 

        //sensor ise GPS sinyal verici gibi sinyal yayan bir cihazdan mı okuma yapacağız kısmıdır. Biz false işaretliyoruz.

        //output ise json formatında alıyoruz. İsterseniz XML formatta alıp, XML parser ile ayrıştırabilirsiniz.

        // key ise google account ile aldığımız tekil bir ifadedir.

        string PostFix = "&sensor=false&output=json&sensor=false&key=ABQIAAAA3lJ6auW4Fmh-oVG_dtMJ6xTMd7dQWYwJ4W1aWrlt9eXBgn5luxRmRmIpGW95R0MuycWRB9kj15PtPA";

 

        //Enlem Boylam bilgisini tuttuğumuz değişkenler.

        double XCoordinate = 0.0;

        double YCoordinate = 0.0;

 

        //Konum bilgilerini set ettiğimiz metod. X ve Y bilgisini set ediyoruz.

        public void SetParameters(double X, double Y)

        {

            this.XCoordinate = X;

            this.YCoordinate = Y;

        }

 

        //WebRequest için hazırladığımız link bilgisini aldığımız metod.

        public string GetGoogleLink()

        {

            string TempStr = string.Empty;

 

            TempStr = Prefix + this.XCoordinate.ToString().Replace(',', '.') + "," + this.YCoordinate.ToString().Replace(',', '.') + PostFix;

 

            return TempStr;

        }

    }

}

 

 

HttpWebRequest – HttpWebResponse  ile HTTP protokolü kullanımı …

 

HTTP protokolü istek ve cevap mantığında çalışır. C# programlama dilinde bu protokolü kullanabileceğimiz çeşitli sınıflar verilmiştir. Bunlar iki tanesi  HttpWebRequest ve HttpWebResponse  sınıflarıdır. Bu yapılar sayesinde HTTP protokolünden istek ve cevap mekanizması ile sonuçlar alınabilir. Aşağıda açıklamaları ile birlikte yazılmış olan kodlar mevcuttur.

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Net;

usingSystem.IO;

 

namespaceGoogleReverse_NT_Service_App

{

    class HttpProtocolProcess

    {

        //Webrequest oluşturulan C# sınıfıdır.

        HttpWebRequest GoogleRequest;

        //Yapılan request sonucunda bize dönen cevabı alınan WebResponse veri tipi ve ona ait olan nesne ismi.

        HttpWebResponse GoogleResponse;

        //Googlelink bilgisini tutulduğu değişken.Bu link ifadesi ile birlikte WebRequest oluşturulur.

        string GoogleLink = string.Empty;

        //JSON formatında dönen sonucun tutulduğu değişkendir.

        string JSON_ResultText = string.Empty;

 

        //HTTP protokolunü çalıştırdığımız metoddur.

        public void RunHttpProtocol()

        {

            //WebRequest'i create metoduyla oluşturulur.

            GoogleRequest = (HttpWebRequest)WebRequest.Create(this.GoogleLink);

            //Artık istek yaptıktan sonra dönen cevabı yakalamak gereklidir.

            //Bunu GetResponse metodu kullanarak yapıyoruz.

            GoogleResponse = (HttpWebResponse)GoogleRequest.GetResponse();

 

            //Gelen response cevabı okunabilir karakter katarlarına çevirmek için gelen cevabı Stream şeklinde alıyoruz.

            Stream GoogleResultStream = GoogleResponse.GetResponseStream();

 

            //StreamReader ile birlikte Stream nesnesi ReadToEnd metoduyla sonuna kadar okunur.

            StreamReader GoogleResultReader = new StreamReader(GoogleResultStream);

 

            //Stream karakter katarına çevrilir.

            JSON_ResultText = GoogleResultReader.ReadToEnd();

        }

 

        //Google Linkin set edildiği metod.

        public void SetGoogleLink(string LinkGoog)

        {

            GoogleLink = LinkGoog;

        }

 

        //JSON Sonuç metninin  çağrıldığı yere döndürüldüğü metod.

        public string GetJSON_ResultText()

        {

            return this.JSON_ResultText;

        }

    }

}

 

 

Şimdi kurgulanılan senaryo  şu şekilde veritabanından konum bilgisini alınır, ki “Position” adlı tablodan alınır , daha sonra bu konum bilgilerini Google Reverse GeoCoding mekanizmasına gönderilerek sorgulanır. Eğer ki status bilgisi 200 kodu gelmişse işlem başarılır. Fakat , her şeye rağmen parse edilen JSON sonucundan gelen adres bilgisinin boş olup olmadığı kontrol edilmelidir.

Şimdi de veritabanı işlemlerinin yapıldığı ve JSON sonucunun alındığı kodlar yazılır.

publicvoid Position1CoordinatesGet()

        {

 

    GoogleReverseGeoCodingClass GoogleLinkObject = new GoogleReverseGeoCodingClass();

    HttpProtocolProcess HttpProcolObject = new HttpProtocolProcess();

 

            Connecter1.Open();

 

            Commander1.CommandType = CommandType.StoredProcedure;

            Commander1.Parameters.Add("@ProcessTypeIndex", SqlDbType.Int).Value = 0;

 

            SqlDataReader RecordReader = Commander1.ExecuteReader();

 

                double XCoordi = 0.0;

                double YCoordi = 0.0;

 

                    while (RecordReader.Read())

                    {

                        XCoordi = Convert.ToDouble(RecordReader.GetValue(0));

                        YCoordi = Convert.ToDouble(RecordReader.GetValue(1));

 

                        GoogleLinkObject.SetParameters(XCoordi, YCoordi);

                         HttpProcolObject.SetGoogleLink(GoogleLinkObject.GetGoogleLink());

 

                        HttpProcolObject.RunHttpProtocol();

 

                        Thread.Sleep(20);

 

                        string Result = HttpProcolObject.GetJSON_ResultText();

 

                        JObject JSONParser = JObject.Parse(Result);

 

                        int Status = (int)JSONParser["Status"]["code"];

 

                        JArray RootJSON = (JArray)JSONParser["Placemark"];

 

                        string AddressofCoordinates = string.Empty;

 

                    }

             

                RecordReader.Close();

                Connecter1.Close();

 

        }

 

Yukarıdaki kodlarda SqlConnection ile bağlantı açılır , ardından SqlCommand ile ilgili Stored Procedure işletilir. Daha sonra ExecuteReader ile adım adım okuma yapmak için tablo ile canlı bağlantı içinde olan bir yapı kurulur. Ve while döngüsü içerisinde kayıtlar sırayla okunup , Google Reverse GeoCoding mekanizmasına sorgulanmak üzere gönderilir. İsterseniz hemen projemizi derleyim ve sonuçları görelim. Aşağıda kullanılan Stored Procedure açıkça verilmiştir.

 

SELECTXCoordinate,YCoordinate FROM (SELECT XCoordinate,YCoordinate,ROW_NUMBER() OVER(ORDER BY ID) AS OrderID FROM Position) AS TempTbl;

 

Sonuç …

Uygulamamızı  BreakPoint koyarak takip ediyoruz. Dönen sonuç yukarıda incelenmiştir. Gelen cevap JSON formatındadır.

 

Bir sonraki makalede JSON formatında glen veriyi ayrıştırıp, ilgili tabloya kaydetmeyi göstereceğim. Bir sonraki makalemde görüşmek dileğiyle …

 

Batuhan Düzgün

Bilgisayar Mühendisi

Endüstri Mühendisi 

Currently rated 5.0 by 1 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler:

C#

Comments

Add comment


(Will show your Gravatar icon)  

  Country flag

biuquote
  • Comment
  • Preview
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.

Batuhan Düzgün

Sakarya Üniversitesi 

Bilgisayar Mühendisi

Endüstri Mühendisi

Yeditepe Üniversitesi

Bilgisayar Mühendisliği Yüksek Lisans 

 sahibinden.com

   Kıdemli Uzman Yazılım Mühendisi  

E-Mail 

   batuhan.duzgun@sahibinden.com

   batuhan.duzgun@windowslive.com

  github.com/batux

 

Sayfalar

Calendar

<<  September 2018  >>
MoTuWeThFrSaSu
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

Yazıları geniş takvimde göster