Google Earth Pro Artık Ücretsiz

31 May

Google harita uygulaması Google Earth Pro‘yu artık ücretsiz bir şeklide biz kullanıcılara sunmaya başladı. Google Earth Pro yaklaşık $400 gibi bir ücret ile sunulmaktaydı. Resmi sitesinde yayınlanan haberde “now free” şeklinde duyurulmuş durumda.

Adsız

Program ile CBS (Coğrafi Bilgi Sistemleri) ve Harita adına ihtiyaç duyulan dosya türlerinin hemen hepsi açılabiliyor. Esri (Shape), MapInfo(tab), MicroStation(dng) gibi programlar tarafından üretilen vektör verileri görüntüleyebilmek artık çok kolaylaşmış gibi görünüyor.

Adsız2

Yaklaşık 10.000 vektör veri bulunan dosyayı açtığımda hiç sıkıntı yapmadan görüntüleyebildi. Bu açıdan performans sorunu da yok gibi görünüyor. Vektör verilerin üç boyutlu şekilde şehir planı ve arazi modeline uygun bir şekilde görüntülenebilmesi de ayrı bir güzellik.

Adsız4

Google Earth Pro’yu buradan indirebilirsiniz. Kullanıcı adı olarak email adresinizi, şifre olarak GEPFREE girdiğinizde programı ücretsiz olarak kullanmaya başlayabilirsiniz.

Application Repository Ninject Modülü

29 May

Bu yazımızda, veri merkezli(data centric) uygulamalarda alışılagelmiş bir yöntem olan Repository kullanımının, birden fazla veri kaynağının bulunduğu durumlarda nasıl yapılması gerektiği konusunu incelemeye çalışacağız.

Repository mantığında öncelikle tüm alt sınıfları hiyerarşik bir düzene sokmak adına tanımlanan bir interface vardır. Örnek olarak basit bir interface tanımlamasını şu şekilde ifade ediyor olalım.


public interface IRepository<T>
{
    void Add(T entity);
    IList<T> GetAll();
}

Bu interface altında veritabanına ekleme ve veritabanından veri getirme gibi iki temel işlem vardır. Eğer bir SQL veri tabanına veri yazmayı amaçlıyorsak bu işlemi gerçekleştiren somut sınıfın oluşturulması gerekmektedir.


 public class SqlRepository<T> : IRepository<T>
 {
   public void Add(T entity)
   {
       // Veritabanına ekle..
   }

   public IList<T> GetAll()
   {
       // Veritananından oku..
   }
 }

Buraya kadar işler normal akışında seyrediyor. Ancak SQL veri tabanına yazılamadığı durumlarda ne olacağı bir soru işareti. Ya da başka bir sebepten dolayı ilişkisel veri tabanına yazmak yerine kayıtları XML bir dosyaya yazmak gerektiğinde XML dosya ile çalışabilen somut bir repository oluşturulması gerekmektedir. Bu durumda yeni bir sınıfa ihtiyaç duyulmaktadır.


 public class XmlRepository<T> : IRepository<T>
 {
    public void Add(T entity)
    {
       // XML dosyaya ekle...
    }

    public IList<T> GetAll()
    {
       // XML dosyadan oku...
    }
 }

Ancak bu iki farklı Repository tipinin, çalışma zamanında seçilebilir ve değiştirilebilir olması gerekmektedir. Aksi taktirde kodun değiştirilebilir olması istenmeyen bir durumdur. Bu değişime ayak uydurabilmek adına, değişikliği otomatik olarak gerçekleştirebilecek bir sınıfa ihtiyaç duyulmaktadır. Bu sınıf, çalışma zamanında dependency injection mekanizması ile yüklenebilen bir modül halinde tasarlanabilir.


 public class ApplicationRepositorySelectionModule : NinjectModule
 {
    public override void Load()
    {
        switch (ApplicationConfiguration.StorageType)
        {
           case PersistenceStorageType.SqlRepository:
              Bind(typeof(IRepository<>)).To(typeof(SqlRepository<>));
              break;
          case PersistenceStorageType.XmlRepository:
              Bind(typeof(IRepository<>)).To(typeof(SqlRepository<>));
              break;
         default:
              throw new ApplicationException("Not supported storage type!");

       }
    }
 }

NinjectModule sınıfı, Ninject dependenjy injector aracına ait bir sınıftır. Yaptığı işlem ise  Interface türlerine karşılık hangi somut sınıfın oluşturulacağını belirlemektir. Zamanı geldiğinde ilgili nesneyi oluşturup programa sağlamak yine Ninject tarafından gerçekleştirilmektedir.

Modül içerisinde kullanılan PersistenceStorageType ve ApplicationConfiguration sınıfları ise şu şekildedir.


 public class ApplicationConfiguration
 {
     public static PersistenceStorageType StorageType { get; set; }
 }

 public enum PersistenceStorageType
 {
     SqlRepository = 0,
     XmlRepository = 1
 }

Bu şekilde birden fazla repository sınıfı ile konfigurasyonu sağlababilir şekilde çalışmak mümkün olmaktadır. Yazılımda çevikliği yani yazılımın değişime ayak uydurabilme yeteneğini sağlayabilmek açısından uygulanabilecek olan küçük bir detaydan bahsetmiş olduk.

Bir sonraki yazıda görüşmek dileğiyle.

Spatial Reference System

26 May

Spatial Reference System

Spatial Reference System (SRS) veya Coordinate Reference System(CRS) coğrafi nesnelerin konumlarını bulmak için kullanılan koordinat tabanlı yerel, bölgesel veya küresel bir sistemdir. Bir SRS farklı mekansal referans sistemeler arasında dönüşümlerin yanı sıra, belli bir harita projeksiyonu tanımlar. Bazı koordinat sistemleri:

  • Universal Transverse Mercator koordinat sistemi
  • Birtish national grid reference system
  • Hellenic Geodetic Reference system 1987
  • Lambert conformal conic projection
  • United States National Grid
  • Jordan Transverse Mercator
  • International mapcode system
  • Irish grid reference system

Mekansal referans sistemleri SRID olarak ifade edilen benzersiz tamsayı kimlik numaraları ile ifade edilirler. European Petroleum Survey Group(EPSG) tarafından tanımlanmış olan SRID’ler de vardır ve bunlar EPSG kodu ile ifade edilirler. Örneğin “EPSG:4326” WGS84 projeksiyonu için EPSG kodudur. “EPSG:3857” ise WGS84 WebMercator için EPSG kodudur. Bu iki projeksiyon arasındaki fark “EPSG:4326” sisteminde dünya bir küre olarak ele alınırken “EPSG:3857” sisteminde dünya bir elips olarak düşünür. “EPSG:4326” enlem/boylam(lon/lat) koordinat sistemini kullanırken “EPSG:3857” x/y kartezyen koordinat sistemini kullanır. Bu sistemler sayesinde de yuvarlak yapıdaki dünya düz bir zemin üzerinde temsil edilebilmektedir.

SRS için tanımlanan bilgiler veritabanlarında OCG tarafından tanımlanan spatial_ref_sys metadata tablosunda tutulur. Bu tabloda SRID, AUTH_NAME, AUTH_SRID, SRTEXT gibi değerler bulunur. Konumsal veritabanı içinde birden fazla konumsal referansa sahip konumsal nesne tablosu veya raster veri bulunabilir.

Mekansal referans sistemleri (SRS) Open Geospatial Consortium (CRS) tarafından kolay bir şekilde erişim sağlamak amacıyla belli standartlarda herkesin anlayabileceği bir metin standardında tanımlanırlar. Bu standart Well Known Text(WKT) olarak isimlendirilir.

Well Known Text(WKT)

WKT bir harita üzerinde vektör geometri nesnesini temsil etmek için ve mekansal referans sistemleri arasında dönüşümler yapabilmek için geliştirlmiş bir metinsel işaretleme dilidir. WKT’nin binary karşılığı Well Known Binary (WKB)’dir. WKB ile WKT ile tanımlanan bilgilerin transferi ve veri tabanlarında saklanması için kullanılır. Bu formatlar OGC tarafından ISO/IEC 13249-3:2011 standardı olarak tanımlanmıştır.

WKT ile temsil edilen 18 adet geometri türü vardır. Bunlar:

  • Geometry
  • Point, Multipoint
  • LineString, MultiLineString
  • Polygon, MultiPoygon, Triangle
  • CircularString
  • Curve, MultiCurve, CompundCurve
  • CurvePolygon
  • Surface, MultiSurface, PolyhedralSurface
  • TIN, TINZ
  • GeometryCollection

Geometri koordinatları 2D (x,y), 3D (x,y,z), 4D (x,y,z,m) şeklinde temsil edilir.

Örnek WKT geometri gösterimleri:

  • POINT(25 18)
  • LINESTRING(10 15, 20 25, 50 55)
  • POLYGON((20 25, 50 55, 80 95, 20 25))
  • POLYGON((20 25, 50 55, 80 95, 20 25), (10 15, 18 22, 17 23, 10 15))
  • MULTIPOINT((11 12), (24 60), (40 40), (75 80))
  • MULTIPOINT(11 12, 24 60, 40 40, 75 80)
  • MULTILINESTRIN((15 15, 23 80, 10 40), (16 16, 33 10, 25 50, 38 09))

Well Known Binary(WKB)

Geometri nesnelerini taşınabilir ve veritabanlarında depolanabilir hale getirmek amacıyla bitişik byte dizisi şeklinde temsil eden ve OGC tarafından standartlaştırılan bir gösterim şeklidir. İki boyutlu(2D) geometrileri temsil eden bir kodlama şeklidir. WKB gösterimleri genellikle onaltılık sayı sistemindeki dizelerle yapılmaktadır.

SQL veritabanında WKB şeklinde depolanan geometrilere ODBC Client gibi veri sağlayıcılar aracılığı ile erişilebilmektedir. Konumsal veri üzerinde geometrik işlemleri gerçekleştirebilen fonksiyonlar SQL, Java veya C-API tarafından sağlanmaktadır.

Bir geometri için yapılan WKB gösterimi yapılırken, öncelikle geometri nesnesinin serileştirilmesiyle elede edilen sayı kümesinden alınan  işaretsiz tamsayı (Unsigned Integer) ve ondalık(Double) sayılar elde edilir. Daha sonra elde edilen her sayı, standart ikili(binary) sayı sistemine dönüştürülür.

Binary ifadelerin bilgisayar sisteminde serileştirilmesi sırasında işaret bitleri, en önemli ilk byte veya en az önemli ilk byte gibi bazı standartlar belirlenmiştir. Serileştirme işlemi, network ortamında bilgisayarlar arasında veri transferini gerçekleştirebilmek amacıyla gerçekleştirilir. Serileştirme için kullanılan iki tür kodlama vardır. Bunlar XDR ve NDR dir.

XDR (big-endian)

  • İşaretsiz tamsayının XDR gösterimin en önemli byte önce yazılır.

xdr1

  • Ondalik(Double) sayıların XDR gösteriminde işaret byte önce yazılır.

xdr2

NDR (little-endian)

  • İşaretsiz tamsayının NDR gösterimin en önemsiz byte önce yazılır.
  • Ondalik(Double) sayıların NDR gösteriminde işaret byte sona yazılır.

Geometri Nesnelerinin WKB Gösterimi

Geometri gösteriminde ilk byte veri için byte sırasını gösterir.

  • 00: Düşük son haneli (big endian)
  • 01: Büyük son haneli (little endian)

İkinci byte geometri türünü temsil eden bir tamsayıdır.

Type

2D

GEOMETRY

0000

POINT

0001

LINESTRING

0002

POLYGON

0003

MULTYPOINT

0004

MULTULINESTRING

0005

MULTIPOLYGON

0006

GEOMETRYCOLLECTION 0007
CIRCULARSTRING 0008
COMPUNDCURVE 0009
CURVEPOLYGON 0010
MULTICURVE 0011
MULTISURFACE 0012
CURVE 0013
SURFACE 0014
POLYHEDRALSURFACE 0015
TIN 0016
TRIANGLE 0017

 

Her geometrik veri türü benzersiz bir veri yapısına sahiptir. Koordinatlar double tipinde temsil edilir.

Örneğin: POINT(2.0, 4.0) geometrisi 000000000140000000000000004010000000000000 şeklinde 21 byte ile temsil edilir. Burada:

  • 1 byte integer 00 veya 0: Düşük son haneli
  • 4 byte integer 00000001 veya 1: POINT 2D
  • 8 byte float 4000000000000000 veya 2.0: X koordinatı
  • 8 byte float 4010000000000000 veya 4.0: y koordinatı

Kaynaklar:

CSS ile HTML Konumlandırma (CSS Positioning)

24 May

Web tasarımı ile ilgili görünüm düzenleme çalışmalarında elementlerin konumlandırılması önemli bir konudur. Web sayfalarında HTML elementlerini CSS özelliklerinden faydalanarak kullanarak kolayca konumlandırabiliriz. Konumlandırılacak HTML elementleri div, p, h1, img, li, a, span v.s gibi elementlerdir.

Bir elementin konumunu belirleyen CSS özellikleri: position, top, left, right, bottom şeklinde özellikler(property) ile belirlenir. Her HTML elementi varsayılan olarak atanmış  pozisyon değerleri vardır. Bunlar şu şekilde sıralanabilir:

  • position: static
  • top: auto
  • left: auto
  • right: auto
  • bottom: auto

Bir elementin konumlandırmasına müdahale etmek istersek bu değerlerde değişiklik yapmalıyız.

CSS konumlandırma özelliklerinin(property) alabilecekleri değerler şu şekildedir.

  • position özelliği; static, relative, absolute, fixed , inherit, initial değerlerini alabilir.
  • top, left, right ve bottom özelliği; auto veya px, cm gibi sayısal büyüklüklerde değerler alabilir.

HTML elementleri doldurdukları alan seviyesine göre guruplandırılmışlardır. Bu bağlamda iki tür element gurubu vardır. Bunlar:

  • Block Level element
  • Inline Level Element

Block Level Element

Bu guruptaki elementlerin sayfada kapladıkları alanlar birer kutu gibi düşünülebilir. Aksi belirtilmediği taktirde sayfada alt alta dizilerek sıralanırlar. Örneğin p, h1, …, li, form, div gibi elementler block-level element kategorisindedir.

Adsız

Şekilde görüldüğü üzere block-level elementler, boyutlarına veya içeriklerine bakılmaksızın kutu gibi düşünülerek alt alta dizilmektedir.

Inline Level Element

Bu guruptaki elementler yeni bir satır açmadan tek bir satırda dizilerek konumlanırlar. Örneğin span, a, img gibi elementler inline-level elementlerdir.

aa

Şekilde görüldüğü üzere a ve span elementleri aynı satırda olacak şekilde konumlandırılmışlardır.

Elementlerle ilgili konum seviyeleri, CSS özelliklerinde aksi belirtilmediği sürece bu şeklide çalışmaktadır. Ancak HTML elementlerinin display CSS özelliğini değiştirerek block-level elementleri inline-level gibi veya inline-level elementleri block-level element gibi göstermek mümkündür.

Adsız

Örnek şekilde div elementinin display özelliği inline-block olarak ayarlandığında elementlerin tek satıra dizilmiş ve inline-level element özelliği göstermeye başlamıştır. display özelliğini kaldırıldığında ise elementler tekrar alt alta dizilmiştir.

HTML Elementlerin CSS ile Konumlandırması

HTML elementlerin sayfada konumlandırması(positioning) üç farklı şekilde gerçekleştirilmektedir.

  1. position özelliği static ve relative şeklinde belirlenen elementler normal akışta(normal-flow) konumlandırılır.
  2. position özelliği absolute şeklinde belirlenen elementler mutlak konumlandırma ile konumlandırılır.
  3. float konumlandırma.

position: static

Sayfanın elemente verdiği normal akış(normal-flow) uygulanır. Akış kavramını dizilimi olarak düşünebiliriz. Bu özellik uygulanan elementler top, left, right, bottom gibi özellikleri dikkate almazlar.

position: relative

Bu özellikte sayfanın elemente verdiği normal akış(normal-flow) veya sıralama uygulanır. Daha sonra belirlenen top, left, right, bottom özelliklerine göre bulunduğu yerden yani normal konumundan ötelenerek uzaklaştırılır. Yani göreceli olarak konumlandırma yapılmaktadır. Kutu hangi taşıyıcı blok içerisindeyse o bloka göre ötelenir.

position: absolute

Mutlak konumlandırma olarak bilinir ve normal akışın dışına çıkarlar. Kutu konumuna ait top, left, right, bottom özellikleri, absolute özellikli kutunun taşıyıcı bloku olan üst element referans alınarak belirlenir. Eğer absolute bir taşıyıcı blok yoksa, belgenin ya da sayfanın <body> elementi referans alınarak konumlandırılır. Diğer hiç bir element normal akıştaki yerini kaybetmez. Mutlan konumlu elementler kaydırma çubuğu varsa onunla birlikte birlikte hareket ederler.

Örnek Durum-1: En yakında absolute konumlu element yoksa

Örnek Durum-2: En yakında absolute konumlu element varsa (Kırmızı Kutu)

position: fixed

fixed ile konumlandırılmış elementler, sayfanın görüntü alanına yani tarayıcı penceresine göre konumlandırılır. Sayfada kaydırma çubuğu hareket ettirildiğinde kutu hareket etmez ve konumunu korur.

Görünebilirlik Problemi

HTML elementlerin konumlandırılması sırasında üst üste gelen kutular arasında görünebilirlik sorunu ortaya çıkmaktadır. Hangi elementin üstte görüneceğini belirlemek için CSS tarafında z-index özelliği kullanılmaktadır. z-index değerleri pozitif ve negatif tamsayı değerlerini alabilmektedir.

Örnekte normalde altta olan kutu z-index kullanılarak üstte gösterilmiştir.

Kaynaklar:

  • http://www.w3schools.com/html/html_blocks.asp
  • https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements
  • https://www.w3.org/TR/CSS21/visuren.html#choose-position
  • https://www.w3.org/TR/CSS21/visuren.html#normal-flow