Facebook RSS Feed
 

.NET Micro Framework: Harita Göstermek (Google Maps API)

.NET Micro Framework sayesinde bilgisayarlarımızda kullandığımız harita uygulamalarını kolaylıkla mikrodenetleyici üzerinde çalıştırabiliyoruz. Geliştireceğimiz uygulama ile belirlediğimiz koordinatın haritasını LCD üzerinde gösterip bu görüntü üzerinde yön tuşlarıyla gezineceğiz. Önceki yazlarımda anlattığım GPS projesi ile birleştirip çok kısa sürede kendi navigasyon sisteminizi oluşturabilirsiniz.

Harita Görünümleri

Static Maps API'si bize 4 farklı görünüm sunuyor. Road, satellite, terrain ve hybrid.

- -
Road Map Görünümü
 
Satellite Görünümü
 
- -
Terrain Görünümü Hybrid Görünümü

Çalışma Mantığı

Karmaşık gibi görünen harita gösterme uygulaması aslında çok basit bir temele dayanıyor. Harita görünümünü almak istesiğimiz bölgenin koordinatlarını web adresi olarak sunucuya gönderiyoruz. Sunucu da bize haritayı resim olarak gönderiyor. Gelen resmi çözümlemek için WebClient sınıfını kullanıyoruz ve haritayı ekran çözünürlüğünde bir bitmap aracılığıyla ekrana yansıtıyoruz.

Sunucuya gönderdiğimiz adres:
http://maps.google.com/staticmap?center=41.010,28.97&zoom=12&size=320x240&maptype=roadmap&mobile=true&format=gif
formatında. Enlem, boylam, zoom seviyesi, harita boyutu ve resim formatını içeriyor. Google Static Maps API hakkında detaylı bilgiye http://code.google.com/apis/maps/documentation/staticmaps/ adresinden ulaşabilirsiniz.

Uygulama Kodları

Öncelikle bir Micro Framework 4 Window Application oluşturup projeye WebClient.cs classını ekleyin. Dosyanın içini aşağıdaki kutuda yer alan kodlarla değiştirin. WebClient sınıfı Micro Framework ile İnternet üzerindeki resimleri bitmap biçiminde yakalamamızı sağlayacaktır.

Proje referansları arasına Microsoft.SPOT.Hardware.dll'i ekleyin. Program.cs dosyasına aşağıdaki namespaceleri ekleyerek kodlamaya başlayalım:

using System;
using System.Threading;
using System.Net;
using System.Net.Sockets;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using Microsoft.SPOT.Input;
using Microsoft.SPOT.Presentation;

Global değişkenler: Uygulama başlayınca ekranda ortalanmasını istediğiniz koordinatları enlem ve boylam değişkenlerine yazın. Yakınlık değeri 0 ile 21 arasında değişmektedir. 0 en uzak görünüm yani tüm dünya haritasını gösterirken, 21 ise sokak detayına kadar inmektedir. Harita tipi değişkenini ise roadmap, satellite, hybrid, yada terrain olarak değiştirebilirsiniz.

double enlem = 41.01;          //Başlangıç enlemi
double boylam = 28.97;         //Başlangıç boylamı
int yakinlik = 13;             //Zoom seviyesi
string haritaTipi = "roadmap"; //Haritanın türü

Harita Güncelleme metodu, yukarıda belirlediğimiz koordinatları URL formatında WebClient sınıfına gönderir. WebClient ise haritayı Bitmap dosyası olarak almamızı sağlayacaktır.

private void HaritaGuncelle(double enlem, double boylam, int yakinlik, string haritaTipi)
{
  try
  {
    WebClient web = new WebClient("maps.google.com", 80);

    //Ekranın çözünürlüğünü sorgulatıp o boyutlarda bir Bitmap oluşturalım:
    Bitmap harita = new Bitmap(SystemMetrics.ScreenWidth, SystemMetrics.ScreenHeight);

    //Web Client'dan haritayı resim olarak alıp harita bitmapine aktaralım:
    harita.DrawImage(0, 0,
      (Bitmap)web.GetContent("/staticmap?center="
      + enlem.ToString() + "," + boylam.ToString()
      + "&zoom=" + yakinlik.ToString()
      + "&size=" + SystemMetrics.ScreenWidth.ToString()
      + "x" + SystemMetrics.ScreenHeight.ToString()
      + "&maptype=" + haritaTipi
      + "&mobile=true&format=gif",
      WebClient.ContentType.Image, WebClient.HttpVersion.V_11), 0, 0, harita.Width, harita.Height);

    //Haritanın aktarıldığı Bitmap'i ekrana yazdıralım:
    harita.Flush();
  }
  catch (Exception ex)
  {
    Debug.Print(ex.Message);
  }
}

Simulatör yada kit üzerindeki yön tuşları ile haritayı kaydırabilmemiz için buton up interruptına aşağıdaki kod bloğunu ekleyelim. Yön tuşları haritayı kaydırırken, onay tuşu ise harita modunu (sokak, uydu vs...) değiştirecektir.

private void OnButtonUp(object sender, ButtonEventArgs e)
{
  switch (e.Button)
  {
    //Simulatör yukarı butonu
    case Button.VK_UP:
      enlem += 0.01;
      HaritaGuncelle(enlem, boylam, yakinlik, haritaTipi);
      break;

    //Simulatör aşağı butonu
    case Button.VK_DOWN:
      enlem -= 0.01;
      HaritaGuncelle(enlem, boylam, yakinlik, haritaTipi);
      break;

    //Simulatör sol butonu
    case Button.VK_LEFT:
      boylam -= 0.01;
      HaritaGuncelle(enlem, boylam, yakinlik, haritaTipi);
      break;

    //Simulatör sağ butonu
    case Button.VK_RIGHT:
      boylam += 0.01;
      HaritaGuncelle(enlem, boylam, yakinlik, haritaTipi);
      break;

    //Simulatör onay butonu
    case Button.VK_SELECT:
      switch (haritaTipi)
      {
        case "roadmap":   haritaTipi="satellite"; break;
        case "satellite": haritaTipi="hybrid";    break;
        case "hybrid":    haritaTipi="terrain";   break;
        case "terrain":   haritaTipi="roadmap";   break;
        default: break;
      }
      HaritaGuncelle(enlem, boylam, yakinlik, haritaTipi);
      break;

    default:
      break;
  }
}

Şimdi uygulamamızı simulatörde çalıştırarak deneyebiliriz. Google tarafından sağlanan harita API'sinin IP başına saatlik harita gösterme sayısı sınırlı olduğu için yaklaşık 100 güncellemeden sonra 1 saat hizmet vermeyecektir. Bu süreç içinde Visual Studio Immediate Window'da Exception Thrown mesajı görünecektir.

-

Google Maps API sayfasında anlatılan yöntemlerle harita üzerine pinler yerleştirip yol ve alan çizimi yapabilirsiniz.

Uygulamanın kaynak kodlarını buradan indirebilirsiniz.




 
Hoşgeldiniz!
Son güncelleme: 25.12.2016
-
Yeni Teknik Yazılar
Latte Panda İncelemesi
Turta IoT HAT İncelemesi
USB Gamepad Kullanımı
GPIO Kullanımı
VEML6075 UV Sensör Kullan...
-
İlgili Gruplar
.NET MF ve Gadgeteer FB Grubu
İst. IoT & Wearables Meet-up
-
 

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.Copyright © 1999 - 2017, Umut Erkal. Bu materyal, "Creative Commons Public Licence" ile sunulmuştur.
Kaynak göstererek ve ücretsiz olarak, aynı şartlar altında paylaşabilir ve kullanabilirsiniz. | Kullanım Sözleşmesi