Makale Özeti

Bu makalemizde SQL Server 2008 ‘in yeni,veri tiplerinden olan Uzaysal Veri Tiplerini (GEOMETRY ve GEOGRAPHY) ve kullandığı fonksiyonları,örnek sorgularla inceleyeceğiz

Makale

SQL Server 2008 ile birlikte gelen birçok yenilikten biri de,yeni veri tipleridir.SQL Server 2008’de daha önceki sürümlerde kullandığımız int,varchar,float gibi veri tiplerine ek olarak sınırlarımızı daha da genişleten yeni veri tipleri karşımıza çıkmaktadır.

SQL Server 2008 ile gelen;bu yeni veri tiplerini aşağıdaki gibi bir gruplamaya sokabiliriz.(Bu makalemizde ilk grup olan Uzaysal Veri Tipleri üzerinde duracağız)

Ø  Uzaysal Veri Tipleri: Bu veri tipleri GEOMETRY ve GEOGRAPHY veri tiplerini içermektedir. Bu verilere de  Uzaysal Veriler denmektedir.

Ø  Yeni Date ve Time Veri Tipleri: Bu veri tipleri,esnek Date ve Time verilerinin tutulmasını sağlamaktadır.Örneğin;1753 yılından önceki yılların yada 3.33 milisaniye den daha kısa zaman aralıklarının,veri tabanında saklanmasına imkan sağlıyorlar.

Ø  Hierarchyid Veri Tipleri : Hiyerarşik verilerin tutulduğu tipler.Örneğin; çalışan => müdür ilişkisinin tutulmasına imkan sağlayan veri tipleridir.

Ø  FileStream Desteği : Büyük objelerin dosyalarda tutulması ve bu dosyaların database ile entegrasyonun sağlanması ise veri tiplerine getirilen bir başka kullanışlı yeniliktir.

Şimdi,Uzaysal Veri Tiplerine ve sağladığı imkanlara bakalım.

1)SQL Server 2008’de Uzaysal Veri Tipleri :  

       İstanbul’un enlem ve boylam bilgisini tutmak için (28:58E ,41:01N);veri tabanında float bir veri tanımlaması yapmış olalım.Bunun yanında enlem ve boylamla ilişkili;alansal kodları da,koordinatlarıyla bağlantılı olarak veri tabanımızda tutmak istediğimizde,gene float tiplerde veriler tanımlayarak,bir veri tabanı yapısına ulaşmış olalım.Oluşturmuş olduğumuz bu karmaşık veri tabanını başka bir uygulamanın kullanması gerektiğinde(örneğin bir web servisi),karmaşıklığından dolayı,işin içinden çıkmak oldukça zor olacaktır.Tüm bu uzaysal formatların daha da anlaşılabilir olarak tanımlanması için belirli standartların olması gerekliliği ortaya çıkmaktadır. 

Bu amaçla;Open Geospatial Consortium (OGC) adlı organizasyon,açık GIS(Geographical Information System)yazılım standartlarını hazırlamaktadır.(www.opengeospatial.org adresinden ayrıntılı bilgi alınabilir)İşte SQL Server uzaysal bilgileri de ,OpenGis standartlarını kullanmaktadırlar.

SQL Serverda uzaysal veriler için 2 tane Veri Tipi mevcutdur.
a)     GEOMETRY ;harita bilgilerini 2 boyutlu olarak tutmaktadır.( X ve Y düzleminde)
b)    GEOGRAPHY ; verileri dünya yüzeyi ile ilişkili olarak tutmaktadır.

Şimdi bu 2 uzaysal veri formuna ayrıntılı olarak bakabiliriz.

a)GEOMETRY Tipi :GEOMETRY data tipi .NET CLR (Common Language Runtime)destekli bir SQL Server tipidir.2 boyutlu koordinat düzleminde;nokta,doğru,çember,çokgen gibi geometrik cisimlerin X ve Y eksenindeki koordinat bilgilerini tutar.SQL Server’da;uzaysal veriler binary olarak tutulmaktadır ve text hale dönüştürülmesinde OGC tarafından tanımlanmış WKT (Well Konown Text ) formatını kullanmaktadır.WKT ‘lerin temsil etdiği uzaysal verilere,şunlar örnek olarak gösterilebilirler.

Geometrik Tip WKT Gösterimi Açıklama
Point POINT ( 10 15 )  Bir nokta
Multipoint MULTIPOINT (10 10, 50 50)  İki Nokta
LineString LINESTRING (10 10,20 20,31 35)  Üç noktası verilmiş doğru
Polygon POLYGON (( 10 10, 10 20, 20 20, 20 15, 10 10))  Beş noktadan oluşan çokgen

Bu yukardaki verilerin,temsili için STAsText() fonksiyonu kullanılmaktadır.Bu fonksiyon dışında 60’dan fazla fonksiyon GEOMETRY tipinin işlemlerinde kullanılırlar.(Aynı zamanda GEOGRAPHY tipi için de kullanılabilirler) Bu fonksiyonlardan bazıları şunlardır.


Fonksiyon

Açıklama
STAsText Tipin değerini WKT formatında döndürür.
STGeometryType Tipin tutduğu değerin bilinen ismini(WKT) döndürür.
STGeomFromText WKT formatındaki değerin,geometrik değerini oluşturur.
STArea Tipin tutduğu değerin,toplam alanı döndürür.
STSrid Tutulan Geometrik tipin;Uzaysal Referans ID(SRID) sini döndürür.
STTouches İki geometrik cisim komşu ise 1 değerini komşu değilse 0 değerini döndürür.
STWithin Bir noktanın bir geometrik cisim içerisinde olması durumunda 1 değerini yoksa 0 değerini döndürür.
STDistance Bir nokta ile bir geometrik cisim arasındaki uzaklığı döndürür.
GeomFromGML Geography Markup Language (GML) formatında,verilen geometrik cismi döndürür.
AsGML GML formatında,geometrik değeri döner.

Bütün geometrik tipler,bir SRID’ye sahiptir ve bu fonksiyonlar çalışırken SRID ‘ye göre işlemlerini gerçekleştirir.(GEOMETRY data tipinde kullanılan bütün fonksiyonların ayrıntılı bilgisine,SQL Server Books Online’dan erişebilir.)

Buraya kadar SQL Server GEOMETRY tipleri hakkında sizlere, temel teorik bilgileri vermeye çalıştım.Bundan sonraysa SQL Server’da bu tipleri ve fonksiyonları örnek sorgularla inceleyeceğiz.


Öncelikle hayali kordinatlara sahip çokgensel bir alanımızın olduğunu varsayalım.

İlk olarak Geometrik Verilerimizin tutulacağı  AlanKodlari  adlı tablomuzu oluşturuyoruz

CREATE
TABLE AlanKodlari
(ID INT PRIMARY KEY,
AKodununGeometrisi GEOMETRY NOT NULL,
AKodununTexti AS AKodununGeometrisi.STAsText()
)

Buradaki  AkodununGeometrisi  kolonu ,Alan Kodlarımızı tutacak.

Şimdi yukardaki şekildeki noktalarımızı,KodunDatasi adlı değişkene giriyoruz ve ardından da AlanKodlari tablosunun,1 numaralı ID li kayıdının noktasal değerlerini veriyoruz.

DECLARE @KodunDatasi GEOMETRY
SET @KodunDatasi = geometry::STGeomFromText('POLYGON((1 10,
15 15, 30 13, 29 4, 7 1, 1 10))', 0)
INSERT INTO AlanKodlari
VALUES ('1',GEOMETRY::STGeomFromText('POLYGON((1 10,
15 15, 30 13, 29 4, 7 1, 1 10))', 0)
)

Buradaki  STGeomFromText fonksiyonu WKT alır ve SQL Server’ın storage engine’ninde binary olarak saklar.Bu örnek için çokgenin taslağı bir Alan Kodu olarak saklanmaktadır.

Şimdi de vermiş olduğumuz noktasal kordinatların oluşturacağı çokgensel şeklin toplam kapladığı alanı STArea()fonksiyonu ile hesaplayalım.

DECLARE @KodunDatasi GEOMETRY;
SET @KodunDatasi=(SELECT AKodununGeometrisi from AlanKodlari where ID=1)
SELECT @KodunDatasi.STArea() as 'Kaplanan Toplam Alan'

Örnek olarak bu alan içinde,hayali bir noktaya bir Lise kurulacak olsun.Bu;lisenin bulunduğu noktanın;alanımız içinde olup olmadığını STWithin()fonksiyonunu kullanarak bulabiliriz.

DECLARE @Lise GEOMETRY
SET @Lise=GEOMETRY::STGeomFromText('POINT(23 32)',0);
IF (@Lise.STWithin(@KodunDatasi)=1)
SELECT 'Lise nin bulunduğu nokta Alanımız içerisinde' as 'Sonuc'
ELSE
SELECT 'Lise nin bulunduğu nokta Alanımız dışında !!!' as 'Sonuc'


Şimdi de sorgumuzu biraz daha geliştirelim;bir eğlence merkezinin açılma şartının değerlendirilmesi için,Liseye olan uzaklığını
STDistince()fonksiyonunu kullanarak bulduktan sonra,değerlendirmenin yapılmasını sağlayalım.(1 KM’den küçükse kurulamasın kriteri olsun mesela)

DECLARE @EglenceMerkezi GEOMETRY
DECLARE @Lise GEOMETRY
SET @Lise=GEOMETRY::STGeomFromText('POINT(23 32)',0);
SET @EglenceMerkezi=GEOMETRY::STGeomFromText('POINT(12 8)',0);
IF (@EglenceMerkezi.STDistance(@Lise)<1.0)
SELECT 'Eğlence Merkezi Okula çok yakın !!!' as 'Sonuc'
ELSE
SELECT 'Eğlence Merkezi Okula yakın değil' as 'Sonuc'

 

Şimdi de STTouches()fonksiyonunu kullanarak;doğru şeklinde olan ve kordinatları verilen bir nehirin,alanımız ile sınır olup olmadığını bulalım.

DECLARE @Nehir GEOMETRY
SET @Nehir=GEOMETRY::STGeomFromText('LINESTRING(.5 12, 1 10, 1 8, .5 3, 0
0)'
,0)

SELECT @Nehir.STTouches(@KodunDatasi)



Çıkan sonucun 1 olması,bize nehirin alanımızla sınır olduğunu gösteriyor.

SQL Server 2008’in fonksiyonlarının,iletişimde bulunduğu bir başka data grubu ise XML datalardır.XML datalar için Geometrik veriler,Geography Markup Language (GML) aracılığıyla tanımlanabilir. 

GML‘in SQL Server 2008 de çalışma şeklini incelemek amacıyla 2 tane girdi alan(XML ve integer),
AlanKodununIcindeMi
adlı bir store procedure yazalım.XML girdimizi bir noktayı GML formatında tanımlamak için oluştururken,integer girdimizi Alan Kodlarını karşılaştırmak için oluşturuyoruz.

CREATE PROCEDURE AlanKodununIcindeMi(@KodGML as xml,@AlanKodu as int)
AS
BEGIN
DECLARE @KodDatasi GEOMETRY;SET @KodDatasi=(SELECT AKodununGeometrisi from AlanKodlari where ID=@AlanKodu)DECLARE @NoktaGML GEOMETRY;
SET @NoktaGML=GEOMETRY::GeomFromGml(@KodGML,0)
IF (@NoktaGML.STWithin(@KodDatasi)=1)
SELECT 'Alanın Icinde'
ELSE
SELECT 'Alanın Dışında'
END

Daha sonra da yazmış olduğumuz bu Store Procedurümüzü test etmek için (10 10) koordinatlarında bir nokta oluşturalım ve bu noktanın alanın içinde olup olmadığını, ‘AlanKodununIcindeMi’ adlı store procedurümüzü kullanarak bulmuş olalım.

DECLARE @OrnekNokta XML
SET @OrnekNokta='<Point xmlns="http://www.opengis.net/gml"><pos>10
10</pos></Point>'
EXEC AlanKodununIcindeMi @OrnekNokta,1




Burada anlatdığım veri tipleri üzerinde işlem yapan fonksiyonların çağrılması için .NET ortamında Microsoft.SqlServer.Server.Types isim alanı altında ki SqlGeometry tipi kullanılmalıdır.

b) GEOGRAPHY Tipi :
GEOGRAPHY veri tipi, GEOMETRY veri tipiyle aynı fonksiyonları kullanılır,aynı şekilde çalışır.Dünya’nın şeklinden dolayı,bu tipe geoid veri tipi denmektedir.Bundan dolayı da objeleri geodetik düzlemde ifade eder.Bu veri tipi noktaların enlemsel ve boylamsal bilgilerini GPS(Global Positioning System) kordinatlarına göre temsil eder.Gene bu tipte de her obje ,bir SRID’ye sahiptir.

Şimdi de STGeomFromText;
fonksiyonunu kullanarak 1 numaralı ID’ye sahip kayıda bir Linestring’in ,2 numaralı ID’ye sahip kayıda da bir çokgenin kordinat bilgilerini girelim.

CREATE TABLE UzaysalVeriler
(ID int IDENTITY (1,1),
Kolon1 geography,
Kolon2 AS Kolon1.STAsText() );
GO 

INSERT INTO UzaysalVeriler (Kolon1)
VALUES (geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343
47.656)'
, 4326));
 

INSERT INTO UzaysalVeriler (Kolon1)
VALUES (geography::STGeomFromText('POLYGON((-122.358 47.653, -122.348
47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))'
, 4326));
GO

STIntersects  fonksiyonunu kullanarak Linestring ile Çokgenin; Linestring üzerinde ki kesiştiği noktanın kordinatlarını bulalım.

DECLARE @geografik1 geography;
DECLARE @geografik2 geography;
DECLARE @sonuc geography; 

SELECT @geografik1 = Kolon1 FROM UzaysalVeriler WHERE ID = 1;
SELECT @geografik2 = Kolon1 FROM UzaysalVeriler WHERE ID = 2;
SELECT @sonuc = @geografik1.STIntersection(@geografik2);
SELECT
@sonuc.STAsText();





Bu makalemizde SQL Server 2008 ‘in yeni tiplerinden olan Uzaysal Veri Tiplerini (GEOMETRY ve GEOGRAPHY) ve kullandığı fonksiyonlarını,örnek sorgularla  inceledik.Bu makaleye bağlı makalelerde SQL Server 2008 ile gelen yeni veri tiplerini incelemeye devam edeceğiz

 

Başka bir Microsoft SQL Server 2008 makalesinde görüşmek dileğiyle...

Bilgehan Gürünlü

www.gurunlu.com
bilgehan@gurunlu.com

Kaynaklar :

-http://msdn.microsoft.com/en-us/library/
-Accelerated  SQL Server 2008
-Programming Microsoft® SQL Server  2008 (Ms-Press)