Makale Özeti

Merhaba arkadaşlar yazarlıktaki ilk makalem umarım yararlı olur... Bing Maps SOAP Servislerinden ve nasıl kullanıldığından bahsedeceğiz...

Makale

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 bir 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.

Bing Maps .Net by NoVoLuMePic1.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.
Bing Maps .Net by NoVoLuMePic2.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.

Bing Maps .Net by NoVoLuMePic3.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

Bing Maps .Net by NoVoLuMePic4.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

Bing Maps .Net by NoVoLuMePic5.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ı .

Bing Maps .Net by NoVoLuMePic6.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.

Bing Maps .Net by NoVoLuMePic7.png

Bing Maps .Net by NoVoLuMePic8.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 J. Aylar sürebilir. J

Bing Maps .Net by NoVoLuMePic10.pngBing Maps .Net by NoVoLuMePic9.png

 

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

Bing Maps .Net by NoVoLuMePic11.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. Bing Maps .Net by NoVoLuMePic12.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 name="BasicHttpBinding_IGeocodeService" 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üğü gibiBing Maps .Net by NoVoLuMePic13.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ç :

Bing Maps .Net by NoVoLuMePic15.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. 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ç :

Bing Maps .Net by NoVoLuMePic16.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ç :

Bing Maps .Net by NoVoLuMePic17.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_zR0QzkzJjicHVqeA***IbiKC***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ç :

Bing Maps .Net by NoVoLuMePic18.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_zR0QzkzJjicHVqeAiBxoerI***OY7gx90U79ZB_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ç :

Bing Maps .Net by NoVoLuMePic19.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_zR0QzkzJjicHVqeAiBxoerIbiK***x90U79ZB_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ç :

Bing Maps .Net by NoVoLuMePic20.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ı Download kısmından indirebilrisiniz.

 

 

Kaynak : http://msdn.microsoft.com/en-us/library/dd221354.aspxBing Maps Hesabı

Örnek Uygulama