Bing Maps SOAP Servislerini Kullanarak .Net Uygulaması Geliştirilmesi




Bing Maps SOAP Servislerini Kullanarak .Net Uygulaması Geliştirilmesi

Bilindiği gibi Bing Maps Ajax Control, web uygulamaları geliştirmek için ideal bir ajax etkileşimli bileşendir. Fakat öyle bir an gelir ki masaüstü uygulamalarımızda Bing Mapsin bize sunduğu hizmetleri kullanmamız gerekebilir. Bunun için Bing Maps in Soap servislerini kullanabiliriz.

Not : Soap (Simple Object Access Protocol) adı üstünde sunucu tarafındaki uygulamaların içerdiği nesnelere ulaşmak için kullanılan protokoldür. Daha fazla bilgi için soap servisleri ve web servisleri inceleyiniz.

Bu yazımda WPF(Windows Peresentation Foundation) ve C# kullanarak bir masaüstü uygulamasında Bing Maps Soap Servislerininin sunduğu Coğrafi kod, Görüntü, Rota ve Arama servislerini nasıl kullanacağımızı Msdn den de faydalanarak anlatmaya çalışacağım.

Peki bize neler gerekli?

Yukarda belirttiğimiz gibi uygulamayı WPF ve C# kullarak geliştireceğiniz bunun için;

Microsoft Visual Studio 2010

Bing Maps Platform geliştiricileri için bir adet hesabınız olması gerekli bu hesapla key alacağız.

Hesap açmak için https://www.bingmapsportal.com/ adresini kullabilirsiniz.

http://www.burhanemre.com/images/BingMapSoapServices/Pic1.png

Live id ile oturum açıp sonra hesap açabiliyormuşuz şimdi gördüm. Resimdeki Create butonuna tıkladıktan sonra live id niz ile Hotmail oturumunuz açmanız istenecek. Ardından aşağıdaki ilgili alanları doldurduktan sonra hesap açma işlemini tamamlamış olacaksınız.

http://www.burhanemre.com/images/BingMapSoapServices/Pic2.png

Save diyoruz ve artık hesabımız oluşturuldu.

.Net 3.0 framework veya üstü zaten VS2010 ile 4.0 geliyoor.

Visual Studio ile Wpf Projesi Açılması.

Visual Studio yu başlattıktan sonra File->New->Project Diyoruz ve aşağıda oludğu gibi C# Wpf Applicationu seçiyoruz. Ve OK.

http://www.burhanemre.com/images/BingMapSoapServices/Pic3.png

Gelelim en önemli kısma.

Bing Maps Key oluşturma

https://www.bingmapsportal.com/ adresine login olduktan sonra Soldaki görevler menüsünden Create or view keys linkine tıklayın.

Aşağıda görünen alanları uygun şekilde doldurun

http://www.burhanemre.com/images/BingMapSoapServices/Pic4.png

Application Name : Mesela biz uygulamamıza ne dedik WPFBingMaps

Application Url : Kafadan bir Url yazabilirsiniz şimdilik

Application Type : Developer olarak seçiyoruz.

Buradaki uygulama tipleri aşağıdaki anlamlara geliyor. Uygulamamızın senaryosuna göre bir type belirtmemiz gerekiyor. Bing Maps in kullanım koşullarına göre kullanıcı bu tiplerden birini seçmek zorunda. Sanırım bu sadece oluşabilecek yasal boşlukları ortadan kaldırmak için olabilir.

Broadcast : Video, televizyon veya daha küçük çapta görüntü yayını yapacak uygulamalar için

Developer : 12 ay içinde 125.000 oturumu ve 500.000 işlemi aşmayan uygulamalar için

Education : Öğrencilerin,  fakültelere bağlı kişilerin yani eğitimle alakalı olan kişiler için

Evaluation/Trial : Sadece 90 gün geçerli olacak uygulamalar için

Mobile : Mobil uygulamalar için

Not-for-profit : Vergiden muaf kuruluşların kullanacak olduğu uygulamar için

Enterprise : Sadece lisanslı kurumsal hesaplar için

Gördüğünüz gibi ilgili alanları doldurduktan sonra aşağıdaki gibi key imiz üretilmiş oldu

http://www.burhanemre.com/images/BingMapSoapServices/Pic5.png

Şimdi geldik programın ara yüzünün oluşturulmasına.

1. Anaformun boyutunu 600 X 700 yapın

2. Sol taraftaki toolbox ı kullanarak formun üst kısmına textInput adında bir TextBox ekleyin

3.       Hemen altına 2 adet Button controlü yerleştirin ilkinin text özelliğine “Coğrafi Kod” diğerinin Text Özelliğine ise “Coğrafi Kod u Ters Çevir” yazınız. Name özelliklerini de sırasıyla “Geocode” ve “ReverseGeocode” olarak değiştiriniz.

4.       Butonların da hemen altına “labelResults” adında bir Label ekleyiniz Boyutlarını kafanıza göre ayarlayınız.

5.       Hemen ardından “imageResults” adlı bir image kontrolü ekleyiniz ve bu kontrolü az önce koyduğumuz label ile boyutlar da dahil üst üste gelecek şekilde ayarlayınız. Visibility özelliğini “Hidden” ve “Stretch” özelliğini “None” yapınız.

İşlemler bittiğinde  Formunuz aşağıdaki gibi olmalı .

http://www.burhanemre.com/images/BingMapSoapServices/Pic6.png

Form tasarımı bittikten sonra geldik Bing Maps Soap servislerini projemize referans olarak eklemeye..

Nasıl ekleriz?

Öncelikle şunu söyleyelim biz aşağıdaki servisleri kullanacağız.

Namespace Address
GeocodeService http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc?wsdl

SearchService http://dev.virtualearth.net/webservices/v1/searchservice/searchservice.svc?wsdl
ImageryService http://dev.virtualearth.net/webservices/v1/imageryservice/imageryservice.svc?wsdl

RouteService http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc?wsdl

Servisleri projemize ekleme için Solution Explorer penceresinden References sağ tıklayın ve Add Service References tıklayın.

http://www.burhanemre.com/images/BingMapSoapServices/Pic7.png

http://www.burhanemre.com/images/BingMapSoapServices/Pic8.png

Gelen pencereden ilgili adres alanına tablodaki adresi ve Namespace alanına tablodaki Namespace i yazıyoruz.

Address : Soap Servisinin Adresi

Namespace : Kafanıza göre istediğinizi yazabilirsiniz. Yazdıgınız Namespace i using keywordu ile dahil ederken kullanacağız.

Tüm servisler için aynı işlemleri tekrarlıyoruz.

Bu işlemi yaptıktan sonra servisimizin projemize eklendiğini ve servisle beraber gelen sınıflar interfacelerin neler olduğunu görebilmekteyiz. Bunları tek tek incelemeye kalkmayalım :) . Aylar sürebilir.  :)

http://www.burhanemre.com/images/BingMapSoapServices/Pic9.pnghttp://www.burhanemre.com/images/BingMapSoapServices/Pic10.png

Reference ekleme işlemleri bittikten sonra formumuzun kod dosyasına servislerimizin Namespace lerini ekliyoruz

http://www.burhanemre.com/images/BingMapSoapServices/Pic11.png

Uygulamamızın temel mimarisi

Forma yerleştirdiğimiz butonlar ile her service için istekler göndereceğiz.

Bu istekleri gönderip ve sonucu görmek için

1.       Forma buton yerleştireceğiz ki biz daha önce yerşeltirdik

2.       Buton un Click olayına gerekli kodları yazarak sonucu label da veya image kontrolünde göstereceğiz.

Şimdi Servisleri teker teker kullanmaya başlayalım.

1. GeoCode Servisi

Geocode servisi Coğrafi kodların hangi yerleşim yerlerine veya haritanın neresine denk geldiğini veya belirtilen bir konumun Coğrafi kodunu geri gönderen servistir.

Aşağıda bu işlemi gerçekleştirip label kontrolünde göstereceğiz.

Windows1.xaml.cs kod dosyamızın içine

GeocodeAddress isimli string türünden adres değerini taşıyacak bir parametre alan method yazıyoruz.

Gecocode servisimiz GeocodeRequest nesnesi iste ve bu nesne içerisinde kimlik bilgimizi coğrafi kodu ve coğrafi kodun nasıl işleneceğini belirten seçenekler barındırır.

private String GeocodeAddress(string address)

{

string results = “”;

string key = “Alz2zrI_zR0QzkzJjicHVqeAiBxo****CpOY7gx90U79ZB_fzbgcbTKhfTlN9U”;

GeocodeRequest geocodeRequest = new GeocodeRequest();

// geçerli Kimlik bilgimizi isteği bildirecek nesnemize atıyoruz

geocodeRequest.Credentials = new GeocodeService.Credentials();

geocodeRequest.Credentials.ApplicationId = key;

// coğrafi kodumuzu yani adresimizi bildiriyoruz

geocodeRequest.Query = address;

// Sadece en iyi sonuçların geri gönderilmesi için en yüksek sonuçların gösterilmesini sonucu filtreleyerek belirtiyoruz.

ConfidenceFilter[] filters = new ConfidenceFilter[1];

filters[0] = new ConfidenceFilter();

filters[0].MinimumConfidence = GeocodeService.Confidence.High;

// Yukardaki filtreleme seçeneiğini isteğimize ekliyoruz

GeocodeOptions geocodeOptions = new GeocodeOptions();

geocodeOptions.Filters = filters;

geocodeRequest.Options = geocodeOptions;

// isteği karşı tarafa bildirmek için GeocodeServiceClient  nesnemizi yaratıyoruz

GeocodeServiceClient geocodeService = new GeocodeServiceClient(“BasicHttpBinding_IGeocodeService”);

GeocodeResponse geocodeResponse = geocodeService.Geocode(geocodeRequest);

//Eğer sonuç varsa bulunan sonuçları gönder

if (geocodeResponse.Results.Length > 0)

results = String.Format(“Latitude: {0}\nLongitude: {1}”,

geocodeResponse.Results[0].Locations[0].Latitude,

geocodeResponse.Results[0].Locations[0].Longitude);

else

results = “No Results Found”;

return results;

}

Şimdi yazdığımız bu methodu Butonumuz yardımı ile çağıralım ve sonuçları labelResults adını verdiğimiz label kontrülünde görüntüleyelim.

Bunu için Geocode adlı butonumuza çift tıklayalım. Butonun Click olay methodu otomatik oluşturulacaktır. Methodun içine aşağıdaki kodu yazarak yukarda yazdığımız istek methodunu test edelim.

private void Geocode_Click(object sender, RoutedEventArgs e)

{

labelResults.Content = GeocodeAddress(textInput.Text);

}

Yukardaki Methodu ilk çalıştırdığımızda aşağıdaki gibi bir hata ile karşılacağız.

http://www.burhanemre.com/images/BingMapSoapServices/Pic12.png

Bunun nedeni GeocodeServiceClient nesnemizin birtakım iletişim ayarlarının yapılmamış olmasıdır. Aslında bu ayarlar biz servis referanslarımızı eklerken otomatik olarak app.config dosyasına eklendi. Şöyle ki ;

<binding closeTimeout=”00:01:00″

openTimeout=”00:01:00″ receiveTimeout=”00:10:00″ sendTimeout=”00:01:00″

allowCookies=”false” bypassProxyOnLocal=”false” hostNameComparisonMode=”StrongWildcard”

maxBufferSize=”65536″ maxBufferPoolSize=”524288″ maxReceivedMessageSize=”65536″

messageEncoding=”Text” textEncoding=”utf-8″ transferMode=”Buffered”

useDefaultWebProxy=”true”>

<readerQuotas maxDepth=”32″ maxStringContentLength=”8192″ maxArrayLength=”16384″

maxBytesPerRead=”4096″ maxNameTableCharCount=”16384″ />

<security mode=”None”>

<transport clientCredentialType=”None” proxyCredentialType=”None”

realm=”" />

<message clientCredentialType=”UserName” algorithmSuite=”Default” />

</security>

</binding>

Yukarda görüldüğü gibi içinde birtakım iletişim kuralları bulunuyor. İstek zamanı bekleme zamanı hesap tip okunacak max bilgi falan flan.

Fakat biz bunu GeocodeServiceClient nesnemize bildirmedik. Ne yaptık? boş consructure ile nesneyi yarattık.

Yine aşağıda görüldüğü gibi

http://www.burhanemre.com/images/BingMapSoapServices/Pic13.png

Nesnemizin 5 adet constructure ı bulunmaktadır. 2. Si string türünde bir ConfigurationName istiyor işte buraya o app.Config deki ilgili Configuration tag inin name ini yazmamız gerekiyor.

Yani Nesnemizi ilgili satırın  :

GeocodeServiceClient geocodeService = new GeocodeServiceClient(“BasicHttpBinding_IGeocodeService”);

Şeklinde değiştirilmesi şart.

Daha fazla bilgi için : http://msdn.microsoft.com/en-us/library/cc981073.aspx

Ve sonuç :

http://www.burhanemre.com/images/BingMapSoapServices/Pic14.png

Reverse Geocode

Şimdi de Coğrafi kodu verilen bir yerin haritada nereye denk geldiğini bulalım

Bunun  için yine yukardaki gibi methodumuzu yazıyoruz. Bu kez adı : ReverseGeocodePoint

private string ReverseGeocodePoint(string locationString)

{

string results = “”;

string key = “Alz2zrI_zR0QzkzJjicHVqeAiB***rIbiKCpOY7gx90U79ZB_fzbgcbTKhfTlN9U”;

ReverseGeocodeRequest reverseGeocodeRequest = new ReverseGeocodeRequest();

// geçerli Kimlik bilgimizi isteği bildirecek nesnemize atıyoruz

reverseGeocodeRequest.Credentials = new GeocodeService.Credentials();

reverseGeocodeRequest.Credentials.ApplicationId = key;

// Adresi bulunacak coğraf kod noktalarını al

GeocodeService.Location point = new GeocodeService.Location();

string[] digits = locationString.Split(‘,’);

point.Latitude = double.Parse(digits[0].Trim());

point.Longitude = double.Parse(digits[1].Trim());

reverseGeocodeRequest.Location = point;

// Cografi kodun bulundugu adresi getir

GeocodeServiceClient geocodeService = new GeocodeServiceClient(“BasicHttpBinding_IGeocodeService”);

GeocodeResponse geocodeResponse = geocodeService.ReverseGeocode(reverseGeocodeRequest);

if (geocodeResponse.Results.Length > 0)

results = geocodeResponse.Results[0].DisplayName;

else

results = “No Results found”;

return results;

}

Yine daha önceden oluşturduğumuz ReverseGeocode adlı butonumuza çift tıklayarak click olay methodunun otomatik oluşmasını sağlıyoruz ve içine aşağıdaki satırı ekleyerek methodumuzu çağırıyoruz

private void ReverseGeocode_Click(object sender, RoutedEventArgs e)

{

labelResults.Content = ReverseGeocodePoint(textInput.Text);

}

Buraya kadar olan kısımda Geocode servisini kullanmış olduk.

http://www.burhanemre.com/images/BingMapSoapServices/Pic15.png

Bir sonraki servis

Search Service

Bu servis basit bir Ne/Nerede şeklinde parametre alarak aranılan şeyin aranılacak yerde arandıktan sonra bulunan sonuçları geri döndürür. J Cümleye bak be neyse örnekte daha iyi anlaşılıar.

Bunun için yine methodumuzu yazıyoruz. Adı : SearchKeywordLocation

private string SearchKeywordLocation(string keywordLocation)

{

String results = “”;

String key = “Alz2zrI_zR0QzkzJjicHVqeAiBxoe***OY7gx90U79ZB_fzbgcbTKhfTlN9U”;

SearchRequest searchRequest = new SearchRequest();

// geçerli Kimlik bilgimizi isteği bildirecek nesnemize atıyoruz

searchRequest.Credentials = new SearchService.Credentials();

searchRequest.Credentials.ApplicationId = key;

//Arama sorgumuzu yaratıyoruz

StructuredSearchQuery ssQuery = new StructuredSearchQuery();

//Burada parametremizin değerinin Ne/Nerede şeklinde oldğunu ve Ne;Nerede şeklinde noktalı virgülle ayrılarak yazıldığını varsayıyoruz

string[] parts = keywordLocation.Split(‘;’);

//noktalı virgülden önceki neyin aranacağını

//noktalı virgülden sonra aranacak şeyin nerede aranacağını belirtecek

ssQuery.Keyword = parts[0];

ssQuery.Location = parts[1];

searchRequest.StructuredQuery = ssQuery;

//Arama seçeneklerini belirliyoruz

searchRequest.SearchOptions = new SearchOptions();

//Sonucun nasıl filtrelenecegini belirtmek için filtreleme ifadesi kullanıyoruz.

//Yani diyoruz ki

searchRequest.SearchOptions.Filters =

new FilterExpression()

{

PropertyId = 3,//Property Id 3 olan yani kullanıcılar tarafından en çok oylanan yerleri al

CompareOperator = CompareOperator.GreaterThanOrEquals,//Aşağıdaki filter value dan büyük yada ona eşit olanları getir diyoruz

FilterValue = 8.16//Kullanıcı tarfından oylanan yerler 1 ile 10 arasında bir puan gibi bişey alır puanı 8.16 dan büyük yadan eşit olanları getir diyoruz

};

//Arama isteği için searchclient nesnemizi yaratıyoruz

SearchServiceClient searchService = new SearchServiceClient(“BasicHttpBinding_ISearchService”);

SearchResponse searchResponse = searchService.Search(searchRequest);

//Sonucu uygun formata çevir

if (searchResponse.ResultSets[0].Results.Length > 0)

{

StringBuilder resultList = new StringBuilder(“”);

for (int i = 0; i < searchResponse.ResultSets[0].Results.Length; i++)

{

resultList.Append(String.Format(“{0}. {1}\n”, i + 1,

searchResponse.ResultSets[0].Results[i].Name));

}

results = resultList.ToString();

}

else

results = “No results found”;

return results;

}

Forma bir adet buton daha ekiyoruz ve adına “Search” diyoruz. İçeriğine de “Arama” yazabilirsiniz. Çift tıklayarak click methodunun otomatik oluşturulmasını sağlıyoruz ve içine aşağıdaki satırı ekleyerek methodumuzu çağırıyoruz.

private void Search_Click(object sender, RoutedEventArgs e)

{

labelResults.Content = SearchKeywordLocation(textInput.Text);

}

Uygulamayı çalıştırdıktan sonra Textbox içine

sushi; Arvada, CO yazıyorum  bu demek oluyor ki Ben suşi arıyorum ve bunu Arvada da ve Colorado da arıyorum. Dikkat ettiyseniz araya noktalı virgül koydum. Çünkü kod içinde bu string veriyi parçalarken aradaki noktalı virgüle göre parçaladım. Başka karakter de koyabilirsiniz.

Ve sonuç :

http://www.burhanemre.com/images/BingMapSoapServices/Pic16.png

Bir sonraki Servis ;

Resim Servisi

Bu servisin 2 adet methodu vardır 1. Si belirtilen Coğrafi konumun resmini geri döndürür. 2. Si ise bu belirtilen konumdaki özel resmin metadatasını döndürür.

ImageServiceClient nesnesi ile image isteği ve bu image in nerede,hangi boyutta, zoom olarak mı vs gibi parametrelerin taşınması için de MapUriRequest nesnesini kullanacağız.

Yeni methodumuzun adı : GetImagery

private string GetImagery(string locationString)

{

string key = “Alz2zrI_zR0QzkzJjicHVqeAiBxoer***7gx90U79ZB_fzbgcbTKhfTlN9U”;

MapUriRequest mapUriRequest = new MapUriRequest();

// geçerli Kimlik bilgimizi isteği bildirecek nesnemize atıyoruz

mapUriRequest.Credentials = new ImageryService.Credentials();

mapUriRequest.Credentials.ApplicationId = key;

// İstenilen resmin Coğrafik konumunu alıyoruz

mapUriRequest.Center = new ImageryService.Location();

string[] digits = locationString.Split(‘,’);//textboxa virgül ile ayrıalrak yazaılcağı için string veriyi virgülün oldugu yerden parçalıyoruz

mapUriRequest.Center.Latitude = double.Parse(digits[0].Trim());

mapUriRequest.Center.Longitude = double.Parse(digits[1].Trim());

//Haritanın ne kadar yakınlaştırılarak resmin alınacağını ayarlıyoruz

MapUriOptions mapUriOptions = new MapUriOptions();

mapUriOptions.Style = MapStyle.AerialWithLabels;

mapUriOptions.ZoomLevel = 17;//17. seviyeye kadar yakınlaştırsın diyorz

// Alınacak resmin boyutunu ayarlıyoruz 200 X 200 boyutunda olacak

mapUriOptions.ImageSize = new ImageryService.SizeOfint();

mapUriOptions.ImageSize.Height = 200;

mapUriOptions.ImageSize.Width = 300;

mapUriRequest.Options = mapUriOptions;

//Oluşturulan Uri deki resmi almak için istek oluştur

ImageryServiceClient imageryService = new ImageryServiceClient(“BasicHttpBinding_IImageryService”);//App.config de ki ilgili configurasayon alanı

MapUriResponse mapUriResponse = imageryService.GetMapUri(mapUriRequest);

return mapUriResponse.Uri;

}

Yine Formumuza RequestImage adında bir button ekleyerek click methodunu aşağıdaki gibi

düzenliyoruz.

private void RequestImage_Click(object sender, RoutedEventArgs e)

{

// Make label hidden and image visible

labelResults.Visibility = Visibility.Hidden;

imageResults.Visibility = Visibility.Visible;

//Get URI and set image

String imageURI = GetImagery(textInput.Text);

imageResults.Source = new BitmapImage(new Uri(imageURI));

}

Ve Sonuç :

http://www.burhanemre.com/images/BingMapSoapServices/Pic17.png

Servisimizin 2. Methodu olan metadata yı inceleyelim. Bing maps daki her resim bir metadata ile etiketlenmiştir. Metadata içinde resim ile ilgili erişmek isteyeceğimiz resimin zoom aralığı vs. gibi bilgiler bulunur.

MetaData  bilgisine erişmek için yeni yazacağımız method un adı : RequestImageMetadata

private string RequestImageMetadata(string locationString)

{

string results = “”;

string key = “Alz2zrI_zR0QzkzJjicHVqeAiBxoerIbiKC***79ZB_fzbgcbTKhfTlN9U”;

ImageryMetadataRequest metadataRequest = new ImageryMetadataRequest();

// geçerli Kimlik bilgimizi isteği bildirecek nesnemize atıyoruz

metadataRequest.Credentials = new ImageryService.Credentials();

metadataRequest.Credentials.ApplicationId = key;

// Metadatası alınacak resmin Cografi kodunu al

ImageryService.Location centerLocation = new ImageryService.Location();

string[] digits = locationString.Split(‘,’);

centerLocation.Latitude = double.Parse(digits[0].Trim());

centerLocation.Longitude = double.Parse(digits[1].Trim());

//Seçenekleri belirle yani ;

metadataRequest.Options = new ImageryMetadataOptions();

metadataRequest.Options.Location = centerLocation;//Merkez metadatası

metadataRequest.Options.ZoomLevel = 10;//Yakınlaştırma seviyesini getir

metadataRequest.Style = MapStyle.AerialWithLabels;//Etiketleri de getir

// MetaData isteği için nesneyi yarat

ImageryServiceClient imageryService = new ImageryServiceClient(“BasicHttpBinding_IImageryService”);//App.config de ki ilgili configurasayon alanı

ImageryMetadataResponse metadataResponse =

imageryService.GetImageryMetadata(metadataRequest);

ImageryMetadataResult result = metadataResponse.Results[0];

if (metadataResponse.Results.Length > 0)

results = String.Format(“Uri: {0}\nVintage: {1} to {2}\nZoom Levels: {3} to {4}”,

result.ImageUri,

result.Vintage.From.ToString(),

result.Vintage.To.ToString(),

result.ZoomRange.From.ToString(),

result.ZoomRange.To.ToString());

else

results = “Metadata is not available”;

return results;

}

Yine Formumuza RequestMetaData adında bir button ekleyerek click methodunu aşağıdaki gibi

düzenliyoruz.

private void RequestMetaData_Click(object sender, RoutedEventArgs e)

{

labelResults.Content = RequestImageMetadata(textInput.Text);

}

Ve Sonuç :

http://www.burhanemre.com/images/BingMapSoapServices/Pic18.png

Bir sonraki servisimiz ;

Route Service

Bu servis iki coğrafi konum arasındaki rotayı, yani 1. Noktadan 2. Noktaya nasıl gidileceği bilgisini geri döndürür.

Bu servis için yazacağımız methodun adı : CreateRoute

Rotanın Hesaplanması :

RouteRequest nesnesi iki nokta arasındaki rotayı hesaplar ve bu hesaplama için içerisinde hesaplanan noktaları ve bu noktaların nasıl hesaplanacağı gibi veriler taşır.

Methodun oluşturulması :

Bu method çok karmaşık bir sonuç geri döndürecek. Sonuç içinde RouteLeg nesneleri bulunur. Her RouteLeg 2 kısımdan oluşur ve bu kısmlar ayrı ayrı ItineraryItem nesnesi içerir. Bu veri Xml verisi olarak bize sunulur. Biz bu xml i okuyarak bize gerekli olan ksımları elde edeceğiz.

Öncelikle using System.Text.RegularExpressions; namespace ini kod dosyamıza ekliyoruz çünkü sonucu düzenli bir formata çevirmek için Regex nesnesini kullanacağız.

private string CreateRoute(string waypointString)

{

string results = “”;

string key = “Alz2zrI_zR0QzkzJjicHVqeAiBxoe****CpOY7gx90U79ZB_fzbgcbTKhfTlN9U”;

RouteRequest routeRequest = new RouteRequest();

// geçerli Kimlik bilgimizi isteği bildirecek nesnemize atıyoruz

routeRequest.Credentials = new RouteService.Credentials();

routeRequest.Credentials.ApplicationId = key;

//Rotası çıkarılacak 2 adet cografi konumu al

string[] points = waypointString.Split(‘;’);

Waypoint[] waypoints = new Waypoint[points.Length];

int pointIndex = -1;

foreach (string point in points)//Ne kadar nokta varsa hepsini al o noktalar üzerinden rota oluştur

{

pointIndex++;

waypoints[pointIndex] = new Waypoint();

string[] digits = point.Split(‘,’); waypoints[pointIndex].Location = new RouteService.Location();

waypoints[pointIndex].Location.Latitude = double.Parse(digits[0].Trim());

waypoints[pointIndex].Location.Longitude = double.Parse(digits[1].Trim());

if (pointIndex == 0)

waypoints[pointIndex].Description = “Start”;//başlangıc noktası

else if (pointIndex == points.Length)

waypoints[pointIndex].Description = “End”;//bitiş noktası

//bu noktalar ; ile ayrılıyor

else

waypoints[pointIndex].Description = string.Format(“Stop #{0}”, pointIndex);

}

routeRequest.Waypoints = waypoints;

// Rotayı hesapla

RouteServiceClient routeService = new RouteServiceClient(“BasicHttpBinding_IRouteService”);

RouteResponse routeResponse = routeService.CalculateRoute(routeRequest);

// Rota direktiflerini almak için tüm içeriği gez

StringBuilder directions = new StringBuilder(“”);

if (routeResponse.Result.Legs.Length > 0)

{

int instructionCount = 0;

int legCount = 0;

foreach (RouteLeg leg in routeResponse.Result.Legs)

{

legCount++;

directions.Append(string.Format(“Leg #{0}\n”, legCount));

foreach (ItineraryItem item in leg.Itinerary)

{

instructionCount++;

directions.Append(string.Format(“{0}. {1}\n”,

instructionCount, item.Text));

}

}

//dönen içerikteki Diğer tüm gereksiz taglari sil

//Sonucu formatlama istiyorsak aşağıdakini kullanabiliriz

Regex regex = new Regex(“<[/a-zA-Z:]*>”,

RegexOptions.IgnoreCase | RegexOptions.Multiline);

results = regex.Replace(directions.ToString(), string.Empty);

}

else

results = “No Route found”;

return results;

}

Yine Formumuza Route adında bir button ekleyerek click methodunu aşağıdaki gibi

düzenliyoruz.

private void Route_Click(object sender, RoutedEventArgs e)

{

labelResults.Content = CreateRoute(textInput.Text);

}

Ve Sonuç :

http://www.burhanemre.com/images/BingMapSoapServices/Pic19.png

Route ile ilgili bir method daha var ona değinmek istiyorum. CalculateRoutesFromMajorRoads

Major Route : Bu method ise girdiğimiz iki nokta arasındaki minimun yani en kısa yolu belirmek için bir hesaplama yapıyor.

Yeni methodumuzun adı : CreateMajorRoutes

private string CreateMajorRoutes(string locationString)

{

string results = “”;

MajorRoutesRequest majorRoutesRequest = new MajorRoutesRequest();

string key = “Alz2zrI_zR0QzkzJjicHVqeAiBxoe***90U79ZB_fzbgcbTKhfTlN9U”;

// geçerli Kimlik bilgimizi isteği bildirecek nesnemize atıyoruz

majorRoutesRequest.Credentials = new RouteService.Credentials();

majorRoutesRequest.Credentials.ApplicationId = key;

//Minimum yol için hedeflenen rota bilgisini ayarla

Waypoint endPoint = new Waypoint();

endPoint.Location = new RouteService.Location();

string[] digits = locationString.Split(‘,’);

endPoint.Location.Latitude = double.Parse(digits[0].Trim());

endPoint.Location.Longitude = double.Parse(digits[1].Trim());

endPoint.Description = “Location”;

// Tüm rota direktiflerini gösterecek seçeneği ayarla

MajorRoutesOptions options = new MajorRoutesOptions();

options.ReturnRoutes = true;

majorRoutesRequest.Destination = endPoint;

majorRoutesRequest.Options = options;

// En kısa yol için istek nesnemizi yaratıyoruz

RouteServiceClient routeService = new RouteServiceClient(“BasicHttpBinding_IRouteService”);

// MajorRoutesResponse nesnemiz ile en kısayolu hesaplattrıyoruz

MajorRoutesResponse majorRoutesResponse = routeService.CalculateRoutesFromMajorRoads(majorRoutesRequest);

Regex regex = new Regex(“<[/a-zA-Z:]*>”,

RegexOptions.IgnoreCase | RegexOptions.Multiline);

if (majorRoutesResponse.StartingPoints.Length > 0)

{

StringBuilder directions = new StringBuilder();

for (int i = 0; i < majorRoutesResponse.StartingPoints.Length; i++)

{

directions.Append(String.Format(“Coming from {1}\n”, i + 1,

majorRoutesResponse.StartingPoints[i].Description));

for (int j = 0;

j < majorRoutesResponse.Routes[i].Legs[0].Itinerary.Length; j++)

{

//Strip tags

string step = regex.Replace(

majorRoutesResponse.Routes[i].Legs[0].Itinerary[j].Text, string.Empty);

directions.Append(String.Format(“     {0}. {1}\n”, j + 1, step));

}

}

results = directions.ToString();

}

else

results = “No Routes found”;

return results;

}

Yine Formumuza “MajorRoutes” adında bir button ekleyerek click methodunu aşağıdaki gibi düzenliyoruz.

private void MajorRoutes_Click(object sender, RoutedEventArgs e)

{

labelResults.Content = CreateMajorRoutes(textInput.Text);

}

Ve sonuç :

http://www.burhanemre.com/images/BingMapSoapServices/Pic20.png

Özet :

Wpf ve C# dilini kullanarak bir masaüstü uygulaması geliştirdik.

Bing Maps AJAX Control olmadan sadece Serviceleri kullnarak Bing Maps i kullandık.

Bing Maps servislerini kullanmak için key temin ettik.

RouteServiceClient,ImageryServiceClient,GeocodeServiceClient,SearchServiceClient

Nesnelerini kullanarak istek gönderdik.

Resimli olarak Bing Maps Soap Servislerinin nasıl kullanılacağını gösterdik.

Örnek Uygulamayı Aşağıdan indirebilrisiniz.

indir

Makalenin Word Belgesi versiyonu için Tıklayınız

Popularity: 4% [?]




1 Star2 Stars3 Stars4 Stars5 Stars (2 votes, average: 5,00 out of 5)
Loading ... Loading ...
    • zep
    • 7 Eylül 2011

    güzel konu ve anlatım,çok yararlı oldu. teşekkürler..

 

Sitemizi N/A kişi takip ediyor.Aşağıdaki kutucuğa e-posta adresinizi girin sitemize yeni eklenen içerikten haberiniz olsun...

Sitemize üye olduktan sonra, e-posta adresinize bir onay maili gelecek. O maili onaylamazsanız, üyeliğiniz tamamlanmaz. 

RSS okuyucu ile takip edin...