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.

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.

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.

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

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

Ş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ı .

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.
Servisleri projemize ekleme için Solution Explorer penceresinden References sağ tıklayın ve Add Service References tıklayın.


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.


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

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.

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

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ç :

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ç :

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ç :

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ç :

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ç :

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ç :

Ö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.
Makalenin Word Belgesi versiyonu için Tıklayınız
Popularity: 4% [?]


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