.Net Framework Spatial Data Desteği

22 Ağu

System.Data altında bulunan sınıflar(Class) sayesinde farklı veri kaynaklarına erişmek ve onlar üzerinde işlemler yapmak mümkündür.  Örneğin ADO.NET mimarisinde kullanılan SQL Server, Oracle, ODBC ve OleDB gibi veri sağlayıcılar bu namespace altında bulunurlar.

.Net Framework 4.5 versiyonundan önce mekansal verilere düz SQL sorguları ile veya veritabanı üzerine kaydedilen stored procedure’ler aracılığı ile erişilebilmekteydi. Ancak .Net 4.5 versiyonundan sonra System.Data  kütüphanesine eklenen System.Data.Spatial alanı ile artık mekansal verilere erişim ve onlar üzerinde yapılacak işlemler DbGeography ve DbGeometry nesneleri ile gerçekleştirmek mümkün hale gelmiştir.

DbGeography

DbGeography sınıfı, verilerin jeodezik(yer yüzeyindeki)  koordinat sisteminde temsil edilmesini sağlar. Yani belirli bir koordinat sistemine göre nesnelerin yeryüzündeki konumu ile ilgilenir. Örneğin bir noktanın yeryüzünde nereye karşılık geldiği DbGeography nesnesi ile temsil edilebilir.

DbGeometry

DbGeometry sınıfı, nesnelerin geometrik şekillerini tanımlayan nesneler için bir taban oluşturur. DbGeometry nesnelerin konumu ile ilgilenmez, sadece şekilleri ile ilgilenir. Nesnelerin geometrik şekilleri Point, Polygon, LineString v.b. olabilmektedir. Örneğin bir yolun şeklinin LineString olması DbGeometry nesnesi ile temsil edilir. Yolun nerede konumlandığı ise DbGeography nesnesi ile temsil edilir.

Geometry ve Geography kavramlarının ayrımı sadece .Net platformuna özgü bir mesele değildir. Bütün platformlarda bu şekilde organize olmuştur. Bu organizasyon yazılım platformundan ziyade Coğrafi Bilgi Sistemleri ile alakalı bir durumdur.

DbGeometry ve DbGeography kavramlarını bir örnek üzerinden inceleyerek devam edelim. Open Geospatial Consortium (OGC) standartlarında bir geometrik şeklin temsili Well Known Text (WKT) adında bir işaretleme dili ile belirlenmiştir. Örneğin bir noktanın WKT gösterimi şu şekildedir:

POINT (12.321876 24.981276)

Örneğin Gebze’de seçilen bir noktanın Pendik ve İzmit’te seçilen noktalara göre uzaklıklarını karşılaştıralım.


[Test]
public void ClosestPoint_WithThreePoints()
{
    var gebze = DbGeometry.FromText("POINT(40.803099 29.405076)");
    var pendik = DbGeometry.FromText("POINT(40.877359 29.254845)");
    var izmit = DbGeometry.FromText("POINT(40.764946 29.950905)");

    var gebze_pendik = gebze.Distance(pendik);
    var gebze_izmit = gebze.Distance(izmit);

    Assert.True(gebze_izmit > gebze_pendik);
}

gebzepoint

Burada gebze.Distance(pendik) metodunun yaptığı iş aslında Pisagor‘un iki nokta arasındaki uzaklık hesabıdır. Yani düzlemdeki iki noktanın bir birine olan uzaklığının hesaplanması işlemi gerçekleştirilmekte ve sonuç derece cinsinden bir değer olmaktadır.

Geometrik şekilleri yer yüzündeki konumu ile temsil etmek için DbGeography sınıfı kullanılır.

[Test] 
public void ClosestLocation_WithThreePoints() 
{ 
    var gebze = DbGeography.FromText("POINT(40.803099 29.405076)", 4326);
    var pendik = DbGeography.FromText("POINT(40.877359 29.254845)", 4326); 
    var izmit = DbGeography.FromText("POINT(40.764946 29.950905)", 4326);

    var gebze_pendik = gebze.Distance(pendik);
    var gebze_izmit = gebze.Distance(izmit);

    Assert.True(gebze_izmit > gebze_pendik);
}

gebzepoint
Sonuç olarak metre cinsinden uzaklıklar elde edilir. Gebze’de seçilen nokta ile İzmit’te seçilen nokta arasındaki uzaklık yaklaşık 6km şeklinde hesaplanmıştır.

DbGeography sınıfında geometrik şekil tanımlama işlemi DbGeometry ile aynıdır. Ancak ek parametre olarak koordinat sistemi kodu (coordinateSystemId) girilebilir. Bu kodlar European Petroleum Survey Group(EPSG) tarafından koordinat sistemlerine atanmıştır. Bilinen tüm koordinat sistemlerine karşılık bir tamsayı vardır. Bu konu ile ilgili detaylara Spatial Reference System başlıklı yazıdan ulaşabilirsiniz.