Ana içeriğe atla

Konum Verilerinin Veritabanında Tutulması

Yazılımla uğraşan ve ya bir yazılım projesinde yer almış herkesin karşılaştığı bir durum olsa da bu konu profesyonellik gerektiren bir konu. Zira sadece  longitude ve latitude verilerinin ayrı-ayrı double olarak tutulması bu verilerin işlenmesi konusunda gelecekte problemler ortaya çıkmasına neden olabilir.
Yazılım, Konum Verilerinin İşlenmesi, Globus, Eğer konum verileri işlenmeyecekse sadece veri olarak tutulacaksa o zamanda ayrı-ayrı double değerini tutmakta bir sakınca yoktur. Ama örneğin iki konum arasındaki mesafe hesaplanması ve ya noktalardan oluşan poligonun alanının hesaplanması gereken durumlarda bu yapıyı kullanmak yazılımınız için extradan veriler üzerinde işlem yapmanız  gerektirecek.
Bu durumu çözmek için her programlama dilinde ayrı ayrı çözümleri vardır. Ben burada SQL Server .net ve ORM olarak da Entity framework baz alarak anlatacağım. Siz bunu kullandığınız programlama dili ve ORM'ye veritabanı yazılımına göre değiştirebilirsiniz.

Öncelikle konum verileri tutmak için hemen-hemen tüm veritabanlarında(Oracle, Sql Server, Mysql ve b.) yapı mevcuttur. Kullandığınız veritabanı ile ilgili yardım dokümanlarını takip edebilirsiniz...

Öncelikle bir Koordinat değişkenini tanımlayalım.

private DbGeography _coordinates;
        public DbGeography Coordinates
        {
            get { return _coordinates; }
            set { _coordinates = value; }
        }

Buradaki DbGeography  coordinat verisini tanımladığımız değişken türümüz. System.Data.Entity.Spatial isim uzayının altında bulunur.
Peki böyle bir değişken tanımladık. Bu değişkeni nasıl kullanacağız. DbGeography için aşağıdaki gibi bir tanımalama
tercih edilebilir.
var point = DbGeography.FromText("POINT(-34.32445 41.68902)");
Konum verilerini de fonksiyonel hale getirebilirsiniz. Aşağıdaki fonksiyonu kullanabilirsiniz.

  public static DbGeography ConvertLatAndLonToDbGeography(double longitude, double latitude)
        {
            var point = string.Format("POINT({1} {0})", latitude, longitude);
            return DbGeography.FromText(point);
        }

Bunun dışında Eğer poligon ve ya yol verileri, çizgi, daire, üçgen ve başka gibi veriler kaydedecekseniz yine DbGeography yapısını tercih edebilirsiniz.
Örneğin noktalardan poligon oluşturacaksanız aşağıdaki yapıyı kullanabilirsiniz.

public static DbGeography ConvertGeoCoordinatesToPolygon(IEnumerable<GeographicCoordinate> coordinates)
        {
            var coordinateList = coordinates.ToList();
            if (coordinateList.First() != coordinateList.Last())
            {
                throw new Exception("Poligon Oluşturabilmek için ilk ve son koordinat verisinin eşit olması gerekir.");
            }
            var count = 0;
            var sb = new StringBuilder();
            sb.Append(@"POLYGON((");
            foreach (var coordinate in coordinateList)
            {
                if (count == 0)
                {
                    sb.Append(coordinate.Longitude + " " + coordinate.Latitude);
                }
                else
                {
                    sb.Append("," + coordinate.Longitude + " " + coordinate.Latitude);
                }
                count++;
            }
            sb.Append(@"))");
            return DbGeography.PolygonFromText(sb.ToString(), 4326);
        }

Bunun dışında noktalar arasındaki mesafe hesaplamaları için de bu yapıyı kullanabilirsiniz. Verdiğim örneklerde de görüldüğü gibi konumsal veri analizleri için bu yapının kullanılması idealdir. Ama yüksek düzeyle konumsal veri analizleri, harita işlemleri yapacaksanız bu işlemler
çok elementar düzeyde kalır. Özetle, DbGeography yapısı ve System.Data.Entity.Spatial isim uzayı uzaysal noktaların veritabanında veya obje olarak daha işlenebilir bir yapıda olmasını sağlar.

Yorumlar

Bu blogdaki popüler yayınlar

Azərbaycan Dilində Vurğu Qəbul Etmeyen Şekilçiler

Sözlərdə hecalardan birinin digərlərinə nisbətən daha qüvvətli deyilməsinə heca vurğusu deyilir. Üzərinə vurğu düşən hecaya isə vurğulu heca deyilir. Azərbaycan dilində vurğu adətən söz sonuna düşür. Söz şəkilçi qəbul ederkən vurğu adətən şəkilçinin üzərinə keçir. Məsələn: çiç ə k - çiçəkl ə r - çiçəklərd ə n məkt ə b - məktəbl i - məktəblil ə r - məktəblilərd ə n Buna baxmayaraq dilimizdə bir sıra şəkilçilər var ki onlar vurğu qebul etmirlər. Bu məqalədə Azərbaycan dilində vurğu qebul etməyən şəkilçilər incələnəcək ve bu şekilçilərin hansı hallarda vurğu qebul edib hansı hallarda vurğu qebul etmediyi araşdırılacaqdır. Eyni zamanda bildirmək istəyirəm ki vurğu ilə bağlı daha geniş və ətraflı məlumat üçün Azərbaycan Dilində Vurğunun Praktik Məsələləri adlı məqaləyə də nəzər yetirə bilərsiniz.  1. İsimlərdəki şəxs(xəbərlik) şəkilçiləri Məsələn: müəli'məm müəli'msən müəli'mdir müəli'mik müəli'msiniz müəli'mdirlər Qeyd: -dır4

Ağaçlar Kireçle veya Badana İle Neden Boyanır?

Ağaçlar kireçle boyanmasının veya badana yapılmasının hem çevreye hem de doğaya, ağaçlara faydası var. Bu makalede bu geleneği enine boyuna tartışmaya çalıştık. Ağaca zarar veren mikrop ve bakterileri öldürür. Ağacı çok aşarı soğuk havalarda ve çok aşırı sıcak havalarda korur. Ağacın çürümesini ve kurtlanmasını önler. Ağacın gövdesinin alabileceği zararları en az düzeyde düşürmeyi sağlar. Hoş, güzel, hijyenik, temiz pırıl pırıl bir görüntü oluşturur. Ayrıca çok sıcak havalarda da ağacı yanmaya karşı korumak. En büyük etkisi soğuk havalarda ağacı don vurmalarına karşı korumak . Küresel ısınma göz önüne alındığında mevsim değişiklikleri ani don, ani ısı artışları ve azalışları sonucunun doğuracağı etkenler için yararlı etkin bir yöntem. Gövdeden obur dalların çıkmasını azaltmak için sürülür. Kireçleme ağaçları güneş yanığından korumak için yapılıyor. Ağaçlar da güneşten yanabiliyorlar. Bu arada odun dokudaki gözenekleri doldurarak kapattığı için, zararlıların yuv

Medyan (Ortanca) Nedir? Nasıl Hesaplanır? Nerelerde Kullanılır?

Medyan işlemi olasılık hesaplamalarında sıkça kullanılan bir sayı dizisinin ortalamasını hesaplamak için alternatif yöntemlerden bir tanesidir. Ortanca medyan işleminin diğer adıdır. Matematiksel olarak medyan işlemi bir sayı dizisi küçükten büyüğe sıralayarak ortada kalan elemanı medyan değeri olarak belirleme işlemidir. Örnek verecek olursak: 2, 1, 5, 4, 5, 1, 2, 3, 5 serisi sıralanırsa 1, 1, 2, 2, 3, 4, 5, 5, 5 serisi elde edilir. Bu seri 9 elemanlı olduğundan ortadaki, yani 5. eleman (medyan) olacaktır. 5. eleman 3 sayısıdır. Yani ortanca değeri 3'dür Eleman sayısı tek sayı olan bir seride medyan değerin sırasının hesaplaması şu şekilde formüle edilir. Medyanın Sırası = (Eleman Sayısı + 1) / 2 Bu formülü yukarıdaki örneği uygulayacak olursak; Medyanın Sırası = (9 + 1) / 2 = 5 Veri serisi eleman sayısı bir çift sayı ise bu durumda serinin 2 medyanı olacaktır. Örneğin 2, 1, 5, 4, 5, 1, 2, 3, 5, 4 serisi sıralandığında 1, 1, 2, 2, 3, 4, 4, 5, 5, 5 s