Bu dönem İleri Veri Tabanı dersinde Spatial Types öğreniyoruz. Peki nedir bu Spatial Types?

Gayrimenkul sektörünü düşünelim. Mesela siz Çanakkale’de ev,arsa satıp kiralayan bir şirketsiniz ve müşteriler size gelip diyor ki “Ben Sarı Çay’a yakın satılık bir ev istiyorum.”. Sarı Çay’a yakın olan tüm satılık evleri akılda tutacak değilsiniz, mutlaka bir veritabanında bu bilgileri tutarak müşteriden gelen isteği sorgulatmanız gerekli. İşte burdaki ev, arsa gibi yerlerin konumlarını veri tabanında tutma işleminde Spatial Types kavramı önemli bir yer tutuyor.

Spatial Type‘lar bize konum bilgilerini veri tabanında tutmamıza olanak sağlıyor. Konum, ister tek bir nokta olsun ister geniş bir alan olsun isterseniz de çizgi olsun. Bu üç tipi de veri tabanında kolaylıkla tutabiliyoruz.

Spatial Types kullanımını MySql(Linux işletim sisteminde) ortamında başta bahsettiğim gayrimenkul örneği üzerinden nasıl kullanıldığını anlatacağım.

Spatial Type‘lar MySql 5.x versiyonunda gelmiştir. POINT , LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGN, GEOMETRY Spatial Type‘ları bulunmaktadır.

Öncelikle veri tabanımızın nasıl olacağını düşünelim. Gayrimenkul adında bir veri tabanı, onun da musteriler, evler, arsaTarla, yerler(İldeki önemli mekanları tutmak için) adlarında tabloları olmalıdır.

Konsolumuzu açalım ve

yazarak mysql‘e bağlanalım. Şimdi de gayrimenkul adında veri tabanımızı oluşturalım :

gayrimenkul veri tabanı üzerinde tablolarımızı oluşturacağımız için işlem yapacağımız veri tabanını seçmemiz gerekiyor. Şu şekilde gayrimenkul veri tabanına geçiyoruz :

Artık tablolarımızı oluşturabiliriz. Öncelikle musteriler tablomuzu oluşturalım. Müsteri tablomuzun tc, ad, soyad, telefon ve konumuz olan adresini tutmak için adres isminde sütunları olsun. Bunu da şu şekilde oluşturuyoruz :

adres sütununu Point olarak belirttik. Çünkü ev veya bulunulan yer tek bir nokta yani Point olarak kabul edilir.

Evler tablomuzu da şu şekilde oluşturalım :

evinNoktasi sütunu bize evin bulunduğu noktayı verecek.

arsaTarla tablomuz da şöyle olsun :

Arsa veya tarla bir sürü noktanın birleşiminden oluşan geniş bölgedir. Bu şekildeki yapıların konumları da Polygon adı verilen Spatial Type ile tutulmaktadır. Polygon‘un başlangıç ve bitiş noktası aynı olmak zorundadır. Ki zaten geniş bir alanı düşündüğümüzde her ne kadar değişik geometrik yapıda da olsalar başlangıç ve bitiş noktaları aynı oluyor.

Şimdi de Çanakkale’deki bazı bilindik yerleri tutmak için yerler tablomuzu oluşturalım :

yerler tablosuna ekleyeceğimiz veriler Point, LineString veya Polygon olabileceğinden Geometry Spatial Type‘ı kullanıldı. Hangisi olacağı ayrımını tabloya veri eklerken belirtilecektir.

Veri tabanını ve tablolarını oluşturduğumuza göre şimdi örnek olması adına birer örnek girelim.

“Tabloları oluşturduk ama konumları nereden bulacağız?” diye sorabilirsiniz. Bunun için 2 yöntem var. Birincisi işletim sisteminize uygun Google Earth‘i indirerek konum bulabilirsiniz (Daha çok Polygon için kullanışlı.). İkincisi şuradan konum almak istediğiniz yeri bularak işleminizi halledebilirsiniz. Ben ikinci yöntemden yapacağım.

İlk olarak musteriler tablomuza veri ekleyelim. Müşteri konumunu Point olarak belirttiğimiz için tek bir nokta girmemiz gerekiyor adres sütununa. Şu şekilde yapıyoruz :

evler tablomuzda da Point türünden konum girileceği için musteri tablosunda yaptığımız veri girişi gibi olacaktır.

Şimdi yerler tablosundaki adres sütununa Polygon veri girişi nasıl oluyor ona bakalım :

Polygon Spatial Type‘ının başlangıç ve bitiş noktası aynı olacağından bahsetmiştik. Eğer aynı girilmez ise hata ile karşılaşılır. Bir diğer dikkat edilmesi gereken ise; POLYGON() içerisinde yeniden parantez açılmasaydı hata alınacaktı.

Yine yerler tablosunda LineString veri girişi nasıl olduğunu görelim :

Sarı Çay’ın başlangıç ve bitiş noktası aynı olmayıp bir çizgi gibi olduğu için LineString Spatial Type‘ı ile gösterilmiştir.

arsaTarla tablosuna da bir veri girişi yapalım :

Veri girişlerini sorunsuz bir şekilde yaptığımıza göre artık sorgu yazabiliriz.

İlk başta verilerimizin veri tabanında nasıl göründüğünü görelim. En basit sorgumuzu yazalım :

10_1

Görüldüğü üzere kötü bir görüntü çıkıyor evinNoktasi‘nda. evinNoktasi bilgisini daha güzel bir şekilde görelim yani text olarak :

11_1

AsText() fonksiyonu konumu text şeklinde göstermektedir. Şimdi daha güzel görünüyor adresler. 🙂

Biraz sorguları karmaşıklaştırarak ‘Sarı Çay’a en yakın olan müşteriler kimlerdir?’ diye bir sorgu yazalım :

3_1

Buradaki ST_Distance(a,b) fonsiyonu, iki adres arasındaki en yakın mesafeyi vermektedir. ST_Distance(a,b) veya Distance(a,b) şeklinde kullanılabiliyor. Bizde bu sorgumuzda Sarı Çay’a en yakın olan müşterileri arıyorduk ve bize istediğimiz sonucu doğru bir şekilde verdi.

Bir diğer sorgumuz ‘İsmetpaşa mahallesinde 3.kattaki satılık evler hangileridir?’ olsun :

4_1

Şimdi alan görebileceğimiz ‘Anadolu Hastanesi’ne en yakın satılık arsa hangisidir?’ sorgusunu yazalım :

5_1

Evet farkedileceği üzere Area(a) fonksiyonu ise parametre Polygon alarak alanını geriye döndürmektedir. ST_Area(a) veya Area(a) olarak iki farklı kullanım şekli vardır.

Bu örnekler ihtiyaca göre daha da çoğaltılabilir. Şimdi de bazı işe yarayabilecek fonksiyonlardan bahsedelim.

-> X(a.konum) fonksiyonu adresin longitude yani boylamını geri döndürür.

-> Y(a.konum) fonksiyonu adresin latitude yani enlemini geri döndürür.

12_1

-> ST_Intersects(a.konum,b.konum) fonksiyonu iki konum kesişiyor ise 1, kesişmiyor ise 0 geri döndürmektedir.

-> ST_Equals(a.konum,b.konum) fonksiyonu iki konum aynı ise 1, konumlar farklı ise 0 geri döndürmektedir.

-> ST_Within(a.konum,b.konum) fonksiyonu a konumu b konumunun içerisinde ise 1, değilse 0 geri döndürmektedir.

-> GLength(a.konum) fonksiyonu LINESTRING veya MULTILINESTRING verilerin uzunluğunu geri döndürmektedir.

->StartPoint(a.konum) fonksiyonu konumun başlangıç noktasını geri döndürmektedir.

Daha bir çok bilgiyi MySqlin web sayfasından bulabilirsiniz. İyi çalışmalar. 🙂

1796 Total Views 3 Views Today
Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedIn