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.
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.
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
Yorum Gönder