Coğrafi Bilgi Sistemleri Yazılımı ve Uygulamaları

31 Tem

Bir önceki coğrafi bilgi sistemleri nedir başlıklı yazımızda, CBS konusu hakkında ön bilgi vermeye çalışmıştık. CBS uygulamalarının kullanım alanları ve amaçlarından bahsetmiştik. Bu yazımızda da CBS uygulamaları konusunda konuşacağız.

CBS uygulamalarının yazılım kısmı, önceden hazırlanan harita verilerinin WEB ortamında dış dünyaya sunulmasını gerçekleştirmektedir.

Yazılım geliştirme konusunda CBS uygulamalarında genellikle Silverlight, Java Flex, Javascript kullanılmaktadır.

Silverlight ortamında CBS yazılımı geliştirmiş biri olarak şunu söyleyebilirim ki, ESRI firmasının sunduğu Silverlight tool sayesinde işler kolay bir biçimde yürümektedir. Ancak CBS işi, bir programlama dilini öğrenmek kadar basit bir iş değildir. Sizden birçok bilgiyi birden istemektedir. Haritacılık, sistem, veritabanı gibi konuları da bilmenizi ister. Çünkü sorun anında nereye müdahale edileceğini söyleyebilmelisiniz. Bu açıdan gerçekten uzun soluklu bir öğrenim süreci varsır.

Yazılım konusunda tam anlamıyla serbestsiniz. Ancak benim tecrübelerim, Silverlight ve Java Flex tarafında kodlama gayet kolay ilerlemektedir. Ancak son zamanlarda alıştığım Test Driven Developmant geliştirme biçiminden sonra çokta haz veren bir kodlama yapısı yoktu benim için. Yani şelale tarzı kodlamaya devam.

CBS silverlight uygulamalarını buradan inceleyebilirsiniz.

Coğrafi Bilgi Sistemleri (CBS) Nedir ?

30 Tem

Coğrafi Bilgi Sistemleri (CBS), teknolojinin birçok dalının bir araya gelerek coğrafi veri üreten kurum ve kuruluşlara, veri üzerinde tasarım ve analiz imkanı sağlayan bir yapıdır. Verinin şekillendirilip anlamlı hale gelmesiyle kurum ve kuruluşlar, coğrafi verilerle de artık stratejik planlarını rahatça yapabilecek hale gelmektedirler.

Kullanım alanları

Ülkemizde CBS işlerinin devlet eliyle Ulusal Coğrafi Bilgi Sisteminin oluşuturlması, kontrolü ve yürütülmesi amacıyla 2011 yılında Coğrafi Bilgi Sistemleri Genel Müdürlüğü kurulmuştur. Bu da devlet olarak işin önemini benimsediğimizi ortaya çıkarmıştır.

İşin idari boyutundan ziyade, teknik boyutu hakkında konuşmaya devam edelim.

CBS, teknik olarak birden fazla alana yayılmış şeklidedir.

  • Haritacılık. (CAD, ArcGIS, ArcMAP,diğer yazılımlar)
  • Sistem (Harita yayınlarının sunumu, Sunucuların optimizasyonu)
  • Veritabanı (Oracle, MsSQL,…)
  • Yazılım (Silverlight, Java Flex, Javascript)

Yani tek başına CBS diye birşey yoktur. CBS uygulamalarının hayat bulabilmesi için sağlam bir ekibin oluşturulması şarttır.

CBS uygulamalarını şu şeklide sıralayabiliriz: Kent Bilgi Sistemi, Orman Bilgi Sistemi, Karayolları Bilgi Sistemi, Arazi Bilgi Sistemi, Tapu ve Kadastro Bilgi Sistemi, Lojistik Bilgi Sistemi, İç Güvenlik Bilgi Sistemi, Araç İzleme Bilgi Sistemi, Trafik Bilgi Sistemi, Kampüs Bilgi Sistemi, Deprem Bilgi Sistemi, Harita Bilgi Sistemi, vb. şekilde adlandırılırlar.

CBS uygulamalarının kullanım alanlarını da şu şekilde sıralayabiliriz: kaynak yönetimi, varlık yönetimi,alt yapılar (doğalgaz, elektrik, su), kentsel planlama, madencilik, askeri alanlar, trafik ve karayolları, ticaret… şeklinde sıralayabiliriz.

CBS, metinsel veriler yerine coğrafi verilerler çalışan bir sistemdir. Örneğin deprem inceleme merkezleri ölçekler vasıtasıyla deprem olan yerlerin koordinatlarını alarak, şu saatte şu koordinatta deprem olmuştur, şeklinde bir liste tutarlar. Bu, kağıt üzerinde metinsel bir veridir. CBS sayesinde bu koordinatlı metinsel veriler, harita üzerinde de görünür hale gelektedir. Aynı şekilde doğalgaz, su hatları, yollar gibi stratejik önemdeki veriler de tek noktadan yönetilebilir hale gelmektedir. Örneğin bir caddedeki doğalgaz kesintisinden etkilenecek vatandaşların listesi alınıp, bu kişilere otomatik mail göndererek veya otomatik arama yaparak and kayıtlarıyla bilgiler vermek mümkündür.

Yani CBS, gelişen dünyanın olmazsa olmazı haline gelmiştir.

Windows 7 ve IIS 7 Üzerinde SSL Sertifika Oluşturma

28 Tem

Güvenli web sayfaların olmazssa olmazı olan SSL sertifikalarının oluşturulma isteği ve bu istek sonrasında oluşturulan sertifikanın sistemimize kaydını inceleyelim.

Bir SSL sertifika satın almaya karar verdiğimizde önce, satın alacağımız sertifika için bir istek oluşturmamız gerekmektedir. Bu işlemi IIS 7 üzerinden gerçekleştirmek oldukça basittir. IIS penceresinden Bağlantılar panelinden Server’a tıklayıp, Sunucu Sertifikalarına tıklıyoruz. Açılan pencerede, sağ panelde Eylemler bölmesinde Sertifika İsteği Oluştur seçeneğini seçtiğimizde aşağıdaki sihirbaz karşımıza çıkacak.

Bu form sertifikamıza ait bilgileri içermektedir.

Şifreleme hizmet sağlayıcısı özelliklerinden bit uzunluğunu 2048 olarak seçerek devam ediyoruz.

Şimdi sertifika isteğimizin oluşturulacağı bir txt dosya belirliyoruz.

İşlem sonlandırıldıktan sonra oluşan dosya aşağıdaki şekildedir. İçeriğini anlamamıza gerek yok zaten. Çünkü bu dosyayı, sertifika satın alacağımız yere göndererek, bu isteğe göre bir sertifika oluşturtmuş olacağız.

Ben deneme için COMODO üzerinden deneme amaçlı bir sertifika oluşturmuştum. Üyelik v.s. işlemlerinin ardından yukarıdaki CertRequest.txt dosyasını upload ettim ve  sertifika dosyam oluşturulup hemen mail adresime atıldı.

Artık oluşturulan deneme sertifikanın sunucuya yüklenme işlemi var sırada.

Bu işlemi de IIS üzerinden Sunucu Sertifikaları‘nı tıklayarak sağ taraftaki Eylemler penceresinden bu kez de Sertifika İsteğini Tamamla seçeneğini seçiyoruz. Yukarıda Sertifika İsteği Oluştur demiştik.

Açılan pencerede şu şekildedir:

Bu şeklide sertifika isteğinin yanıtını da eklemiş bulunuyoruz. Artık sertifika yükleme işlemi tamamlanmıştır.

Şu andan itibaren bu sertifikayı, https gerektiren sayfalarda veya güvenli veri aktarımı gerektiren WCF servislerinde kullanabiliriz.

Asp.net MVC DisplayTemplates Kullanımı

27 Tem

ASP.NET MVC projelerinde Model tarafından gelen property’ler için özel görünüm şablonları oluşturabiliriz. Bunun için kullanılacak yöntem DisplayTemplates şeklinde şablonlar oluştırmaktır. Display Template oluşturma işlemini gerçekleştirmek için Views/Shared altına DisplayTemplates şeklinde bir dizin oluşturmalıyız. Bu dizin altına şablonlarımızı tanımlayabiliriz.

Display  template içerisinde YesNo.cshtml adında bir partial view oluşturuyoruz. Bu view içerisini bool tipindeki değişkenleri istediğimiz gibi göstermek amacıyla doldurabiliriz. Örneğin kişinin profil tipinin gene veya özel olduğunu gösteren bir şablon oluşturalım. YesNo.cshtml içeriği aşağıdaki gibi olacaktır:

Model içeriğimizde şu şeklide olacaktır:

public class Register

{

[UIHint(“YesNo”)]

[Display(Name=”Profil Türü”)]

public bool Accept { get; set; }

}

Bu durumda view sayfalarında @Html.DisplayFor(m=>m.Accept) şeklindeki render istekleri sonucunda Genel veya özel şeklinde bir format oluşacaktır.

Sonuc:

Asp.net MVC EditorTemplates Kavramı

26 Tem

ASP.NET MVC projelerinde HTML kontrollerine etki edebilmenin bir yöntemi de EditorTemplate oluşturmaktır. Model tarafında tanımlanan bir tipe ait bir property için özel şablon(template) hazırlamak mümkündür. Örneğin bool tipindeki bir değişkene karşılık radio button grubu, checkbox veya combobox oluşturmamızı sağlamaktadır.

Bunu bir örnekle açıklamak daha isabetli olacaktır.

Views/Shared dizini içerisine EditorTemplates adında bir dizin oluşturarak işe başlayabiliriz.

EditorTemplates içerisine de YesNo.cshtml adında bir partial view oluşturauyoruz. Bu partial view ile basit bir şekilde bir bool türüne ait combobox temsil etmeye çalışacağız. Örneğin bir kayıt sırasında kişiden alınan profil tipinin genel veya özel olduğu bilgisini temsil edebiliriz.

Eğer genel seçilirse true, özel seçilirse false dikkate alınacak.

Bu template nasıl kullanılacak?

Template kullanımı için bir model içerisindeki bool tipini UIHint attribute ile imzalamamız gerekecek. UIHint attribute parametresi olarakta template adını giriyoruz.

public class Register
{
     [UIHint("YesNo")]
     [Display(Name="Profil Türü")]
     public bool Accept { get; set; }
}

Bu sayede Register modelini kullanan view sayfalarında @Html.EditorFor(m=>m.Accept) şeklindeki ifadelerin yerine direk SelectList gelecek.

Sonuç:

c# indexer işlemleri

25 Tem

Indexer kavramı C# dilinde tipleri diziler gibi kullanılabilir hale getirmektedir. Tiplere ait nesneler tıpkı bir diziymiş gibi indexlere sahiptirler. Bunu örneklerle incelemeye çalışalım.

Tek boyutlu indexer


class Week
{

   string[] week = new string[]{"Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi","Pazar"};

   public string this[int i]
   {
       get { return i >= 0 && i < 7 ? this.week[i] : "Hatalı İndex"; }
   }

}

Haftanın günlerini temsil eden Week sınıfımızı oluşturduk. Week sınıfından oluşturulan nesneler üzerinden sınıf içindeki dizi elemanlarına Indexer sayesinde erişebilecek duruma geldik.


static void Main(string[] args)
{
    Week days = new Week();

    for (int i = -1; i < 8; i++)
    {
        Console.WriteLine(days[i]);
    }
}

Sonuç:

İki Boyutlu Indexer


class Coordinates
{
     int[,] coordinates = new int[,] { { 10, 12 }, { 58, 46 }, { 16, 76 } };

     public int this[int i, int j]
     {
         get { return coordinates[i, j]; }
     }
}

static void Main(string[] args)
{
     Coordinates coor = new Coordinates();

     for (int i = 0; i < 3; i++)
     {
         for (int j = 0; j < 2; j++)
         {
             Console.WriteLine(coor[i,j]);

         }
     }

}

Sonuç:

Asp.net MVC Custom Image Helper

24 Tem

Asp.net mvc uygulamalarında view tarafında kullanılmak üzere kendi özel extension metodlarımızı oluşturabiliriz. Oluşturduğumuz extension metodları da mevcut Html helper tipine bağlayarak rahatlıkla kullanabiliriz.

Html helper tipinde mevcut extension metodlar Action, ActionLink, Label,… şeklinde devam etmektedir. Asp.net mvc takımı, genel ihtiyaçları karşılamak için bu metodları oluşturmuştur. Tüm ihtiyaçlara karşılık verecek metodları da oluşturup sisteme dahil etmeleri de anlamsız ve büyük bir yüktür zaten. İhtiyacımız olan tipleri kendimiz geliştirebilmemiz için bize açık kapı bırakılmıştır.

Bizde bu kapıdan girerek kendi image extension metodumuzu Html helper tipine dahil edelim.

Extension metodlar, statik bir sınıf içerisine statik metodlar halinde tanımlanırlar. Biz de bu şartlara göre Image metodumuzu oluşturabiliriz.


public static class ImageHelper
{
      public static MvcHtmlString Image(this HtmlHelper helper, string imageUrl, string altTag)
      {
            TagBuilder tag = new TagBuilder("img");
            tag.MergeAttribute("src", imageUrl);
            tag.MergeAttribute("alt", altTag);

            return MvcHtmlString.Create(tag.ToString());
      }
}

Artık bu sınıfı view tarafına gösterdiğimizde, @Html.Image(“”,””) şeklinde kullanabiliriz. O halde ImageHelper sınıfını view tarafına nasıl göstereceğimizi inceleyelim.

1.Yol

View sayfasının içerisinde using keywordu ile sınıfın bulunduğu dizini göstermek. View sayfasının  en üstüne @using MyProject.Helpers kodunu yapıştırarak extension metodu kullanmaya başlayabiliriz.

2.Yol

Solution penceresinde ASP.NET MVC projemizin Views dizinindeki web.config dosyası içerisindeki <system.web.webPages.razor>  içerisindeki <namespaces> düğümüne ekleyebiliriz.


<namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
    <add namespace="MyProject.Helpers" />
</namespaces>

Bu yöntemi uyguladığımızda ilk etapta kodun kullanımı sırasında, extension metodumuzun altını kırmızı olarak çizebilir. Ancak kod çalışır. Eğer visual studio restart edilirse artık extension metodun altı çizilmeyecektir. Bu sorun intellisense tarafına kodumuzun web.config tarafından dahil olamadığındn kaynaklanıyor.

Kodun kullanımı:

@Html.Image(“../Content/Images/flower.jpg”,”flower”)

Sonuç:

Bing Maps SOAP Service, Search Service

23 Tem

Bing Maps SOAP servisleriyle .Net uygulaması geliştirmek başlıklı yazımızın devamı niteliğinde olan bu yazıda da bir başka SOAP servisi olan Search Servisini  incelemeye çalışacağız.

Servisin, uygulamaya nasıl dahil edileceğini bir önceki  Geoscodes service yazısında incelemiştik. Aynı süreci işleterek uygulamaya servisi eklemek mümkündür. Bu yazıda da servisin amacından bahsetmeye çalıştım.

Search service kullanarak bir yerde bulmak istediğimiz şeyleri arayabiliriz. Örneğin bir şehirdeki hastane, postane, sushi, hamburger gibi aramaları yapmak mümkündür.

Kodda düzenleme (refactoring) yapılmamış olması, kodun okunabilirliğini biraz zora sokmuş olabilir. Aceleden dolayı kod bu şeklide kaldı.

Arama işlemlerini bir class üzerinden yürütmeye çalışalım. Arama sorgusu, Keyword ve Location şeklinde parametrelere göre oluşturulmaktadır.

Arama kriterini keyword ve location kelimelerini, noktalı virgülle ayırarak yapabiliriz.

Örneğin: “hospital;london” şeklinde hastaneleri aramak.


public class Search
{

    public string SearchKeywordLocation(string keywordLocation)
    {

       String results = "";
       String key = AppConfig.BingKey;

       SearchRequest searchRequest = new SearchRequest();
       searchRequest.Credentials = new Credentials();
       searchRequest.Credentials.ApplicationId = key;

       StructuredSearchQuery ssQuery = new StructuredSearchQuery();

       string[] parts = keywordLocation.Split(';');
       ssQuery.Keyword = parts[0];
       ssQuery.Location = parts[1];
       searchRequest.StructuredQuery = ssQuery;

       searchRequest.SearchOptions = new SearchOptions();

       searchRequest.SearchOptions.Filters =

       new FilterExpression()
       {
          PropertyId = 3,
          CompareOperator = CompareOperator.GreaterThanOrEquals,
          FilterValue = 8.16
       };

       SearchServiceClient searchService = new SearchServiceClient();
       SearchResponse searchResponse = searchService.Search(searchRequest);

       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;

   }

}

Arama kriterini böldüğümüz yer şurası:


StructuredSearchQuery ssQuery = new StructuredSearchQuery();
string[] parts = keywordLocation.Split(';');
ssQuery.Keyword = parts[0];
ssQuery.Location = parts[1];
searchRequest.StructuredQuery = ssQuery;

Servisi çalıştırdığımızda is sonucu şu şekilde alabiliriz.

Londra’daki hastaneleri bu şeklide listeleyebiliyoruz.

Bing Maps SOAP Service, Geocode Service

22 Tem

Bir önceki yazımızda Bing Maps SOAP servislerini incelemeye başlamıştık. Bu yazımızda da yer bulucu servis olan Geococe servisini inceleyeceğiz.

Bu servis sayesinde verilen bir yerin coğrafi konumunu elde etmek mümkündür. Coğrafi konumu elimizde olan bir yerin de adres bilgisini elde etek mümkündür. Servisin sağladığı iki metod bu işlemleri yerine getirir.

Şimdi bir adrese ait coğrafi konum bilgisini bir örnek yardımıyla elde etmeye çalışalım.

Öncelikle elimizde bir Bing Maps Developmet Account Key olması gerekir. Bu key https://www.bingmapsportal.com ‘dan elde edilebilir. Bu key kodlama sırasında bize gerekecektir.

Servisin kullanılabilmesi için projemize eklenmesi gerekmektedir. Bu işlem için projemize sağ tıklayıp Add Service Reference diyoruz. Karşımıza çıkan pencereye aşağıdaki servis linkini yapıştırıyoruz.

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

Servisimiz Yukarıda bahsettiğimiz gibi iki adet metod içermektedir.

Bu örnekte Geocode metodunu kullanacağız.


public Location CalculateGeocodeOf(string address)
{
       GeocodeRequest geocodeRequest = new GeocodeRequest();
       geocodeRequest.Credentials = getCredentials();
       geocodeRequest.Query = address;
       geocodeRequest.Options = getGeocodeOptions();

       GeocodeServiceClient geocodeService = new GeocodeServiceClient();
       GeocodeResponse geocodeResponse = geocodeService.Geocode(geocodeRequest);

       if (geocodeResponse.Results.Length > 0)
       {
           var location = new Location();
           location.Latitude =  geocodeResponse.Results[0].Locations[0].Latitude;
           location.Longitude = geocodeResponse.Results[0].Locations[0].Longitude;

           return location;
       }

       return null;
}

private GeocodeOptions getGeocodeOptions()
{
    GeocodeOptions geocodeOptions = new GeocodeOptions();
    geocodeOptions.Filters = getConfidenceFilter();

    return geocodeOptions;
}

private ConfidenceFilter[] getConfidenceFilter()
{
    ConfidenceFilter[] filters = new ConfidenceFilter[1];
    filters[0] = new ConfidenceFilter();
    filters[0].MinimumConfidence = Confidence.High;

    return filters;
}

private Credentials getCredentials()
{
     Credentials credential = new Credentials();
     credential.ApplicationId = AppConfig.BingKey;

     return credential;
}

Hazırladığımız CalculateGeocodeOf metodu yardımıyla bir adresin coğrafi konumunu elde edebiliriz.

Bunu bing map üzerinden de doğrulayabiliriz.

Bing Maps SOAP Servisleriyle .Net Uygulaması Geliştirmek

20 Tem

Bing Maps, AJAX destekli uygulamaların sağlamanın yanında bir de desktop uygulamalarda kullanılmak üzere geliştirdiği SOAP servislerini de hizmete sunmaktadır. SOAP servisleri birer WCF (Windows Presentation Foundation) uygulamasıdır. Bu yönüyle WCF servislerini kullanmış olanlara büyük olanak sağlamaktadır.

Bing Maps SOAP servisleriyle, Visual Studio üzerinde uygulama geliştirmek için öncelikle Bing Map Platform Developer Account oluşturmak gerekmektedir. Bing Maps Account Center üzerinden hesap oluşturmak mümkündür. Oluşturulan hesap üzerinden development amacıyla bir application key üreterek uygulamalarda kullanabilirsiniz.

Bing Maps SOAP Servisleri

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

Geocode Service

Bu servis, coğrafi konumları adreslere dönüştürmek veya adresleri coğrafi konumlara dönüştürmek için kullanılır.

Örneğin: İzmit, Kocaeli adresinin Latitude ve Longitude değerlerini verir. Ya da Latitude ve Longitude değerleri verilen bir coğrafi konumun adres bilgisini üsküdar, istanbul şeklinde verir.

Search Service

Bu servis, “ne/nerede” şeklindeki aramaların sonucunu döndüren tek bir metod sunar. Örneğin Colarado’da pizza yemek istiyorsunuz. “pizza;co” şeklinde bir arama yaptığımızda bize Colarado’da pizza yapan restoranların listesini döndürecektir.

Imagery Service

Bu servis, iki metod barındırmaktadır. İlk metod harita görüntülerinin alınmasını sağlar. Diğer metod ise ilgili resmin metadata bilgisinin alınmasını sağlar.

Route Service

Bu servis, iki nokta arasındaki rotanın hesaplanmasını sağlar. Bu hesaplamayı başlangıç noktasından varış noktasına doğru ana yönleri noktasal şeklide belirleyerek yapar.

Örneğin; A noktası, 1km sonra Sola dön, 2km sonra sağa dön şeklinde.

Bu servisleri, fırsat buldukça uygulamalarla incelemeye devam edeceğiz.