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