Koordinat Dönüşüm Fonksiyonları

Ne?

İlgilendiğimiz koordinat sistemleri, dünya yüzeyindeki herhangi bir noktayı karışıklığa mahal vermeden tarif etmeye yarar. Koordinat sistemi denildiğinde akla gelen ilk sistem x-y koordinatları olarak da hatırlanan bir 2 boyutlu dik koordinat sistemi olan kartezyen koordinat sistemidir.

Peki bahsettiğimiz gibi eğer bir koordinat sistemi karışıklığa mahal vermeden bir noktayı tarif edebiliyorsa farklı koordinat sistemlerine ne gerek var sorusu akla gelebilir, gelmelidir. Farklı koordinat sistemlerine olan ihtiyaç tamamen kullanım yeri ve kullanım kolaylığı ile ilgilidir.

Nedir?

İlgilendiğimiz koordinat sistemlerinden bahsetmeden önce harita yapımının bir aşaması olan izdüşüm (projection) almaktan bahsetmekte fayda var.

İzdüşüm Nedir?

En basit haliyle izdüşüm, bir noktanın bir yüzey üzerine düşen izidir. Biraz detaylandırırsak belli bir merkezden gelip bir noktadan veya bir noktalar kümesinin her bir noktasından geçen doğruların izdüşüm tarafından tanımlanmış olan yüzeyi kestiği noktaların geometrik yeridir diyebiliriz.

Bu biraz karışık olduysa merkezde bir ışık kaynağı olduğunu ve izdüşüm yüzeyinin bizim istediğimiz şekilde bir perde olduğunu düşünün. İzdüşümünü almak istediğimiz noktaları ışık kaynağı ile perde arasına koyarsak, perde üzerinde izdüşümünü elde ederiz.

Bizim ilgilendiğimiz izdüşümü, dünyanın (noktalar) üzerinde geçirilmiş bir silindire (perde), dünyanın merkezinden (ışık kaynağı) olan izdüşümüdür.

Mercator İzdüşümü

Türkiye’de de tapu, ruhsat, askeri ve benzeri alanlarda en çok kullanılan koordinat sistemi UTM şeklinde kısaltılan Universal Transverse Mercator (Evrensel “Uzun eksene dik” Mercator) sistemidir.

Transverse Mercator

Transverse Mercator

KorTransLib

Koordinat Dönüşüm Kütüphanesinin yazılış amacı ileride düşünülen projelerde kullanılmak üzere olduğundan sadece 6 derece dilimli UTM, enlem-boylam ve derece-dakika-saniye olmak üzere üç adet koordinat sınıfı olmakla beraber istenilen koordinat sistemleri kolaylıkla eklenebilecek şekilde tasarlanmıştır.

Coordinate Sınıfı ve Türetilmiş Sınıfları

Coordinate Sınıfı ve Türetilmiş Sınıfları

Koordinat Sınıfları

  • DecimalDegreeCoordinate
  • DegreeMinuteSecondCoordinate
  • UTMCoordinate

DECIMALDEGREECOORDINATE

Ondalık dereceli gösterim. Matematiksel hesap yaparken kolaylıkla kullanılır.

DEGREEMINUTESECONDCOORDINATE

Derece, dakika, saniye sisteminde gösterim.

UTMCOORDINATE

6 derecelik dilimli Universal Transverse Sekant Mercator izdüşüm sistemindeki koordinatlar. UTM koordinat sisteminde sağa ve yukarı değerden başka dilim bölgesi (UTM Zone) değeri de vardır. Bu değer sağa ve yukarı değerlerinin anlamını tanımlar. Türkiye’nin UTM dilimleri aşağıda gösterilmiştir.

Türkiye UTM Dilimleri

Türkiye UTM Dilimleri

Koordinatlar Sınıfları Arasında Matematiksel İşlemler

Örnek olarak herhangi iki koordinatın orta noktasının bulunmasını aşağıdaki şekilde yapabilmemiz için kullanılan TypeConverter sınıfı, kodun yazılmasında da kullanılmasında da büyük kolaylık sağlamıştır.

DecimalDegreeCoordinate dd = new DecimalDegreeCoordinate(38.4, 28.1);
UTMCoordinate utm = new UTMCoordinate("35T", 663890, 4568130);

DegreeMinuteSecondCoordinate dmsSonuc = new DegreeMinuteSecondCoordinate();

TypeConverter corcon = TypeDescriptor.GetConverter(typeof(DegreeMinuteSecondCoordinate));
dmsSonuc = (DegreeMinuteSecondCoordinate)corcon.ConvertFrom((dd + utm) / 2);

Yukarıda gösterildiği gibi koordinat dönüşüm işlemi sadece bir değişkene atama yapılmadan önce yapılıyor.

İki koordinatın ortalaması, karşılıklı iki köşe koordinatı bilinen bir paftanın merkezini bulurken kullanılabilir.

TypeConverter Kullanımı

  1. System.ComponentModel içerisindeki TypeConverter sınıfı miras alınarak CanConvertFrom, ConvertFrom, CanConvertTo, ConvertTo fonksiyonları yazılır.
  2. Yaratılan TypeConverter mirasçısı sınıfının hangi tipi dönüştürdüğü Nitelik(Attribute) sınıfları kullanılarak tanımlanır.
  3. TypeDescriptor sınıfı yardımı ile kullanılır.
public static Coordinate operator +(Coordinate c1, Coordinate c2)
{
  DecimalDegreeCoordinate dd1 = (DecimalDegreeCoordinate)TypeDescriptor.GetConverter(c1).ConvertTo(c1, typeof(DecimalDegreeCoordinate));
  DecimalDegreeCoordinate dd2 = (DecimalDegreeCoordinate)TypeDescriptor.GetConverter(c2).ConvertTo(c2, typeof(DecimalDegreeCoordinate));
  
  return new DecimalDegreeCoordinate(dd1.lat + dd2.lat, dd1.lon + dd2.lon);
}